gpt4 book ai didi

git - 撤消 Git merge ,但保留后来的更改,并重写历史记录

转载 作者:太空狗 更新时间:2023-10-29 12:53:06 25 4
gpt4 key购买 nike

我有一堆分支,每个分支都有不同的功能。通常我会有一些额外的分支“not_master”,其中包含 master+feature A,如下所示:

(not_master)     a--b--c--d--e---M--x--y--z
(feature A) --h--i--j-/

有时我想取消 merge 功能 A,但在“not_master”中保留提交 x,y,z

换句话说,我想要这样:

(not_master)     a--b--c--d--e--x--y--z

我看到我可以做一个 git revert -m 1 M ,它会在最后添加一个提交来恢复我的更改,但我真的不想这样做,因为这些提交避风港尚未发布,因此添加更多提交会使历史更难阅读。

其他人建议只执行 git reset --hard M,但这会转储 x,y,z 的更改。我只是在以完全错误的方式思考这个问题吗?我应该只 git reset --hard M 和 cherry pick x,y,z 吗?

最佳答案

git rebase会做你想做的。 git rebase -i <commit e>应该工作:它会打开一个编辑器,你删除 merge 提交并保存。

您还应该能够直接指定将 x..z rebase 到 e,但是整理命令行的语义有点麻烦。如果我正确阅读手册页,它应该是 git rebase --onto <commit e> <commit M> not_master .

编辑:经过测试并且似乎有效:

mkdir foo; cd foo
git init
touch initial
git add initial
git commit -m 'initial'
git checkout -b topic
touch topic
git add topic
git commit -m 'topic'
git checkout master
touch master
git add master
git commit -m 'master'
git tag pre_merge
git merge topic
git tag merge
touch post_topic
git add post_topic
git commit -m 'post topic'
git rebase --onto pre_merge merge master

历史上的结果

initial -- master -- post topic  (master)
\
\-- topic (topic)

关于git - 撤消 Git merge ,但保留后来的更改,并重写历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com