有没有办法配置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>...
答案 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}}