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
部分。因此,我们和他们的版本从中分离出来的合并基本代码是不可见的,这有时会使冲突变得非常难以理解。但这完全是个人品味问题。
出于某种原因,每次我尝试使用 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
部分。因此,我们和他们的版本从中分离出来的合并基本代码是不可见的,这有时会使冲突变得非常难以理解。但这完全是个人品味问题。