2010-04-02 30 views
742

上下文:我正在爲主人添加簡單功能。幾分鐘後,我意識到它不是那麼簡單,而且應該更好地工作到一個新的分支。Git:從主機上未分期/未分配更改創建分支

這種情況一直髮生在我身上,我不知道如何切換到另一個分支,並採取所有這些無法完成的更改,使主分支保持乾淨。我認爲git stash && git stash branch new_branch會簡單地實現這一點,但是這是我得到:

~/test $ git status 
# On branch master 
nothing to commit (working directory clean) 

~/test $ echo "hello!" > testing 

~/test $ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

~/test $ git stash 
Saved working directory and index state WIP on master: 4402b8c testing 
HEAD is now at 4402b8c testing 

~/test $ git status 
# On branch master 
nothing to commit (working directory clean) 

~/test $ git stash branch new_branch 
Switched to a new branch 'new_branch' 
# On branch new_branch 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
Dropped refs/[email protected]{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b) 

~/test $ git s 
# On branch new_branch 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

~/test $ git checkout master 
M testing 
Switched to branch 'master' 

~/test $ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: testing 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

你知道是否有實現這個的方法嗎?

+0

雖然有一個簡單的解決方案,以你的問題,你能在你得到的結果是什麼,從你想有什麼不同規定? – Gauthier 2010-04-02 22:41:37

+1

通過執行上述操作或底部的答案,未完成的更改同時在主分支和新分支上。我只希望他們在新的分支,所以我可以簽出主人並在另一件事上工作,而不會在 – knoopx 2010-04-02 22:56:18

+1

附近浮動這些更改。請參閱我編輯的答案。如果您想簽出乾淨的主文件,則需要在新分支上提交本地更改。本地更改只是當前HEAD和磁盤上的文件之間的差異。本地文件上的這些更改沒有版本化,如果您想稍後檢索它們,則需要告訴git將它們保存在某處。 – Gauthier 2010-04-02 23:07:07

回答

884

無需藏匿。

git checkout -b new_branch_name 

不會觸及您的本地更改。它只是從當前的HEAD創建分支並將HEAD設置在那裏。 所以我想這就是你想要的。

---編輯解釋結賬掌握的結果---

你困惑,因爲checkout master不會放棄更改?

因爲更改只是本地的,所以git不希望你太容易丟失它們。更改分支後,git不會覆蓋您的本地更改。您的checkout master的結果是:

M testing 

,這意味着您的工作文件不乾淨。 git確實改變了HEAD,但沒有覆蓋你的本地文件。這就是爲什麼你的最後一個狀態仍然顯示你的本地變化,雖然你在master

如果您確實想丟棄本地更改,則必須使用-f強制結帳。

git checkout master -f 

由於您的更改從未提交過,您將失去它們。

嘗試返回到您的分支,提交您的更改,然後再次檢出主。

git checkout new_branch 
git commit -a -m"edited" 
git checkout master 
git status 

您應該checkout master後的第一次結賬後獲得M消息,但隨後不再和git status不應有修改的文件。

---編輯澄清混淆工作目錄(本地文件)---

在回答你的第一個評論,局部變化只是......嗯,當地。 Git不會自動保存它們,您必須告訴它以保存它們以備後用。 如果您進行了更改並且未明確提交或存儲它們,git將不會對它們進行版本化。如果更改HEAD(checkout master),則本地更改不會被覆蓋,因爲未保存。

+0

這就是我總是這樣做的。它的工作原理就是你想要的。 – synic 2010-04-02 22:28:45

+0

老兄,我錯過了這個重要的一點。我想我明白了爲什麼會發生這種情況,以及爲什麼git顯然不能忽視這些變化(如果我沒有首先提出這些變化)。謝謝:D – knoopx 2010-04-02 23:19:52

+22

這裏令人困惑的是,git的手冊頁聲明'git checkout'「更新工作樹中的文件以匹配索引或指定樹中的版本。」這假定你的文件系統中的變化將在之後變成* GONE *。沒有任何機會讓他們回來。 即使你說他們不會,這仍然留下一個非常糟糕的感覺。我根本不相信這*。 文檔非常糟糕,或者git的默認行爲非常危險。人們不應該相信一些「自動化」的啓發式方法來檢測在這種情況下你不想失去你的改變。 – Evi1M4chine 2013-08-14 16:48:40

46

嘗試:

git stash 
git checkout -b new-branch 
git stash apply 
+5

這與僅僅通過自己做'git checkout -b new-branch'有何不同? – 2013-07-11 10:09:49

+0

我不認爲這是答案最初的寫法,但我可能是錯的。不幸的是,由於我的工作環境,過去幾年我一直在使用perforce,所以我現在無法證明它的準確性。 – 2013-07-12 04:07:25

+2

或者不是最後兩個步驟:git stash branch new-branch – rethab 2014-07-09 05:26:24

12

兩件事情可以做:

git stash -u 
git branch sillyname [email protected]{0} 

git checkout -b sillyname 
git commit -am "silly message" 
git checkout - 

git stash -u < - 在-u意味着它也需要不分階段的變化)

git checkout - < - 中破折號是前一個分支的捷徑)

4

如果您正在使用GitHub Windows客戶端(因爲我是),並且您已經做出了未提交的更改並希望移至新分支的情況,則可以通過GitHub客戶端簡單地「創建新分支」 。它將切換到新創建的分支並保留您的更改。

enter image description here

+0

,它在創建新分支之前存儲了更改,因此不會保留它們(Mac OS上的版本223) – 2017-07-03 13:11:34