2011-10-26 25 views
11

考慮下面的 「故事」:工作目錄如何在「git checkout」上更新?

$ mkdir my_project 
$ cd my_project 
$ git init 
Initialized empty Git repository in /home/misha/misha/my_project/.git/ 

$ echo "first line" > hello.txt 
$ git add hello.txt 
$ git commit -m "first commit" 
[master (root-commit) 9c913a1] first commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 hello.txt 

$ git branch new_feature 
$ git checkout new_feature 
Switched to branch 'new_feature' 
$ echo "second line" >> hello.txt 
$ cat hello.txt 
first line 
second line 

$ git checkout master 
M hello.txt 
Switched to branch 'master' 
$ cat hello.txt 
first line 
second line 

爲什麼hello.txt對分支兩行呢? (我認爲git checkout將恢復工作目錄到以前的狀態,即hello.txt將只有一條線。)

幕後實際發生的工作目錄上git checkout什麼?它如何更新?

回答

15

您的git checkout到master會阻止您丟失未提交的更改。這就是爲什麼你的hello.txt文件仍然有你的第二行。如果您確實想要丟失未提交的更改,則必須使用-f參數。

最後結帳是這樣的:

git checkout -f master 
+2

顯然,git默認將當前工作目錄合併到新分支(_master_在我的情況下):http://www.gitguys.com/topics/switching-branches-without-committing –

+0

如果文件被添加到該索引但未提交。 –

+0

我認爲分支只存儲提交,而不是工作改變。當您切換到分支並執行某些工作時,您需要在切換到其他分支之前提交這些更改,否則這些更改將不會與該分支相關聯。 處理分支的另一種方法是將您的存儲庫克隆到新目錄中。然後,您可以在兩個不同目錄中的兩個分支上工作,而無需提交,直到準備就緒。這使得更容易避免錯誤。 –

2

Git簽出(鬆散地)將在指定的提交處更新存儲庫內容的工作副本。您的new_feature分支沒有添加到文件中的第二行(因爲您尚未提交)。現在,額外的行只是工作副本中未經檢查的更改,它將被添加到您提交的分支中。

+2

如果'混帳checkout'更新與資源庫中的提交內容的工作目錄,我指定(_master_在我的情況),並且只有在_master_分支上的'hello.txt'中有一行,然後在'git checkout master'上,我希望工作目錄中的'hello.txt'只有一行(與_master_分支完全一樣)。我在這裏錯過了什麼? –

+0

您的工作目錄中存在未提交的本地更改。如果結帳會覆蓋這些更改,git會警告您並拒絕切換分支。 –

+1

如果這些更改不與master發生衝突,那麼git會將這些更改導入master的工作目錄(但它會讓您切換分支)。這是OP正在經歷的。如果這些變化與主人衝突,那麼它不會讓你切換。最後,如果工作目錄在結帳時是乾淨的,它將把工作目錄更新爲主目錄。這個答案留下了太多的信息是正確的。另外,由於OP已經聲明工作目錄不乾淨,所以此答案無法解決該情況。 – Despertar

相關問題