據我瞭解,修訂舊的GIT提交的正確方法是使用rebase --interactive
,但只是爲了獲得清晰的概念,我想知道,當我做GIT提交--amend在分離的頭狀態
git checkout <commit>
- 改變的東西在一個文件中
- 更改的文件添加到索引
- 然後
git commit . --amend
當我這樣做時,它不是修改提交,而是從同一提交的PARENT分支出新的提交。
這只是GIT的方式告訴我,我不能修改已經有子提交的提交?
據我瞭解,修訂舊的GIT提交的正確方法是使用rebase --interactive
,但只是爲了獲得清晰的概念,我想知道,當我做GIT提交--amend在分離的頭狀態
git checkout <commit>
git commit . --amend
當我這樣做時,它不是修改提交,而是從同一提交的PARENT分支出新的提交。
這只是GIT的方式告訴我,我不能修改已經有子提交的提交?
在Git中,一旦創建了一個提交,它就成了石頭;你不能改變它。所有你能做的就是創建一個類似它的新提交(通過修改它,櫻桃採摘等)
我理解你的困惑:「修改」有點誤用,有點誤導,因爲它表明修改了某些東西。在Git中,修改提交實際上涉及創建一個全新的提交,它具有與原提交相同的父代。
舉個例子,讓我們假設,運行git checkout B
後,你在下面的情況:
(你HEAD
被分離,但這是題外話),無論你製作和舞臺的變化,運行git commit --amend
將讓你在這種情況下:
提交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
在切線上熄滅並且沒有任何後代。
如果你要在以下國家土地,
其中B'
甚至只能從B
略有不同,你應該使用git rebase -i
,不git commit --amend
。
太棒了。謝謝!我完全錯過了這樣一個事實,即新手總是會從HEAD的父母分支出來。現在我想到它是非常有意義的。 – Chris 2014-09-20 22:00:22