2010-03-11 25 views
3

我對git比較陌生,並且在早期遇到一些問題。我做了幾個提交,但是當我嘗試推送它們時,我收到了一個回覆,表示一切都是最新的。我覺得我的問題是關於在上市this question相同,但它提出如下建議:什麼將git結帳大師+ git重置 - 哈哈?

$ git log -1 
# note the SHA-1 of latest commit 
$ git checkout master 
# reset your branch head to your previously detached commit 
$ git reset --hard <commit-id> 

究竟會「檢查出大師」呢?我只是不想失去我所做的修改...

截圖gitk的:
enter image description here

+0

什麼問題是「本」的問題?你沒有提供鏈接。 – 2010-03-11 00:28:50

+0

對不起,請參閱編輯:) – danwoods 2010-03-11 00:33:19

回答

3

檢出分支會移動本地HEAD指針,以便它指向與分支引用相同的提交。例如:

當分支mybranch(在C s爲提交):

     HEAD 
         | 
         V 
      master  mybranch 
      |   | 
      V   V 
C1 -------> C2 -------> C3 

運行git checkout master後:

  HEAD 
      | 
      V 
      master  mybranch 
      |   | 
      V   V 
C1 -------> C2 -------> C3 

這也爲必需的,以便移動在你的工作目錄下的文件它是該項目在該提交中看起來像什麼的完美快照。它不會刪除或更改提交,因此您不會通過檢出另一個分支而在一個分支中失去工作。

在另一個問題中描述的「分離頭部」情況下發生了什麼,C3與分支沒有關聯。爲了解決此問題,您需要更新master分支指向的提交,以便它包含新東西(C3)。檢出master告訴git你現在正在使用主分支,然後做一個硬reset與您提交的SHA1 想要在您的master分支的頂端更新分支引用到你想要的。

編輯:

在這種情況下,一個分離的頭不是問題。請記住,提交和推送是git中的兩個不同的事情。提交不會像Subversion那樣與中央存儲庫進行通信。在對工作目錄進行更改後,對於每個已更改的文件運行git add filename一次,其中filename是該文件的名稱。一旦所有文件都被添加到索引中,您可以使用git commit來提交它們。

對此的簡寫是使用git commit -a,它會在提交前自動將修改後的文件添加到索引。這允許您跳過git add步驟。請注意,git commit -a只會添加修改後的文件。如果您要引入一個從未提交的新文件,則必須手動將其添加到git add

一旦你提交了進展,你可以運行git push來發送提交到遠程倉庫和更新遠程分支。這只是遠程通信的東西。與Subversion不同,提交本身是在本地處理的,與服務器沒有任何交互。

+0

所以,原諒我,如果我是緩慢的,當我簽出主人我的所有文件將恢復到它們在更改之前並提交的方式,但是當我推它會正確地更新所有內容;那是對的嗎? – danwoods 2010-03-11 00:52:06

+0

假設您在檢出主服務器並推送它之間運行您在問題中提到的命令。當你推送時,git會發送你本地主分支擁有的遠程主分支中尚不存在的所有提交。然後它更新遠程分支指針'origin/master',指向與本地'master'相同的提交。 – 2010-03-11 00:57:30

+0

我跑從其他崗位的三條指令,它仍然是說什麼都在漲,最新 – danwoods 2010-03-11 00:59:24

-1

git checkout master是到工作區切換到分支也被稱爲中繼在其他版本控制系統。

+0

我的「工作是」?它會覆蓋任何更改嗎? – danwoods 2010-03-11 00:34:08

+0

有一點寬泛,我認爲值得一提的是'reset'的確可以回答問題。 – electblake 2012-03-14 05:36:33