我的Git历史记录如下:
我想将紫色提交压缩为一个提交。我不想在我的提交日志中再次看到它们。
我尝试过运行git rebase -i 1
命令,但是即使1
在蓝色分支上(参见图片),我仍然看到紫色分支上的每个提交。
如何完全删除紫色分支(从提交日志中)?
我的Git历史记录如下:
我想将紫色提交压缩为一个提交。我不想在我的提交日志中再次看到它们。
我尝试过运行git rebase -i 1
命令,但是即使1
在蓝色分支上(参见图片),我仍然看到紫色分支上的每个提交。
如何完全删除紫色分支(从提交日志中)?
执行git rebase -i <分支发散之前的SHA>
命令,这将使您能够删除合并提交,日志将会是您所需的单行。您还可以删除任何不再需要的提交。如果重置失败,原因可能是您回退的版本不够早。
警告: 执行此操作将重写历史记录。对已经推送到远程仓库的更改执行此操作将导致问题。建议仅对本地提交执行此操作。
从原始状态的 repo 开始
为了删除合并提交且将分支压缩成主干上的单一提交
使用以下命令(将 5 和 1 替换为相应提交的 SHA):
git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master
保留合并提交,但将分支提交合并为一个:
使用以下命令(将5、1和C替换为相应提交的SHA):
git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master
移除合并提交并用分支中的单个提交替换它
只需执行以下操作(将5替换为相应提交的SHA):
git rebase 5 master
最后,要完全删除该分支
使用此命令(将C和D替换为相应提交的SHA):
git rebase --onto C D~ master
git rebase 5 master
的情况下,为什么不是按照 "A B C 1 2 3 4 5 D ..." 的顺序呢? - Roymaster
与5
不共有的提交,并将它们放在5
之上。位于C
的提交不是5
的祖先,而是第一个移动到5
之上的提交。 - Allen Lucegit rebase C 5; git rebase 5 master
。 - Allen Luce如果你只想要删除一个合并提交(2),使它看起来从未发生过,那么命令如下:
git rebase --onto <第1个提交的 sha> <第2个提交的 sha> <蓝色分支名>
现在紫色分支不会再出现在蓝色分支的提交记录中,你将拥有两个独立的分支。接下来,你可以单独压缩紫色分支,并进行其他任何操作,而合并提交不会再成为干扰。
git merge --squash <紫色分支名称>
。 - Tony根据您的需求,有两种方法来解决这个问题:
方法1:删除紫色提交,保留历史记录(以防需要回退)
git revert -m 1 <SHA of merge>
-m 1
指定要选择哪个父级行
紫色提交将仍然存在于历史记录中,但由于您已经还原,因此您将无法看到这些提交中的代码。
解决方案2:完全删除紫色提交(如果存储库是共享的,则会产生破坏性的更改)
git rebase -i <SHA before branching out>
并删除与紫色提交相应的行。
如果合并后没有进行提交,则此过程将较为简单。额外的提交会增加在撤销/变基时发生冲突的机会。
1-1=0
。但是,如果您然后通过变基删除紫色提交,除非您也将其变基删除,否则会留下已还原的补丁。如果您不这样做,就好像将 -1
应用于您的历史记录,而不是 0
,因此您将留下不想要的更改。 - user456814git rebase -i
,所以首先确保你对此命令非常熟悉。建议你先选择一个简单的合并提交来尝试一下。阅读待办事项文本文件中的内容,尝试追踪和跟随git将要执行的操作。一旦你有了一个好的想法,你可以开始尝试引入新的提交到合并中,将提交移动到合并之前等等。如果你需要更具体的帮助,请提供更多细节 :) - squall3d
git rebase -i <first commit sha>
命令可以消除所有合并提交记录 :) 但这只适用于没有冲突解决的仓库,且仅包含合并提交记录。 - vivekmore