在变基之后我是否丢失了我的更改?

dav*_*ave 69 git version-control

我最近重新安排了一个我正在研究的分支机构.树的历史看起来像这样:

1 = 2 = 3 = 4
     \
      5 = 6 = 7
           \
            8
Run Code Online (Sandbox Code Playgroud)

我想将我的更改(图中的数字8)重新设置为主分支(现在在图上提交4).所以我做了以下事情:

git checkout my_branch
git rebase master
Run Code Online (Sandbox Code Playgroud)

<很多git mergetool/git rebase --skip来解决冲突>

只有现在我跑:

git checkout my_branch
git diff master
Run Code Online (Sandbox Code Playgroud)

我得到零差异.我没有丢失我的分支(我仍然可以从我保存的补丁中重新创建我的更改)但是我找不到我所做的合并/转换.我做错了什么?如果我的更改与主人合并,或者我必须再次执行此操作吗?

Joh*_*ter 162

如果您没有看到任何差异,我怀疑您丢失了更改.您可以使用它git reflog来识别rebase之前存在的分支,并用于git reset --hard <my-branch-tip-before-rebase>返回原始分支.是的,你必须再次完成这个过程.:-(

我不太确定你最终看到他们是怎么回事.我原本希望看到你给出的命令如下:

1 = 2 = 3 = 4              (master)
     \       \
      \       5' = 6' = 8' (my_branch)
       \
        5 = 6 = 7
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能应该使用rebase --onto:

git rebase --onto master <commit id for 6> my_branch
Run Code Online (Sandbox Code Playgroud)

那会让你看到一个如下图:

1 = 2 = 3 = 4              (master)
     \       \
      \       8'           (my_branch)
       \
        5 = 6 = 7
Run Code Online (Sandbox Code Playgroud)

至于丢失你的更改,它确实需要一些处理合并冲突的练习,特别是当你有几个看起来几乎相同的大块时.我总是求助于查看提交引入的实际差异,并尝试梳理该更改并以适当的方式将其与已经在分支上的内容合并.我很容易看出你的变化可能会在那里丢失.

有一点要记住.如果你不期望一堆合并冲突 - 因为你不觉得这些资源分歧不足,那么看到的是一个做错事的警示标志.通过git rebase --abort调查分支进行备份并再次检查是否存在冲突是很好的.确保记下发生冲突的地方(通常在rebase踢你到命令行之前就有一个"正在申请......").这通常是一个很好的起点.

有时,冲突是不可避免的,并且很难完成.但我怀疑在实践中,你会少遇到这个问题.

有关在分支之间移植更改的更多信息,请查看git rebase手册页.搜索"rebase --onto".第一个打击应该让你参与一个关于将更改移植到另一个分支的部分.

  • 这是一个救星. (28认同)
  • `git reset --hard xxxxx`救了我!我以为一切都丢了!即使没有`--hard`的`git reset xxxx`也行不通! (16认同)
  • reflog是胜利者 (13认同)
  • 我的天啊!你救了我!我做了一个reflog,然后是一个樱桃选择:D (8认同)
  • 我见过类似的东西.我在之前的工作中看到了它,今天又看到了它.存储库可以让某人进入一个状态,其中常规的`git rebase`(针对上游)丢失所有本地提交,并且只是将头设置为上游.而没有变化的`git rebase -i`(一切都被挑选)可以正常工作.老实说,我认为这是一种晦涩的错误. (7认同)
  • 你救了我的一天! (3认同)
  • `git reflog` +`gitcherpick` 保存了我丢失的提交。谢谢~ (3认同)
  • @deadManN 这有点过于简单化了,但是普通的 `git rebase AB` 会计算 B 中的内容,但不会计算 A 中的内容,然后将 B 中的这些额外提交放在 A 之上。它实际上是 ` 的缩写形式git rebase AB --onto A`。但是,您可以选择将这些提交放到不同的分支(而不是 A)上,因此您可以说“git rebase AB --onto C”。它仍然计算 B 中的额外提交,但不计算 A 中的额外提交,然后将它们放置到分支 C 上。在注释中解释起来有点困难,用图片更好,但我希望这有助于给你这个想法。 (2认同)