這常常發生在我身上:我寫了一些代碼,檢查個人更改,而後意識到我不在適當的分支中來檢查那些更改。 可是,若是不還原更改,我將沒法切換到另外一個分支。 有沒有辦法將更改移動到另外一個要在其中檢查的分支? git
若是要將更改移動到新分支 ,只需兩個命令便可完成: spa
git stash git stash branch new-branch
根據git stash文檔 : .net
分支
<branchname> [<stash>]
分支<branchname> [<stash>]
指針從最初建立
<stash>
的提交開始建立並籤<branchname>
爲<branchname>
的新分支,並將記錄的更改應用於新的工做樹和索引。 code
不幸的是,這也常常發生在我身上,若是我在git commit
以前意識到本身的錯誤,就使用git stash
,不然使用git cherry-pick
不然在其餘答案中都很好地解釋了這兩個命令 索引
我想爲git checkout targetBranch
添加一個說明: 若是targetBranch與當前分支具備相同的歷史記錄,則此命令僅保留您的工做目錄和暫存快照 文檔
若是還沒有提交更改,只需使用git checkout移至新分支 ,而後按常規提交便可 get
@Amber的語句不是假的,當您移至newBranch , git checkout -b newBranch
,將建立一個新指針,該指針指向與當前分支徹底相同的提交。
實際上,若是您碰巧有另外一個分支與當前分支共享歷史記錄(兩個點都在同一提交中),則能夠經過git checkout targetBranch
「移動更改」 it
可是,一般不一樣的分支意味着不一樣的歷史記錄,而且Git不容許您在具備骯髒工做目錄或暫存區的這些分支之間進行切換。 在這種狀況下,您能夠執行git checkout -f targetBranch
(清除並丟棄更改)或git stage
+ git checkout targetBranch
(清除並保存更改),僅運行git checkout targetBranch
會產生錯誤: io
錯誤:檢出將覆蓋對如下文件的本地更改:...在切換分支以前,請先提交更改或將其存儲起來。 墮胎
一個軟的git reset會將提交的更改放回到索引中。 接下來,簽出您打算提交的分支。 而後使用新的提交消息進行git commit 。
git reset --soft <commit>
git checkout <branch>
git commit -m "Commit message goes here"
從git docs :
git reset [<mode>] [<commit>]
此表單將當前分支頭重置爲,並可能根據來更新索引(將其重置爲的樹)和工做樹。 若是省略,則默認爲--mixed。 必須爲如下之一:
--soft
徹底不觸摸索引文件或工做樹(但將頭重置爲,就像全部模式同樣)。 就像git status那樣,這會將全部更改的文件保留爲「要提交的更改」。
若是還沒有提交更改 ,只需使用git checkout
移至新分支,而後按常規提交便可-對文件的更改在提交以前不會綁定到特定分支。
若是您已經提交改變:
git log
並記住要移動的提交的SHA。 git cherry-pick SHA
並從上方替換SHA。 git reset HEAD~1
重置。 cherry-pick
接受給定的提交併將其應用於當前已檢出的頭部,從而使您能夠將提交複製到新分支。
git stash
是您的朋友。
若是還沒有提交,請運行git stash
。 這樣能夠節省您的全部更改。
切換到要更改的分支,而後運行git stash pop
。
git stash有不少用途。 這固然是更有用的緣由之一。
一個例子:
# work on some code git stash git checkout correct-branch git stash pop