git rebase - 继续:如何压制"没有变化"校验

时间:2014-05-30 13:13:34

标签: git

有没有办法配置git,以便git rebase --continue跳过"无变化"测试

我不希望git rebase --continue失败,因为它没有检测到任何变化。发生这种情况时,它应自动删除提交。

为什么吗

我经常遇到git问题我git rebase --continue失败,因为它看不到任何变化,需要我说git rebase --skip。我理解为什么会发生这种情况,但它会减慢我的工作流程并使其变得更加危险:如果我在多次重复发生问题的情况下进行大规模的变更,以及合法的合并冲突,我更有可能意外地当我打算重用一个continue命令时,使用历史记录中的skip命令。

示例

假设我有以下历史记录:

A -- B -- C -- D -- E -- F    <-- topic
 \
   H -- I                     <-- master

我希望将提交B,C,E和F推送到origin中的主分支。

假设当我挑选它们时,B工作正常,C和F有一些由提交H和I引起的微不足道的合并冲突,并且E有一个非平凡的合并冲突,如果H和我是,则需要以不同方式解决在历史上,如果D在历史上。解决这些冲突后,假设我的历史是:

A -- B -- C -- D -- E -- F    <-- topic
 \
   H -- I -- B -- C' -- E'' -- F'  <-- master

现在,我想将topic分支机构改为master。在这样做时,B将自动被删除,但我会得到C,E和F的合并冲突,因为它们在被挑选时被修改。当rebase在C处暂停时,解决冲突不会导致净更改,因此当我尝试运行git时,git rebase --continue将是防御性的并抱怨:

No changes - did you forget to use 'git add'?

解决方案是使用git rebase --skip代替。那时,E会发生冲突;解决它需要实际更改,所以我实际(并成功)使用git rebase --continue。然后,F产生另一个虚假的合并冲突。与C一样,解决该冲突不会导致净更改,因此我再次告诉我在尝试继续时使用跳过模式。

我想配置git,以便在我解决合并冲突(尤其是mergetool)并且解决方案没有净更改时,我想要git rebase --continue只做git rebase --skip的工作,最多促使我。我更喜欢它总是自动跳过,如果它不够聪明,知道我运行mergetool。 continue选项似乎正在防止错误的git checkout命令在rebase中;这些天我对git已经足够熟悉了,从来没有意外地在rebase中意外地改变变化。然而,当我的历史看起来像这样时,我已经接近意外地跳过了:

 git rebase            # start the rebase
 git mergetool         # apply non-trivial fix
 git rebase --continue # succeeds: non-trivial fix
 git mergetool         # apply non-trivial fix
 git rebase --continue # succeeds: non-trivial fix
 git mergetool         # apply non-trivial fix
 git rebase --continue # succeeds: non-trivial fix
 git mergetool         # nuke all changes from the topic branch
 git rebase --continue # fails: no changes
 git rebase --skip     # this should have been automatic
 git mergetool         # apply non-trivial fix (THIS MUST NOT BE SKIPPED)
 ... here I have to be careful and not just reflexively hit up-arrow twice then <ENTER>...

1 个答案:

答案 0 :(得分:3)

有趣的问题。这里Automatically skip empty commits when using git rebase用户Olivier Refalo建议使用G2中的函数,为新手使用简化的git接口。基本上,它归结为在执行git add之后检查索引中的文件内容是否与存储库中的文件不同。如果它与git rebase --continue不同,那么git rebase --skip是否相同。#!/bin/sh if git diff-index --quiet HEAD --; then git rebase --skip else git rebase --continue fi 。您可以创建执行以下操作的脚本:

[alias]
          reb = "!if git diff-index --quiet HEAD --; then git rebase --skip; else git rebase --continue; fi"

或者,您可以为.gitconfig添加别名:

{{1}}