【问题标题】:Is there a way to automatically discard amended commits in a git rebase?有没有办法在 git rebase 中自动丢弃修改过的提交?
【发布时间】:2020-07-06 01:38:38
【问题描述】:

以下情况是我在使用 Git 时偶尔会发生的情况。我从线性历史开始,有两个分支。 master目前指向C。分支A是我要求同事合并到master的分支,分支B有未完成的工作我还没有公开。

 C
  \ 
   A - B

在代码审查期间,我的同事注意到分支 A 中的最后一次提交中有一个错字。我没有创建一个新的提交来修复错字,而是修改了有问题的提交并将其合并到 master 中。 Master 现在指向 A',这是更正错字的提交。

C - A'
 \
   A - B

下一步是对未完成的工作进行rebase。我希望最终结果如下所示:

C - A'
     \
      B

但是,默认情况下,Git 假定 A 和 A' 是完全不相关的提交,它会尝试这样做:

C - A'
     \
      A - B

这最终让我们想到了我的问题:

有没有办法让 git 自己弄清楚我们不需要在 rebase 中包含 A,因为 A' 已经存在?或者这是总是需要人工干预才能删除重复提交的情况之一?

【问题讨论】:

    标签: git rebase


    【解决方案1】:

    这可以通过git rebase --skip 来实现。

    C - A'
         \
          B
    

    当分支 B 重新基于 master 时,这将是你所看到的 -

    error: Failed to merge in the changes.
    hint: Use 'git am --show-current-patch' to see the failed patch
    Resolve all conflicts manually, mark them as resolved with
    "git add/rm <conflicted_files>", then run "git rebase --continue".
    You can instead skip this commit: run "git rebase --skip".
    To abort and get back to the state before "git rebase", run "git rebase --abort".
    

    然后您可以执行git rebase --skip,这将跳过提交并且 git 历史记录看起来很干净

    【讨论】:

      【解决方案2】:

      它不能满足您的要求,但在这些情况下,我已经习惯于始终使用 git rebase -i。这使您可以:

      • 首先从待办事项列表中删除A。
      • 避免创建还不是B 祖先的A' 提交。相反,您可以将错字修复提交为D:
        C
         \
          A - B - D
        
        然后在运行git rebase -i C 时,您可以重新排序待办事项列表以使D 成为A 的修复提交。然后你会得到:
        C
         \
          A' - B
        
        这是您想要的最终状态。 (如果您通过git commit --fixup A 提交D,那么在运行git rebase -i 如果git.autosquash = true 时会自动进行重新排序。)

      【讨论】:

      • 不幸的是,如果我有两个分支,一个指向 A,一个指向 B,这将无济于事。如果我对其中一个进行变基,那么另一个继续指向历史的旧版本,这将包括 A 而不是 A'。 (除非有办法同时变基两个分支......有吗?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多