撤消将功能分支重新定位到另一个功能分支
Undo rebasing feature branch onto another feature branch
我正在开发一个开发分支和两个不同的(本地)功能分支。
a -- b -- e <-- develop
\ \
\ f -- g <-- feature-branch-1
\
c -- d <-- feature-branch-2
我通过 运行
将 feature-branch-1 的更改合并到 feature-branch-2
git checkout feature-branch-2
git rebase feature-branch-1
如果我没理解错的话,现在是这样的:
a -- b -- e <-- develop
|\
| f -- g <-- feature-branch-1
\
f -- g -- c -- d <-- feature-branch-2
然而,我随后意识到我在分支 1 中引入了一个错误,我还不知道如何修复。所以这个错误现在也出现在分支 2 中,并且阻止我将 feature-branch-2 合并到 develop 中。我想回到原来的状态
a -- b -- e <-- develop
\ \
\ f -- g <-- feature-branch-1
\
c -- d <-- feature-branch-2
这样我就可以安全地将 feature-branch-2 合并到 develop 中。我怎样才能做到这一点?
查看功能分支 2
git checkout feature-branch-2
并基于从 g(feature-branch-1 的最后一次提交)开始的提交到 develop:
git rebase --onto develop feature-branch-1
请注意,feature-branch-2 将基于 e
而不是 b
,但我认为这无关紧要?如果是:在 git rebase
命令中将 develop
替换为 b
。
你有两种可能:
- 第一个也是更简单的方法是查看 reflog:
git reflog feature-branch-2
检索提交的哈希 d
。
然后通过重置撤消(如果您有未提交的更改,请在 运行 此命令之前隐藏):
git reset --hard <hash_of_commit_d>
这个解决方案等同于一个纯粹的"undo"。您将处于与变基之前完全相同的状态。另外,一个好处是,如果你在变基过程中遇到冲突,你就不必用其他方式再次解决它们。
编辑:此答案中也有描述:
- 第二个是
rebase --onto
(详见@Veger 回答)
如果你在变基后做了一些新的提交,这个解决方案会更好。但是如果你在原来的 rebase 过程中有冲突,你将不得不解决相反的问题。
在这种情况下,也许一个好的解决方案是对原始提交执行 reset
并且 仅对添加的提交执行 rebase --onto
(您将不得不创建一个临时分支来实现)
我正在开发一个开发分支和两个不同的(本地)功能分支。
a -- b -- e <-- develop
\ \
\ f -- g <-- feature-branch-1
\
c -- d <-- feature-branch-2
我通过 运行
将 feature-branch-1 的更改合并到 feature-branch-2git checkout feature-branch-2
git rebase feature-branch-1
如果我没理解错的话,现在是这样的:
a -- b -- e <-- develop
|\
| f -- g <-- feature-branch-1
\
f -- g -- c -- d <-- feature-branch-2
然而,我随后意识到我在分支 1 中引入了一个错误,我还不知道如何修复。所以这个错误现在也出现在分支 2 中,并且阻止我将 feature-branch-2 合并到 develop 中。我想回到原来的状态
a -- b -- e <-- develop
\ \
\ f -- g <-- feature-branch-1
\
c -- d <-- feature-branch-2
这样我就可以安全地将 feature-branch-2 合并到 develop 中。我怎样才能做到这一点?
查看功能分支 2
git checkout feature-branch-2
并基于从 g(feature-branch-1 的最后一次提交)开始的提交到 develop:
git rebase --onto develop feature-branch-1
请注意,feature-branch-2 将基于 e
而不是 b
,但我认为这无关紧要?如果是:在 git rebase
命令中将 develop
替换为 b
。
你有两种可能:
- 第一个也是更简单的方法是查看 reflog:
git reflog feature-branch-2
检索提交的哈希 d
。
然后通过重置撤消(如果您有未提交的更改,请在 运行 此命令之前隐藏):
git reset --hard <hash_of_commit_d>
这个解决方案等同于一个纯粹的"undo"。您将处于与变基之前完全相同的状态。另外,一个好处是,如果你在变基过程中遇到冲突,你就不必用其他方式再次解决它们。
编辑:此答案中也有描述:
- 第二个是
rebase --onto
(详见@Veger 回答)
如果你在变基后做了一些新的提交,这个解决方案会更好。但是如果你在原来的 rebase 过程中有冲突,你将不得不解决相反的问题。
在这种情况下,也许一个好的解决方案是对原始提交执行 reset
并且 仅对添加的提交执行 rebase --onto
(您将不得不创建一个临时分支来实现)