Git:在合并后的分支上工作,之后就没有了

时间:2017-10-05 13:27:17

标签: git merge rebase

我遇到以下问题: 我在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中更改的文件一个接一个地复制到另一个分支上,这是从主服务器中检出的。我认为有更好的解决方案,任何建议?

3 个答案:

答案 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

中的提交ID
BranchA

答案 1 :(得分:1)

如果使用git checkout branch-a && git rebase -i master,您将在文本编辑器中获得一个提交列表,每个提交前面都有pick命令。您可以将其更改为多个选项之一,所有选项都在给定文本中进行说明。例如,您可以skip还原提交,并且不会还原这些更改。

另一个可能的解决方案是重新定位,然后git revert提交,以恢复合并branch-a

答案 2 :(得分:1)

由于您不想触及母版的历史记录,因此您需要将更改重新应用到母版的顶部,而忽略它们已经应用并恢复的事实。根据还原提交的确切性质,我们称之为<revert>,我看到了两种方法来实现这一目标:

  1. 如果<revert> 取消您的更改,那么您可以再次还原它以获得重新应用更改的提交(请--x == x)。

  2. 如果还原提交不纯,我会这样处理:

    • 使用git format-patch为您的分支创建补丁序列。

    • 使用git am将此修补程序序列应用于master。

    关键是,git am与历史无关:它只查看当前提交的状态并将修补程序应用于该状态。