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

Mir*_*ral 45 git merge git-squash

我正在开发一个功能分支.

  1. 做了几个提交.压缩提交.
  2. 推送更改远程分支.有冲突.
  3. 合并来自主要的更改,已解决的功能分支上的冲突.(git fetch origin master> git merge FETCH_HEAD>手动解决冲突> git commit> git push)
  4. 我做了一个提交.

因此,当前的提交历史记录如下所示.从现在到旧:

  1. 提交3
  2. 承诺M yyy(合并)
  3. 提交2

在将我的功能分支合并到主控之前,如何将3个提交压缩为1?

Aur*_*eau 210

假设功能分支被调用feature并且主分支main

从以下位置创建临时分支main

git checkout -b temp main
Run Code Online (Sandbox Code Playgroud)

将分支压feature入:

git merge --squash feature
Run Code Online (Sandbox Code Playgroud)

提交更改(提交消息包含所有压缩的提交消息):

git commit
Run Code Online (Sandbox Code Playgroud)

返回分支feature并将其指向temp分支:

git checkout feature
git reset --hard temp
Run Code Online (Sandbox Code Playgroud)

删除临时分支:

git branch -d temp
Run Code Online (Sandbox Code Playgroud)

  • ...最后还有“git push --force” (21认同)
  • 为了完成,“git push --force-with-lease”应该始终优先于“git push --force”。[原因如下](/sf/answers/3697676881/)。 (4认同)
  • 这太完美了,我想知道为什么你不必以这种方式解决冲突 (2认同)

Kri*_*ján 26

您可以rebase -icommit 2父级开始(即master,您从中分支的提交.当您进入合并提交时,您可能不得不重新解决冲突.

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

  * D commit 3 (HEAD)
  * M merge
 /|
| * C commit 2
* | B commit on master
|/
* A (master)
Run Code Online (Sandbox Code Playgroud)

从开始git rebase -i A.你会看到所有提交的名单既包括masteryour_branch,但不合并提交.pick第一个(B或者C,取决于时间)和squash其余的.

  • 发生了另一种可能让你感兴趣的方式:`git rebase --preserve-merges origin/master`来自/sf/ask/334851961/ (4认同)
  • 绝对,请查看[本文](https://www.atlassian.com/git/tutorials/merging-vs-rebasing/workflow-walkthrough),如果您有特定问题,请再次评论。 (3认同)
  • 再看一遍(和一个玩具仓库一起玩),看起来`git rebase -i master`应该也可以正常工作,并且不会在`squash`中包含`master`提交。那是你以前尝试过的吗?怎么了? (2认同)

she*_*run 12

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

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

只需要合并master分支,然后运行squashing命令:

git merge master
git squash master
Run Code Online (Sandbox Code Playgroud)

  • 这是我书中的赢家。但是,如果您还可以包含您在此处执行的命令/过程并解释它的作用,那就太好了。当你查看代码时,它确实非常简单,但如果能把它放在这里就好了:) (3认同)

小智 6

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

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

git checkout -b work-squashed `git merge-base main work`
Run Code Online (Sandbox Code Playgroud)

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

git diff work-squashed...work | patch -p1
Run Code Online (Sandbox Code Playgroud)

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

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