2011-11-29 213 views
1

在對分支master進行了一些更改後,我決定從一個新分支開始工作。我做了git checkout -b new_branch_name並創建並檢出了一個新的分支。 git status顯示我對master所做的更改。混帳分支創建git

我很好奇,如果我的更改現在在兩個分支(masternew_branch_name)或只是new_branch_name。所以我檢查了master並注意到我的變化也在那裏。所以我用git checkout -- fileThatChanged恢復了這些修改。這些變化確實從master消失了。

不幸退房new_branch_name和正在運行git status顯示我的更改也從該分支恢復。

我想了解發生了什麼以及未來如何避免這種情況。

一個解決方案是在開始工作之前創建/檢出新分支。

+1

你需要記住的是分支指向提交,並且提交表示整個工作樹的快照。簽出的分支就是下一次提交的分支。 (工作樹與提交完全分開,索引是兩者之間的中間區域。)如果您想要對Git的核心思想進行羅嗦解釋,可以嘗試[The Git Parable](http:// tom.preston-werner.com/2009/05/19/the-git-parable.html)。 – Cascabel

回答

5

您從未對任何分支提交過更改。也就是說,如果你這樣做:

$ git status 

而且看到了這樣的事情:

# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: myfile.txt 
# 

的變化,以「myfile.txt的」不「存在」上的任何分支 - 他們只是你當地的工作副本。直到你將它們交給一個存儲庫,它們纔會最終成爲分支。

如果在這一點上,我要輸入:

$ git checkout myfile.txt 

這會抹殺我的變化(文件恢復到什麼它看起來像在最後一次提交我的當前分支)。

如果我想提交一個新的分支這些變化,我可能會做這樣的事情:

$ git checkout -b new_branch_name 
$ git add myfile.txt 
$ git commit -m "made some changes" 
+0

聽起來像創建/檢出新分支後立即向新分支提交更改將解決此問題。 – SundayMonday

+2

這在很大程度上是我在最後一個例子中試圖說明的。 – larsks

3

該指數是所有分支之間共享。因爲它是本地工作樹。 它表示將承諾什麼,而不會假設它將承諾在哪個分支。
但是,這意味着它,你恢復的變化(即從指數還是從本地工作空間中刪除),將不管你是在哪一個分支恢復

參見:

git file transition

+1

該指數在這裏沒有發揮作用。在'git add'操作後,文件在索引中結束。對既沒有添加也沒有提交的文件的更改不在索引中。 – larsks

+0

@larsks:您對結帳-F(只有工作樹受到影響)是正確的。但是當你在評論時,我正在編輯我的答案;) – VonC

1

改變而改變(你在git的狀態看)是沒有關係的一個分支,但很常見。所以當你切換分支時,這些改變仍然會在新分支中。如果您撤消更改,切換分支時會看到該更改。您應該在更改分支之前提交或存儲。

1

正如書中所說,您沒有犯下這些變更。

如果您在記住工作副本的同時想要切換分支機構,則必須使用git stash

完成後,您可以使用git stash pop恢復您的進程內工作目錄。