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

问题描述 投票:0回答:2

假设我遇到这种情况,其中

branch1
是从
master
创建的。在
branch1
上进行了几次提交之后,我还创建了另一个名为
branch2
的分支。此后,其他人在
master
中犯了(D)。现在我想用
branch1
重新设置
master
的基础。但是
branch2
呢,因为
branch1
的哈希值已被重写,现在
branch2
丢失了。

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

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

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

branch2:                 G - H             

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

git github version-control rebase branching-and-merging
2个回答
5
投票

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

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

提交

E
F
未移动,但创建了提交的副本。
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 版本,并且必须执行此操作,而不是重新定基分支 1:它将重新定基所有提交,同时将引用(例如分支)移动到新的重新定基提交。

0
投票

在 master 上重新建立分支 1 的基础后,您仍然可以在更新的分支 1 之上重新建立分支 2 的基础。 关键是使用git的reflog来定位branch2中丢失的提交(H),然后将其应用到新的branch1之上。

在 master 之上重新建立分支 1:

git checkout 分支1

git rebase master

这将在 D 之上重播提交 E 和 F:

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

现在,让我们恢复branch2。 Git 的 reflog 会跟踪引用及其之前的状态,包括重写之前的分支。您可以使用 reflog 来查找

提交branch2的哈希值(H):

git reflog 分支2

这将显示branch2先前位置的列表及其相应的提交哈希值。查找指向提交 H 的提交哈希。

在提交H处创建一个新分支

git checkout -bbranch2_new

现在您已将branch2恢复为branch2_new:

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

如果branch2_new是您想要的branch2的更新版本,您现在可以删除旧的branch2并重命名branch2_new:

#git 分支 -d 分支2 #git分支-m分支2_新分支2

现在branch2已经更新,基于最新的branch1。

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

请记住,变基可能会导致混乱和潜在的冲突,特别是当多个开发人员在同一分支上工作时。与您的团队沟通至关重要,以确保变基过程顺利进行并避免干扰其他人的工作。此外,通常最好只对功能分支(如branch1和branch2)进行rebase,并避免对主master分支进行rebase,因为它被认为是共享且稳定的分支。

© www.soinside.com 2019 - 2024. All rights reserved.