我有一个历史记录,看起来有些如下
* (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
|
存储库中仍然存在于topic2merge
和topic3
之间的投入,但不再可见。如果有可见的话,它们仍然可以看到,如果有指向它们的分支机构,则会发生这种情况。甚至远程分支。
如果您已经将topic3
推到远程存储库,则必须运行git push -f origin topic3
(用遥控器的名称替换origin
),并告知您的同事您已更改历史记录的事实。他们需要知道这一点;在其存储库中,topic3
在其历史记录中仍然具有topic2merge
,而您所做的更改代表了他们的存储库不会自动进行的替代历史记录行。他们必须使用git reset --hard
或git rebase
或git cherry-pick
来保持。
您可以使用命令
git rebase -i --onto master1 master topic
这将采用topic
中但不在master
中的所有非合物提交(topic 1,topic2,topic3),并将它们应用于master1
COMPL。