2014-09-20 67 views
6

據我瞭解,修訂舊的GIT提交的正確方法是使用rebase --interactive,但只是爲了獲得清晰的概念,我想知道,當我做GIT提交--amend在分離的頭狀態

會發生什麼
  • git checkout <commit>
  • 改變的東西在一個文件中
  • 更改的文件添加到索引
  • 然後git commit . --amend

當我這樣做時,它不是修改提交,而是從同一提交的PARENT分支出新的提交。

這只是GIT的方式告訴我,我不能修改已經有子提交的提交?

回答

15

在Git中,一旦創建了一個提交,它就成了石頭;你不能改變它。所有你能做的就是創建一個類似它的新提交(通過修改它,櫻桃採摘等)

我理解你的困惑:「修改」有點誤用,有點誤導,因爲它表明修改了某些東西。在Git中,修改提交實際上涉及創建一個全新的提交,它具有與原提交相同的父代。

舉個例子,讓我們假設,運行git checkout B後,你在下面的情況:

enter image description here

(你HEAD被分離,但這是題外話),無論你製作和舞臺的變化,運行git commit --amend將讓你在這種情況下:

enter image description here

提交D可能與B非常非常相似;特別是它可能有完全相同的補丁,與B等完全相同的提交消息。但是,(commit,author)時間戳通常會有所不同(unless you can amend a commit under a second!),這意味着D的SHA-1將不同於B;如果兩個提交不具有相同的SHA,則它們不是相同的提交。

當我們說B是父母提交的C,我們的意思是承諾C引用其SHA提交B。 但是,提交C無法知道任何關於提交D的SHA的任何信息,因爲在C之後提交D已創建。因此,D不能是C的父母。這就是爲什麼提交D在切線上熄滅並且沒有任何後代。


如果你要在以下國家土地,

enter image description here

其中B'甚至只能從B略有不同,你應該使用git rebase -i,不git commit --amend

+1

太棒了。謝謝!我完全錯過了這樣一個事實,即新手總是會從HEAD的父母分支出來。現在我想到它是非常有意義的。 – Chris 2014-09-20 22:00:22

相關問題