如何将连续提交对象压缩成一个?

时间:2013-05-26 20:48:10

标签: git squash

我的git对象图如下所示。我想将提交2fb14b739224adfe9252d3e7a060压缩到一次提交中。

* 650c464        (temp) adding hw2.txt
| * dd3674a      (master) added hw3
| | * 8dc0857    (FIX_REVIEW_COMMENTS) added hwa
| |/  
| * c39d943      hw2 added in master
| | *   e2a1c13  (HEAD, refs/stash, trying_to_squash) WIP on temp: 2fb14b7 hw7
| | |\  
| | | * 429b1de  index on temp: 2fb14b7 added hw7
| | |/  
| | * 2fb14b7    <-- added hw7
| | * 39224ad    <-- (another_branch) added hw3
| | * fe9252d    <-- hw2 added in master
| | * 3e7a060    <-- adding hw2.txt
| |/  
|/|   
* | ba55177      (old_fixes) added hw4
|/  
* a1ede1f        added another hello world to hw1
* 2ea750a        added hw1

以下是我的尝试(并且不明白为什么它不起作用)。

  

Q1。为什么这不会挤压?

$ git checkout 2fb14b7 -b try_to_commit
$ git merge --squash 3e7a060
 (nothing to squash)Already up-to-date.
$
  

Q2。这对我的存储库有什么作用?

$ git rebase --interactive 3e7a060
$ # I choose pick for the first commit object, and squash for the rest
$ # but somehow this complicates my repository graph even more!

1 个答案:

答案 0 :(得分:0)

从 2021 年(8 年后)更新:您将不再not use git checkout,但是 git switch

git switch -c try_to_commit 2fb14b7 
<块引用>

为什么这不挤压?

因为您要将父(过去)提交 (3e7a060) 合并到新的 2fb14b7

| | *   e2a1c13  (HEAD, refs/stash, trying_to_squash) WIP on temp: 2fb14b7 hw7
| | |\  
| | | * 429b1de  index on temp: 2fb14b7 added hw7
| | |/  
| | * 2fb14b7    <-- added hw7                   (more recent commit)
| | * 39224ad    <-- (another_branch) added hw3
| | * fe9252d    <-- hw2 added in master
| | * 3e7a060    <-- adding hw2.txt              (past old commit)

我宁愿在过去的提交上创建分支,并压缩合并最近的提交:

git switch -c try_to_commit 3e7a060
git merge --squash 2fb14b7    

这对我的存储库有什么影响?

 git rebase --interactive 3e7a060

它尝试在 3e7a060 之上重放当前分支 try_to_commit:这应该允许选择/压缩提交,但不要忘记然后在重放分支之上重放 e2a1c13。

我宁愿重新设置由 e2a1c13 而不是 3e7a060 制成的所有分支 try_to_commit,并使用 Git 2.18, Q2 2018, --rebase-merges option

git switch -c try_to_commit c39d943
git rebase --rebase-merges --interactive 3e7a060

请注意,消息 (nothing to squash)Already up-to-date 将随 git 2.32(2021 年第二季度)发生变化:信息性消息“Already up-to-date”的一些变体已被改写。

请参阅 commit ad9322dJosh Soref (jsoref)(2021 年 5 月 2 日)。
请参阅commit 80cde95Eric Sunshine (sunshineco)(2021 年 5 月 2 日)。
(2021 年 5 月 11 日于 Junio C Hamano -- gitster --commit 5feebdd 合并)

<块引用>

merge:修复交换的“最新”消息组件

合著者:Eric Sunshine
签字人:Josh Soref
签字人:Eric Sunshine

<块引用>

git-merge 中将 man(1c7b76b) 从 shell 重写为 C(“Build in merge”,2008-07-07,Git v1 .6.0-rc0 -- merge) 意外地转换了消息:

Already up-to-date. (nothing to squash)

到:

(nothing to squash)Already up-to-date.

由于相反的 printf() 参数。

尽管多年来受到以下方面的影响,但这个问题并未引起注意:

  • 7f87aff(“Teach/Fix pull/fetch -q/-v options”,2008-11-15,Git v1.6.1-rc1 -- merge
  • bacec47(“i18ngit-merge 基本消息”,2011-02-22,Git v1.7.5-rc1 -- merge
  • bef4830 切向(“i18n:合并:标记要翻译的消息”,2016 年 6 月 17 日,Git v2.10.0-rc0 -- merge 列在 {{3} }})
  • batch #5 (treewide: 更正几个 , 2017-08-23, Git v2.15.0-rc0 -- 7560f54 列在 merge 中) (treewide: 更正几个“最新”到“最新”,2017-08-23)。

通过将消息恢复到其预期顺序来修复它。