为什么我不能将提交合并为一个?

时间:2014-01-25 16:31:24

标签: git git-rebase git-commit

确定。我最终试图找出为什么我不能将两个提交合并为一个。 Git非常复杂。我有一系列在本地和远程看起来像这样的提交:

commit 6abb264c06b06d42ea7e07a469107b9d3d72dffa
Author: XXXX <xxx@xxxx.xxx>
Date:   Thu Jan 23 15:59:03 2014 -0500

   First Check-in again (forgot to add project file and forgot to tick off append to last commit)


commit 90b2468f5267a471d52f2d7cc7cb1cd8604b3b86
Author: XXXX <xxx@xxxx.xxx>
Date:   Wed Jan 22 22:57:20 2014 -0500

   First check-in 

我想将它们组合在一起,看起来像这样:

commit 90b2468f5267a471d52f2d7cc7cb1cd8604b3b86
Author: XXXX <xxx@xxxx.xxx>
Date:   Wed Jan 22 22:57:20 2014 -0500

   First check-in 

我尝试使用pick,squash和任何可用的葫芦命名无效。它告诉我它已经压缩/合并/挑选了什么,但我总是看到两个提交而不是一个。

也无法弄清楚挑选和壁球之间有什么区别。另外,我无法分辨提交和分支之间的区别。而且,我读到一个分支只是一个提交,但为什么我们必须合并分支但是选择/压缩(??)提交?这非常令人困惑。

1 个答案:

答案 0 :(得分:5)

你在git的同时绊倒了一堆轻微的烦恼。这实际上是一个好兆头。 : - )

首先,rebase在“重新定位”root提交时遇到问题。在合理的现代版本中,您可以使用git rebase -i --root执行此操作,这将允许您将第二次提交压缩或修复到第一次(根)提交。你需要--root个参数。 (较旧版本的git缺少--root并使这更加困难。)

下一步:

  

pick和squash之间有什么区别

在交互式rebase中,pick表示“按原样提交”,squash表示“在上一次提交时添加此提交”。 squashfixup之间没有根本区别,除了前者为您提供编辑提交消息的机会,后者只需将“fixup”作为树更改(丢弃提交消息文本)完全)。

  

提交和分支之间的区别

提交是存储库中的实际对象。 “分支”是一个含糊不清的术语,有时意味着“分支标签” - 它只是对提交的引用,或者等效地,是单个提交的名称 - 有时意味着由系列形成的数据结构与他们的父母一起提交。

据说,对于 X 的许多不同值,“当你理解 X ”时,“git更有意义”。这概括为“一旦你理解了git,git会更有意义。” :-)这实际上不仅仅是同义反复的意义,但对你的帮助并没有多大帮助!幸运的是this web series非常有帮助(在我看来)。仔细阅读这一切,以及“分支”含糊不清的方式,但通常显而易见的是某人的意思,可能会更有意义。


编辑:示例会话:

$ cd /tmp/trepo
$ git init
Initialized empty Git repository in /tmp/trepo/.git/
$ echo data > somefile; git add somefile; git commit -m 'first check in'
[master (root-commit) 64a2d9f] first check in
 1 file changed, 1 insertion(+)
 create mode 100644 somefile
$ echo other > another-file; git add another-file
$ git commit -m 'combine with first check in'
[master d375b81] combine with first check in
 1 file changed, 1 insertion(+)
 create mode 100644 another-file
$ git rebase -i --root
[in editor, change second line from "pick" to "fixup"; write and quit]
".git/rebase-merge/git-rebase-todo" 20L, 667C written
[detached HEAD 5b2a979] first check in
 2 files changed, 2 insertions(+)
 create mode 100644 another-file
 create mode 100644 somefile
Successfully rebased and updated refs/heads/master.
$ git log --oneline
5b2a979 first check in

注意另一个小的git刺激:git log显示按从旧到旧的顺序提交,但git rebase -i按旧到新的顺序显示。

并且:如果您push编辑,则远程具有提交,而不是新提交。所以你会看到两个旧的,可以通过origin/master(假设遥控器被命名为origin而你正在使用通常的设置)和(单个)新的一个,这是可通过master访问。你必须让远程仓库采用新的master,例如,通过git push -f(及其所有后果......)。