2014-01-25 88 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不添加我的空資產文件夾,所有路徑都導致我缺乏對此的支持。 –

相關問題