假设我遇到这种情况,其中
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?
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'
:
git rebase --onto "F'" F branch2
。适用于较旧的 Git 版本,并且可以在重新设置分支 1 的基础后执行。git rebase --update-refs master branch2
。仅适用于最新的 Git 版本,并且必须执行此操作,而不是重新定基分支 1:它将重新定基所有提交,同时将引用(例如分支)移动到新的重新定基提交。在 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,因为它被认为是共享且稳定的分支。