Git 从也已重新设置基础的分支重新设置分支的基础

C.T*_*ale 1 git version-control github rebase branching-and-merging

假设我有这种情况,是branch1master. 经过几次提交后branch1,我还创建了另一个分支,称为branch2. 此后,其他人在 中犯了 (D) 罪master。现在我想branch1master. 但是既然branch2branch1哈希值已经被重写并且现在branch2丢失了呢?

master:  A - B - C - D
                  \
branch1:           E - F
                        \
branch2:                 G - H             

Run Code Online (Sandbox Code Playgroud)

在 master 之上对分支 1 进行变基后,分支 2 就会丢失,因为变基重写了分支 1 的哈希值。

master:   A - B - C - D
                       \
branch1:                E - F

branch2:                 G - H             

Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否有正确的方法可以在branch1之上再次使用git rebasebranch2?

kni*_*ttl 5

branch2没有丢失,并且您的第二个 ASCII 艺术不正确。在对branch1进行变基之后,你的历史记录现在实际上看起来像这样:

master:   A - B - C - D
                   \   \
branch1:            \   E' - F'
                     \
branch2:               E - F - G - H             
Run Code Online (Sandbox Code Playgroud)

提交EF未移动,但创建了提交的副本。E并且F仍然与变基之前完全相同(提交一旦创建就永远无法修改)。G的父级仍然指向F,因此F必须存在。

弄清楚这一点后,让我们看一下如何进入的两个G..H答案F'

  1. git rebase --onto "F'" F branch2。适用于较旧的 Git 版本,并且可以在重新设置分支 1 的基础后执行。
  2. git rebase --update-refs master branch2。仅适用于最新的 Git 版本,并且必须执行此操作,而不是对branch1 进行变基:它将对所有提交进行变基,同时将引用(例如分支)移动到新的、变基的提交。