2010-06-22 461 views
12

任何人都可以告訴我如何克隆第一次提交?我不想刪除最近的提交,只需製作初始狀態的克隆副本,以便我可以獲取一些文件。Git:如何克隆第一次提交?

+0

一個Git倉庫可以有多個「第一提交」 – knittl 2010-06-22 12:14:00

+8

好了,你們這些傢伙,不要對第一這樣的臭承諾的事情。總是有至少一個根提交,並且存在多個提交是非常罕見的,特別是在用戶的存儲庫中提出這樣的基本問題。 – Cascabel 2010-06-22 13:39:48

回答

9

要回答我想你的意思是問這樣的問題:

你可以得到你的整個倉庫進的狀態首先與承諾:

git checkout <commit SHA1> 

大功告成瞎搞後,可以做git checkout master回到原來的位置。

而且你可以從第一個獲得單獨的文件到他們的狀態與承諾:

git checkout <commit SHA1> <file or directory> ... 

同樣,大功告成後,你可以做git checkout master <file or directory>要回原來的位置。

有沒有必要「克隆」一個提交(我認爲你的意思是克隆存儲庫,並檢查第一次提交?)。當然,如果由於某種原因你無法忍受修改倉庫中的任何文件(例如,不想讓你的版本過時),你當然可以克隆它,然後在克隆的回購中做同樣的事情。

-1

我認爲你所需要做的就是從你想要的原始提交中創建一個新的分支,檢查出來,然後合併回你正在工作的分支的頭部。

如果abcxyz ......是的,你要和你的主分支工作提交SHA1,這通常是你想要做什麼:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit 
git checkout oldskool 
#make changes 
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited) 
git checkout master 
git merge oldskool 
+0

你正在創建master的祖先,所以rebase只是快速轉發它,然後合併是一個no-op。沒有改變主人。如果你跳過rebase,合併也將是一個快進,並且再次,不改變主人。 – Cascabel 2010-06-22 15:00:51

14

我覺得我要做同樣的事。檢出初始提交,並從那裏分支。我不確定接受的答案。但我想它可以(部分)滿足原始問題。閱讀此線程後,我無論如何都與一些的bash腳本四處

git log --pretty=oneline master | tail -1 

我猜我希望會有一些這方面的commit-或樹十歲上下的參考。

因此,你可以檢出先用下面的命令提交:

git checkout `git log --pretty=oneline | tail -1 | sed 's/ .*$//'` 

2017年更新:由於'12(GIT 1.8.1),我們有一個更好的選擇:git rev-list。請參閱此處的其他答案或KyleMit at superuser以獲得更好的腳本編寫方法。

+3

如果您使用'git rev-list --all'而不是'git log --pretty = oneline master',那麼您不必解析提交消息,因爲它只返回shas。看到我的回答[使用git,我該如何回到第一次提交](http://superuser.com/a/773366/180163) – KyleMit 2014-06-25 15:54:50

11

如果通過「第一次提交」,你的意思是沒有任何父母本身的分支的父提交,那麼你想使用git-rev-list來做到這一點。只需使用

git rev-list --max-parents=0 HEAD

這將讓你的「初始提交」當前HEAD。如果列出,或使用其他任何子版本規範,請使用主文件。包裹在$(...)爲了使用表達式中的,如:

git checkout $(git rev-list --max-parents=0 HEAD)

+2

謝謝,這是覆蓋一般情況沒有中間複製/粘貼步驟。 – 2014-03-23 17:00:11

+0

謝謝修復傑西! – 2014-03-31 20:46:06