git,撤消合并对重生的承诺



我有一个历史记录,看起来有些如下

  * (TOPIC) topic 3
  |
| * merge master onto topic
|/|
* | master 3
| * topic 2
* | master 2
| | 
| * topic 1
|/
* master 1
|

即。上游分支一次合并为主题。现在,我想在相同的基础上进行交互性地重现该主题分支,但是取消了合并(Merge提交本身以及合并介绍的所有人的所有承诺)。这怎么可能?

让我们使用有效的标识符对图纸中描述的提交:

  * topic3          (TOPIC) topic 3
  |
| * topic2merge     merge master onto topic
|/|
* | master3
| * topic2
* | master2
| | 
| * topic1
|/
* master1
|

如果要删除合并提交(使topic2成为merge master onto topic之后的第一个提交的唯一父母),则需要运行以下git rebase命令:

git rebase --onto topic2 topic2merge topic3

如果当前分支为 topic3,您可以从上面的命令省略 topic3(如果存在,则git rebase将其用于结帐的第一件事,如果还不是当前分支)。

此操作后,图形如下:

| * topic3      <-- (TOPIC) topic 3
| |
* | master3
| * topic2
* | master2
| | 
| * topic1
|/
* master1
|

存储库中仍然存在于topic2mergetopic3之间的投入,但不再可见。如果有可见的话,它们仍然可以看到,如果有指向它们的分支机构,则会发生这种情况。甚至远程分支。

如果您已经将topic3推到远程存储库,则必须运行git push -f origin topic3(用遥控器的名称替换origin),并告知您的同事您已更改历史记录的事实。他们需要知道这一点;在其存储库中,topic3在其历史记录中仍然具有topic2merge,而您所做的更改代表了他们的存储库不会自动进行的替代历史记录行。他们必须使用git reset --hardgit rebasegit cherry-pick来保持。

您可以使用命令

git rebase -i --onto master1 master topic

这将采用topic中但不在master中的所有非合物提交(topic 1,topic2,topic3),并将它们应用于master1 COMPL。

最新更新