2014-01-25 43 views
0

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

commit 6abb264c06b06d42ea7e07a469107b9d3d72dffa 
Author: XXXX <[email protected]> 
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 <[email protected]> 
Date: Wed Jan 22 22:57:20 2014 -0500 

    First check-in 

我想将它们汇集成相结合,看起来像这样:

commit 90b2468f5267a471d52f2d7cc7cb1cd8604b3b86 
Author: XXXX <[email protected]> 
Date: Wed Jan 22 22:57:20 2014 -0500 

    First check-in 

我试着用挑,壁球和任何葫芦变基命名命令可用无济于事。它告诉我它压扁/合并/挑选任何东西,但我总是看到两个提交而不是一个提交。

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

回答

4

你正在绊倒一堆轻微的刺激,我用git,所有在同一时间。这实际上是一个好兆头。 :-)

首先,rebase有“重新绑定”根提交的问题。在合理的现代版本中,你可以使用git rebase -i --root来做到这一点,它可以让你压缩或修复第二次提交到第一次(根)提交。你需要这个--root参数。 (GIT的老版本没有--root,使这实质上更困难。)

下一页:

有什么不同取南瓜

在一个互动变基之间,pick的意思是“取提交原样“,并且squash的意思是”在上一次提交之前添加此提交“。 squashfixup之间没有本质区别,只是前者给你一个编辑提交消息的机会,而后者只是将“fixup”作为树更改(完全抛弃提交消息文本)。

的区别是什么提交和分支

一个提交是在仓库里的一个实际的对象之间。 “分支”是一个不明确的术语,它有时候意味着“分支标签” - 它只是对提交的引用,或者等同于对单个提交的名称 - 有时意味着数据结构由以下形式组成:承诺与他们的亲子关系。

有人说是“混帐更有意义,当你理解X”,为X许多不同的值。这个概括为“一旦你理解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 log显示在新对旧秩序的承诺,但git rebase -i显示他们在新的旧到新秩序。

而且:如果你有push ed,那么遥控器有旧的提交,而不是新的提交。所以你会看到两个旧的,可以通过origin/master(假设遥控器命名为origin,你使用的是通常的设置)和(单个)新的,可以通过master到达。您必须通过git push -f(具有其所有后果...)才能使远程回购采取新的master

+0

这是我收到的最好的答案之一!我在Git中看到的一个严重问题是,您必须降低您对该工具支持的期望。像我想要做的事情应该是简单的,但也有例外。你会把你的头撞在墙上几个小时,直到你发现它不支持你想要做的事。我认为这是一个巨大的失败,因为它的复杂性隐藏了它的可用性,错误和缺乏功能。 –

+0

@ user148298:Git可以(我发现)实际上完成了大部分人想要的事情;只是它的界面几乎是以各种方式积极地“初学者 - 敌对”。例如,基础设施问题的出现是因为在其核心上,“基础设施”确实希望将新的提交*放在某个东西上,所以它不会让你“重新定位”一个不“任何东西”的根提交,因此不会让你挤压第二次提交,这被视为第一次提交。现在已经通过'--root'结尾了,但是不应该真的需要*'--root'。 – torek

+0

从技术意义上讲,它非常有意义,但从用例来看,它令人难以置信地不知所措。谈论漏洞抽象! 我在同一个盒子上运行TortoiseGit,Git Gui,VS Git Plugin,Windows Cmd Git Shell,Bash Shell和PowerShell。为什么?所以如果我不能找到如何做到这一点,我可以尝试在其他人上做。 “初学者”是一个误称,因为它隐藏了一些人从未走出初级阶段的事实。它应该被称为“被滥用的用户”。现在,我试图找出为什么Git不添加我的空资产文件夹,所有路径都导致我缺乏对此的支持。 –

相关问题