Git:如何压缩分支上的所有提交

时间:2014-08-18 05:25:40

标签: git version-control

我从master创建了一个新的分支:

git checkout -b testbranch

我做了20次提交。

现在我要压缩那20个提交。我这样做:

git rebase -i HEAD~20

如果我不知道有多少提交怎么办?有没有办法做这样的事情:

git rebase -i all on this branch

15 个答案:

答案 0 :(得分:245)

压缩所有提交的另一种方法是将索引重置为master:

 git checkout yourBranch
 git reset $(git merge-base master yourBranch)
 git add -A
 git commit -m "one commit on yourBranch"

这并不完美,因为它意味着你知道从哪个分支" yourBranch"来自。
注意:找到原始分支不是easy/possible with Gitvisual way is often the easiestseen here)。


编辑:您需要使用git push --force


Karlotcha Hoa添加in the comments

  

重置时,您可以

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 
  

[那]自动使用您当前所在的分支   如果你使用它,你也可以使用别名,因为命令不依赖于分支名称

答案 1 :(得分:85)

您正在做的事情非常容易出错。只是做:

git rebase -i master

将自动仅将您的分支机构的提交修改为当前最新的主数据。

答案 2 :(得分:62)

另一种简单的方法:转到原点分支并执行merge --squash。这个命令不会squ"蹲下"承诺。执行此操作时,将收集yourBranch的所有提交消息。

$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
 > [status 5007e77] Squashed commit of the following: ...

答案 3 :(得分:42)

签出要将所有提交压缩到一个提交的分支。让我们说它叫feature_branch

git checkout feature_branch

第1步:

使用您的本地origin/feature_branch分支对master进行软重置(根据您的需要,您也可以使用origin / master重置)。这将重置feature_branch中的所有额外提交,但不会在本地更改任何文件更改。

git reset --soft master

第2步:

将git repo目录中的所有更改添加到将要创建的新提交中。并用一条消息提交相同内容。

git add -A && git commit -m "commit message goes here"

答案 4 :(得分:19)

假设您是从主人那里分支出来的,那么您不需要一直进入重置步骤{/ p}}:

yourBranch

<强>解释

  • git checkout yourBranch git reset --soft HEAD~$(git rev-list --count HEAD ^master) git add -A git commit -m "one commit on yourBranch" 计算自从您从master,f.ex创建功能分支以来的提交。 20。
  • git rev-list --count HEAD ^master将对最近20次提交进行软重置。这会在文件中留下您的更改,但会删除提交。

<强>用法

在我的.bash_profile中,我为git reset --soft HEAD~20添加了一个别名,用一个命令执行此操作:

gisquash

重置并提交后,您需要执行# squash all commits into one alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

<强>提示

如果您使用Gitlab&gt; = 11.0,则不再需要这样做,因为它在合并分支时有squashing optionGitlab Squashing option

答案 5 :(得分:12)

基于阅读几个关于压缩的Stackoverflow问题和答案,我认为这是一个很好的一个班次来压缩分支上的所有提交:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

这假设master是基本分支。

答案 6 :(得分:4)

由于我在这里提出的解决方案遇到了一些麻烦,所以我想分享一个非常简单的解决方案(无论如何,它都有效):

git merge origin/master && git reset --soft origin/master

前面的合并cmd确保,提交时,master的最新更改不会(反过来)出现在您的头上!之后,只需提交更改并执行git push -f

答案 7 :(得分:2)

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

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

基本上,您需要致电git squash master并完成

答案 8 :(得分:2)

如果您使用基于 JetBrains 的IDE(如 IntelliJ Idea ),并通过命令行使用GUI进行预维护:

  1. 转到“版本控制”窗口(Alt + 9 / Command + 9)-“日志”标签。
  2. 在创建分支的树中选择一个点
  3. 右键单击它->将当前分支重置到此处-> 选择软键(!!!)(重要的是不要丢失更改)
  4. 在对话框窗口的底部按下“重置”按钮。

就是这样。您未提交所有更改。现在,如果您要进行新的提交,它将被压缩

答案 9 :(得分:1)

为喜欢点击的人提供的解决方案:

  1. 安装sourcetree(免费)

  2. 检查提交的外观。您最有可能与此相似 enter image description here

  3. 右键单击 parent 提交。在我们的例子中是master分支。

enter image description here

  1. 您可以通过单击按钮来压缩与前一个提交的提交。在我们的情况下,我们必须单击2次。您还可以更改提交消息 enter image description here

  2. 结果太棒了,我们准备好了! enter image description here

侧面说明:如果要将部分提交推送到远程,则必须在压扁后使用强制推送

答案 10 :(得分:1)

如果正确地执行了步骤并使用了一些精灵,那么所有的git reset,硬性,软性以及此处提到的其他所有内容都可能会起作用(对我而言不是这样)。
如果您是普通的Joe smo,请尝试以下操作:
How to use git merge --squash?


自从我发现它以来,已经使用了4次,挽救了我的生命,并将成为我的壁球。简单,干净,基本上是1条。 简而言之:


如果您在分支上,请在开发时将其称为“ my_new_feature”,并且您的拉取请求有35个提交(或很多),而您希望它是1。

A.确保您的分支是最新的,继续开发,获取最新信息,并合并和解决与“ my_new_feature”的任何冲突
(实际上,无论如何,您应该尽快采取这一步骤)

B.获得最新开发信息并分支到一个新分支,称之为 “ my_new_feature_squashed”

C。 魔术在这里。
您想将工作从“ my_new_feature”转移到“ my_new_feature_squashed”
因此,就做吧(在您创建新分支的同时,我们开发了develop):
git merge --squash my_new_feature

所有更改现在都将在新分支上,可以进行测试,然后只需执行一次单次提交,推送,该分支的新PR-并等待第二天重复。
您不喜欢编码吗? :)

答案 11 :(得分:0)

另一种解决方案是将所有提交日志保存到文件

git log> branch.log

现在branch.log将具有自开始以来的所有提交ID。向下滚动并进行第一次提交(这在终端中很困难) 使用第一次提交

git reset --soft

所有提交都将被压缩

答案 12 :(得分:0)

如前许多答案所述,

Git重置是迄今为止实现所需目标的最佳和最简单的方法。我在以下工作流程中使用它:

(在开发部门)

git fetch
git merge origin/master  #so development branch has all current changes from master
git reset origin/master  #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it

答案 13 :(得分:0)

虽然这个答案有点冗长,但它确实允许您通过与另一个分支进行一次合并来创建单个提交分支。 (没有变基/压缩/合并单个提交)。

由于我们不关心中间提交,我们可以使用一个简单的解决方案:

# Merge and resolve conflicts
git merge origin/master

# Soft reset and create a HEAD with the version you want
git reset --soft origin/master
git commit -m "Commit message"
git push origin your-branch -f

...然后删除历史记录...

# Get the most up-to-date master
git checkout master
git reset --hard

# Create a temporary branch
git checkout -b temp-branch

# Retrieve the diff between master and your-branch and commit with a single commit
git checkout origin/your-branch
git commit -m "Feature commit"

# Force push to the feature branch
git push origin temp-branch:your-branch -f

# Clean up
git checkout your-branch
git branch -D temp-branch

这一切都可以放入带有 3 个参数的 bash 函数中,例如 squashall --their master --mine your-branch --msg "Feature commit",只要您在本地拥有正确版本的文件,它就可以工作。

答案 14 :(得分:-1)

如果您对涉及另一个分支的答案没有意见,请尝试 git checkout --orphan <new_branch> 它允许我简单地将上一个分支中的所有文件作为一次提交提交。

这有点像 git merge squash 但又不太一样。