2011-08-27 23 views
191

這經常發生在我身上:我編寫了一些代碼,去檢查我的更改,然後意識到我沒有在適當的分支中檢查這些更改。但是,如果不更改我的更改,我無法切換到另一個分支。有沒有辦法將更改移動到另一個分支以在那裏檢查?將更改的文件移動到另一個分支以進行登記

回答

321

git stash是你的朋友。

如果您還沒有提交,請運行git stash。這將節省您的所有更改。

切換到您想要更改的分支並運行git stash pop

git存儲有很多用途。這當然是更有用的原因之一。

一個例子:

# work on some code 
git stash 
git checkout correct-branch 
git stash pop 
+47

無需隱藏未提交更改,他們會在您簽出分支時與您一起。隱藏更多的是爲了長期存儲臨時性的東西(你想完成並稍後提交的東西,但你現在需要做其他事情)。 – Tekkub

+0

我明白了。所以我必須存儲,切換分支,然後彈出 'C:\ kf [develop +0〜4 -0]> git checkout feature/customers
錯誤:您對本地更改以下文件將被checkout覆蓋:
AspWebApp.vNext/global.asa
RestApi/Web.config
請在您切換分支之前提交您的更改或存儲它們。
Aborting' – IsmailS

+0

@Tekkub「長期存放臨時性事物」這種說法覺得很尷尬,另一點是使用存儲器將它推入一個堆棧,所以如果你不想讓它繼續並在其他東西上工作,以這種方式很有用。是的,你不必但只是感覺更乾淨,更能控制。 – Atherion

113

如果您還沒有提交改變,只需使用git checkout移動到新的分支,然後提交它們通常 - 對文件的修改,直到您提交它們不依賴於特定的分支。

如果已經提交改變:

  1. git log類型,並記住要移動的提交SHA。
  2. 檢出你想要提交的分支。
  3. 類型git cherry-pick SHA代替上面的SHA。
  4. 切換回您的原始分支。
  5. 使用git reset HEAD~1在錯誤分支提交之前重置。

cherry-pick需要一個給定的提交,並將其應用到當前簽出的頭部,從而允許您將提交複製到一個新的分支。

+4

輝煌!你剛從我身上救了我。 ;) – Ben

+4

+1「cherry-pick」 – Jackson

+3

你甚至不需要在這裏挑選櫻桃。 'git reset HEAD〜N --soft',然後'git checkout -b'將所有的未提交的代碼移動到新的分支。 – Aaron

21

如果要移動的變化到一個新的分支,這可以只用兩個命令來完成:

git stash 
git stash branch new-branch 

按照git stash documentation

branch <branchname> [<stash>]

Creates and checks out a new branch named <branchname> starting from the commit at which the <stash> was originally created, applies the changes recorded in to the new working tree and index.

0

很遺憾,這發生在m Ë相當有規律,以及和我使用git stash如果我意識到我的錯誤git commit前和使用git cherry-pick否則,這兩個命令都在其他的答案

我想添加一個澄清的git checkout targetBranch解釋得很好:此命令將只保留您的工作目錄,並上演快照如果targetBranch有相同的歷史就是當前分支

If you haven't already committed your changes, just use git checkout to move to the new branch and then commit them normally

@琥珀的說法是不假,當你移動到newBranchgit checkout -b newBranch,新指針i被創建並且它指向與當前分支完全相同的提交。
事實上,如果你碰巧有一個共享的歷史與當前分支的另一個分支(都指向同一提交),您可以通過git checkout targetBranch

「移動更改」不過,通常不同的分支意味着不同的歷史, Git不允許你在這些分支之間切換髒的工作目錄或臨時區域。在這種情況下,你可以做git checkout -f targetBranch(清潔和一次性改變)或git stage + git checkout targetBranch(清潔保存變化),只需運行git checkout targetBranch會給出錯誤:

error: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches. Aborting

相關問題