我遇到以下问题: 我在A分公司工作。 分支A合并到主分支,到目前为止一直很好。
一段时间后,客户决定撤消更改,在主分支的分支A中完成,因为必须更新。
所以Master分支的历史如下:
Some stuff
Some other stuff
Some stuff, where the merge of Branch A was reverted
Some other stuff
Some other stuff
Branch A was merged into master
The commit of Branch A (Branch A contains one Commit)
我想要改变分支A,所以我想要这样的东西:
The commit of Branch A (From here I want to continue working)
Some stuff
Some other stuff
Some stuff, where the merge of Branch A was reverted
Some other stuff
Some other stuff
Branch A was merged into master
The commit of Branch A (Branch A contains one Commit)
请注意,我不想更改远程主服务器的历史记录,我需要在我的主服务器的最后提交时提交分支A作为rebase。然后我想再次将我更新的分支A推送给Master。
现在我想继续研究分支A,但首先我要在当前主分支上重新分支A,以获得最新的状态。
现在的问题是:当我在master上重新分支我的分支A时,git似乎删除了我在分支A中所做的更改。我认为这是因为Master分支中的合并反向。所以:Git看到,分支A在主分支中被删除了,所以当我在主分支上重新分支A时,删除也将完成。
我不想将我在分支A中更改的文件一个接一个地复制到另一个分支上,这是从主服务器中检出的。我认为有更好的解决方案,任何建议?
答案 0 :(得分:1)
嗯,这有点棘手。由于HEAD
的{{1}}已经是BranchA
的一部分,因此git认为master中的代码比master
更新。在这种情况下,如果你们重置主分支中的更改而不是使用显式提交恢复它们,那会更好。
以下所有选项都涉及重写历史记录,因此请先在某个临时分支中尝试。
一个选项是使用BranchA
更改主分支,以便删除合并和恢复提交。
rebase --onto
其次是更改git rebase --onto <commit_id_before_merge_commit> <revert_merge_commit_id> master
中的提交哈希,这样git就不会像在master中那样识别它们。
BranchA
第三,您还可以使用交互式变基来更改git checkout BranchA
git reset HEAD^n # n is the number of commits that are exclusive to branchA
git add -u # Add all the files. Make sure to add newly created ones.
git commit -m 'some message'
git rebase master # should work now
BranchA
答案 1 :(得分:1)
如果使用git checkout branch-a && git rebase -i master
,您将在文本编辑器中获得一个提交列表,每个提交前面都有pick
命令。您可以将其更改为多个选项之一,所有选项都在给定文本中进行说明。例如,您可以skip
还原提交,并且不会还原这些更改。
另一个可能的解决方案是重新定位,然后git revert
提交,以恢复合并branch-a
。
答案 2 :(得分:1)
由于您不想触及母版的历史记录,因此您需要将更改重新应用到母版的顶部,而忽略它们已经应用并恢复的事实。根据还原提交的确切性质,我们称之为<revert>
,我看到了两种方法来实现这一目标:
如果<revert>
仅取消您的更改,那么您可以再次还原它以获得重新应用更改的提交(请--x == x
)。
如果还原提交不纯,我会这样处理:
使用git format-patch
为您的分支创建补丁序列。
使用git am
将此修补程序序列应用于master。
关键是,git am
与历史无关:它只查看当前提交的状态并将修补程序应用于该状态。