Git:如何压缩两者之间合并提交的提交?

时间:2015-05-09 05:53:31

标签: git merge git-squash

我正在开设一个功能分支。

  1. 做了几次提交。 Squashed提交。
  2. 推送更改远程分支。有冲突。
  3. 合并来自主要的更改,已解决的功能分支上的冲突。 (git fetch origin master> git merge FETCH_HEAD>手动解决冲突> git commit> git push)
  4. 我又多了一次。
  5. 因此,当前的提交历史记录如下所示。 从现在到现在:

    1. commit 3
    2. 提交M yyy(合并)
    3. commit 2
    4. 在将功能分支合并到主控之前,如何将3个提交压缩为1?

4 个答案:

答案 0 :(得分:21)

您可以rebase -icommit 2的父级开始(也就是您分支的master上的提交。)当您获得时,您可能需要重新解决冲突合并提交。

所以,如果你的历史看起来像

  * D commit 3 (HEAD)
  * M merge
 /|
| * C commit 2
* | B commit on master
|/
* A (master)

git rebase -i A开始。您将看到包含masteryour_branch的提交列表,但不会显示合并提交。 pick第一个BC,具体取决于时间安排)和squash其余部分。

答案 1 :(得分:3)

您可以使用我专门为此任务创建的工具:

https://github.com/sheerun/git-squash

答案 2 :(得分:0)

在我的情况下,我开始使用具有多个提交的分支,然后与main / source分支进行合并,然后进行更多提交,我想压缩所有提交,但是由于合并提交而一直出错:

错误:提交是合并,但未提供-m选项。

-> C1-> C2-> M(与源分支合并)-> C3-> C4

也许有更好的方法(我期待学习),但是经过大量阅读和反复试验后,我最终要做的是创建一个副本分支供参考,然后将当前分支还原为C1,

重置--hard(C1哈希)

然后樱桃采摘C2,C3,C4,然后压榨,然后重新定基……导致:

M-> C

(只是一个已使用源代码重新构建的提交!)

我希望这可以帮助遇到相同问题的其他人。

答案 3 :(得分:0)

我发现不必重新解决冲突的唯一方法是:

给定分支主和分支工作,执行以下步骤:

git checkout -b work-squashed `git merge-base main work`

这会从您合并到工作分支的最后一次主提交创建一个新分支。

git diff work-squashed...work | patch -p1

这会抓取并应用到工作目录中最后一次合并到工作中的主提交和工作分支的尖端之间的所有更改。 换句话说,所有工作,包括已解决的冲突。

此时你需要处理在工作分支上添加/删除的文件,因为补丁不是git。它不知道 git 正在跟踪哪些文件。因此,您需要 git add/git rm 直到所有文件都被计算在内。然后,您只需将更改提交为一次提交即可。