gpt4 book ai didi

git rebase --continue : how to suppress the "no changes" check

转载 作者:太空狗 更新时间:2023-10-29 13:38:18 25 4
gpt4 key购买 nike

有没有办法配置 git 以便 git rebase --continue 跳过“无变化”测试?

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

为什么?

我经常遇到 git 的问题,我 git rebase --continue 失败了,因为它看不到任何变化,需要我说 git rebase --skip。我明白为什么会发生这种情况,但它会减慢我的工作流程并使其更加危险:如果我正在做一个大型 rebase ,其中问题多次重复出现,以及合法的 merge 冲突,我更有可能不小心使用跳过命令从我打算重用 continue 命令的历史来看。

示例

假设我有以下历史:

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

我想将提交 B、C、E 和 F 推送到 origin 中的主分支。

假设当我挑选它们时,B 工作正常,C 和 F 有一些由提交 H 和 I 引起的琐碎的 merge 冲突,并且 E 有一个重要的 merge 冲突,如果 H 和 I 是在历史中比如果 D 在历史中。解决这些冲突后,假设我的历史是:

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

现在,我想将我的 topic 分支 rebase 到 master 上。这样做时,B 将被自动删除,但我会遇到 C、E 和 F 的 merge 冲突,因为它们在被挑选时被修改了。当 rebase 在 C 处暂停时,解决冲突不会产生任何净变化,因此当我尝试运行 git rebase --continue 时,git 会采取防御措施并提示:

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

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

我想配置 git 以便当我解决 merge 冲突(特别是使用 mergetool)并且解决结果没有净变化时,我想要 git rebase --continue 只做 git rebase --skip 的工作,最多提示我。如果它不够聪明,不知道我运行了 mergetool,我宁愿它总是自动跳过。 continue 选项似乎在防御不正确的 git checkout 命令 mid-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>...

最佳答案

有趣的问题。这里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

或者你可以给你的 .gitconfig 添加一个别名:

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

关于git rebase --continue : how to suppress the "no changes" check,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23955504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com