有没有一种方法来配置git,从而git rebase --continue跳过了“没有变化”的测试?
我不想git rebase --continue失败,因为它没有检测到任何变化。发生这种情况时,它应该自动删除提交。
为什么?
我经常遇到 git 的问题,我git rebase --continue失败了,因为它没有看到任何变化并且需要我说git rebase --skip. 我理解为什么会发生这种情况,但它会减慢我的工作流程并使其变得更加危险:如果我正在执行一个问题多次重复出现的大型变基,以及合法的合并冲突,我更有可能不小心使用跳过命令从我打算重用 continue 命令时的历史来看。
例子
假设我有以下历史记录:
A -- B -- C -- D -- E -- F <-- topic
\
H -- I <-- master
Run Code Online (Sandbox Code Playgroud)
我想将提交 B、C、E 和 F 推送到origin.
假设当我挑选它们时,B 工作正常,C 和 F 有一些由提交 H 和 I 引起的微不足道的合并冲突,并且 E 有一个非微不足道的合并冲突,如果 H 和 I 在历史中,则需要以不同的方式解决如果 D 在历史中。解决这些冲突后,假设我的历史是:
A -- B -- C -- D -- E -- F <-- topic
\
H -- I -- B -- C' -- E'' -- F' <-- master
Run Code Online (Sandbox Code Playgroud)
现在,我想将我的topic分支变基到master. 这样做时,B 将被自动删除,但我会遇到 C、E 和 F 的合并冲突,因为它们在被挑选时已被修改。当 rebase 在 C 处暂停时,解决冲突不会导致任何净变化,因此git当我尝试运行时会防御并抱怨git rebase --continue:
No changes - did you forget to use 'git add'?
Run Code Online (Sandbox Code Playgroud)
解决办法是git rebase --skip改用。那时,E 会发生冲突;解决它需要实际更改,所以我实际上(并成功)使用git rebase --continue. 然后,F 产生另一个虚假的合并冲突。与 C 一样,解决该冲突不会导致任何净更改,因此我再次被告知在尝试继续时使用跳过模式。
我想进行配置,git以便当我解决合并冲突(尤其是 with mergetool)并且解决方案不会导致任何净更改时,我git rebase --continue只想做 的工作git rebase --skip,最多提示我。如果它不够聪明知道我运行了合并工具,我更喜欢它总是自动跳过。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>...
Run Code Online (Sandbox Code Playgroud)
有趣的问题。此处使用 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
Run Code Online (Sandbox Code Playgroud)
或者,您可以向 .gitconfig 添加别名:
[alias]
reb = "!if git diff-index --quiet HEAD --; then git rebase --skip; else git rebase --continue; fi"
Run Code Online (Sandbox Code Playgroud)