Git rebase 持续删除更改

Git rebase consistently deletes changes

出于某种原因,每次我尝试使用 rebase 时,它​​最终都会丢弃我所有的功能分支提交。以下是 master 上的交互式变基显示的示例:

pick 05973319 First commit
pick 62341efd Second commit 
pick e1c1a080 Third commit
pick 2b5285f7 Fourth commit

请注意,所有这些提交都是在功能分支上进行的。现在,当我退出交互模式时,rebase 由于冲突而失败。但是,$ git log 不显示任何功能分支提交。如果我查看我在功能分支中修改的文件,所有这些更改都被丢弃了。

每当我在多个存储库上使用 rebase 时,这似乎都会发生在我身上。在其他不存在冲突的情况下,Git 会简单地删除我的所有更改并表明没有任何问题。

我不明白这种解决冲突的方式是如何被接受的。是否存在某种可能导致这种情况的错误配置或反模式?请注意,与 $ git merge master 合并始终按预期工作。

... Now when I exit interactive mode, the rebase fails due to conflicts.

还没有失败。在应用零个或多个 pick 命令后,它 已停止

git status 命令,在任何现代 Git 中,都会告诉您此时您处于尚未完成的交互式 rebase 中。 (在糟糕的过去 git status 不会告诉你这些事情,你只需要知道或猜测。)

$ git log does not show any of the feature branch commits.

这表明问题发生在第一个 cherry-pick 期间,因此 none 被选中的提交仍在进行中,正在构建分支。也就是说,到目前为止,您的四个 pick 中有零个成功。 pick 05973319 正在进行中,git status 会告诉您哪些文件需要手动修复,在 Git 让您一团糟之后。

你的工作是修复它们——也许使用你工作树中留下的混乱,也许使用 git mergetool 和一些最喜欢的合并工具;方法由你决定。但是必须解决问题。修复它们后,运行 git add 如有必要,1 你的 git status 会告诉你所有冲突都已修复,你应该 运行 git rebase --continue 使 rebase 最终确定樱桃选择并继续下一个。下一个可能有也可能没有冲突。如果没有,Git 将自行完成 pick 并继续进行第三个,否则整个过程将重复。

这种变基行为是正常的,但它的常见程度取决于您的工作模式和输入文件。有些人经常遇到,有些人几乎从来没有。


1如果您使用 git mergetool,它通常会为您执行适当的 git add。我更愿意避免 git mergetool:我将 merge.conflictStyle 设置为 diff3,通常情况下,只需使用我的编辑器来处理工作树中留下的混乱。设置 diff3 样式会更改标记的冲突以包含 first 或合并基础输入。默认样式仅保留 second--our 和第三 --theirs 部分。因此,我们和他们的版本从中分离出来的合并基本代码是不可见的,这有时会使冲突变得非常难以理解。但这完全是个人品味问题。