2010-08-24 90 views
123

大約一個月前我克隆了一個遠程倉庫。遠程存儲庫經歷了許多變化,現在變得不穩定。現在我需要另一個版本庫,版本與我在一個月前克隆的版本相同。Git克隆特定版本的遠程倉庫

我該怎麼做?

+0

http://stackoverflow.com/questions/3489173/how-to-clone-git-repository-with-specific-revision-changeset的可能的複製 – 2013-06-12 04:28:31

回答

174

您可以將您的存儲庫「重置」爲任何您想要的提交(例如1個月前)。

使用git-reset爲:

git clone [remote_address_here] my_repo 
cd my_repo 
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT] 
+21

你沒有提到它,但這隻會重置'master'分支,該分支在克隆上默認檢出。如果'master'以外的分支是您的主開發分支,那麼必須在'git reset'之前首先檢出。 – 2010-08-24 09:53:07

+0

@Steve true! +1 – 2010-08-24 11:32:33

+10

爲什麼你不做一個簡單的結賬通緝? – nemoo 2013-05-23 10:44:32

28

使用git log找到您要回滾到修訂,並注意到提交散列。在此之後,你有2種選擇:

  1. 如果您計劃,修改後提交什麼,我建議你籤一個新的分支:如果你不git checkout -b <new_branch_name> <hash>

  2. 計劃於改版後提交任何東西,你可以簡單地籤無分支:git checkout <hash> - 注意:這將使您的資料庫中「分離的頭」狀態,這意味着它目前不依附於任何分支 - 那麼you'll have some extra work to merge new commits to an actual branch

例子:

$ git log 
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75 
Author: Jardel Weyrich <suppressed> 
Date: Wed Aug 18 20:15:01 2010 -0300 

    Added a custom extension. 

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7 
Author: Jardel Weyrich <suppressed> 
Date: Wed Aug 18 20:13:48 2010 -0300 

    Missing constness. 

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7 
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7' 
which isn't a local branch 
If you want to create a new branch from this checkout, you may do so 
(now or later) by using -b with the checkout command again. Example: 
    git checkout -b <new_branch_name> 
HEAD is now at 4553c14... Missing constness. 

這樣,你不會丟失任何信息,因此,你可以當它成爲穩定移動到一個新的版本。

+2

但是,也不是你在一個分離的頭上,這對於只讀操作是可以的。但是當您打算從此修訂開始進行更改時,您需要創建一個新的分支。有關更多信息,請參閱http://sitaramc.github.com/concepts/detached-head.html。 – Rudi 2010-08-24 13:23:31

+0

@Rudi:謝謝。這只是一個例子來顯示使用情況。更新提到它。 – jweyrich 2010-08-24 14:03:24

+0

要回到「工作狀態」,您可以在'git checkout develop'中開發您的分支的名稱。 – 2014-03-18 10:37:41

0

您所需要的源代碼樹在git倉庫中仍然可用,但是,您將需要您感興趣的提交的SHA1。我假設您可以從當前擁有的克隆中獲取SHA1?

如果你能得到那個SHA1,那麼你可以在那裏創建一個分支/重置來擁有相同的存儲庫。

命令按照瑞的回答

2

與集中版本控制系統,Git的克隆整個存儲庫,這樣你就不會只得到當前的遠程文件,而是整個歷史。您本地存儲庫將包含所有這些。

也許已經有標籤以紀念當時的特定版本。如果沒有,你可以在本地創建它們。一個好的方法是使用git log,或者更直觀地使用gitk(可能是gitk --all查看所有分支和標籤)。如果您可以發現當時使用的提交哈希,則可以使用git tag <hash>對它們進行標記,然後在新的工作副本中檢查這些哈希(例如git checkout -b new_branch_name tag_name或直接使用哈希代替標記名稱)。

-1

當我尋找某個作者提交(比如我)我過濾日誌與

git log --author=[authorname] 
+3

這不回答問題 – 2015-08-20 13:15:59

48

您可以在此順序使用簡單

git checkout commithash 

git init  
git clone `URLTORepository` 
cd `into your cloned folder` 
git checkout commithash 

提交哈希看起來像這樣「45ef55ac20ce2389c9180658fdba35f4a663d204」

+3

我喜歡這個回答最好。我認爲'git reset --hard'應該避免,以'git checkout commit-hash'爲代價。 'git reset --hard'可以刪除有時候並不需要的部分git歷史記錄。 – 2016-10-25 06:16:00

0

很可能git reset解決了您的問題。

git reset --hard -#commit hash-