2010-10-10 152 views
531

我開始在我的主分支上工作,認爲我的任務很簡單。過了一段時間,我意識到這需要更多的工作,我想在新的分支中完成所有這些工作。我如何創建一個新的分支並在不污染主人的情況下與我一起進行所有這些更改?創建當前更改的Git分支

+8

[將現有的,未完成的工作移動到Git中的新分支](http://stackoverflow.com/questions/1394797/move-existing-uncommited-work-to-a-new-branch-in -git) – Marijn 2013-06-19 09:29:54

+0

dup http://stackoverflow.com/questions/2569459/git-create-a-branch-from-unstaged-uncommited-changes-on-master – andrej 2014-01-28 12:51:59

+1

謝謝!我也是! – Jonah 2014-09-05 15:27:55

回答

448

如果你還沒有提交任何提交,只有(1:分支)和(3:結帳)就足夠了。
或者,在一個命令:git checkout -b newBranch

正如git reset man page提到:

$ git branch topic/wip  # (1) 
$ git reset --hard HEAD~3 # (2) NOTE: use $git reset --soft HEAD~3 (explanation bellow) 
$ git checkout topic/wip # (3) 
  1. 你已經取得了一定的提交,但意識到他們是不成熟是在 「master」 分支。您想要繼續在主題分支中對其進行打磨,因此請創建「topic/wip」分支,使其脫離當前的HEAD
  2. 快退master分支以擺脫這三個提交。
  3. 切換到「topic/wip」分支並繼續工作。

注:由於git reset --hard命令(它重置索引和工作樹因爲<commit>在工作樹的任何更改跟蹤文件被丟棄)的「破壞性」的影響,我寧願去一個:

$ git reset --soft HEAD~3 # (2) 

,以確保我沒有失去任何私人文件(沒有添加到索引)。
--soft選項根本不會觸摸索引文件或工作樹(但將頭重置爲<commit>,就像所有模式一樣)。

+5

也可能值得注意的是,如果您已將主題材料提交到其他人從其存儲庫中的主分支中,這不是一個好主意。或者至少,如果你確實需要重新設置,你需要告訴人們你正在做的是什麼,所以他們下一次拉的警告不會太過震撼。 – 2010-10-10 09:54:35

+0

我其實還沒做任何提交。所以非常簡單,謝謝隊友 – willcodejavaforfood 2010-10-10 11:05:05

+19

給未來讀者的提示:從下往上閱讀(或者一定要閱讀全文)。 'git reset --hard'會破壞你的改變,如果它們還沒有被提交,它們是不可恢復的!你可能只需要'git checkout -b ...' – 2012-05-30 18:58:40

15

既然你還沒有做出任何承諾的是,你可以保存所有的更改,以藏匿,創建並切換到一個新的分支,然後在彈出這些更改回你的工作樹:

git stash # save local modifications to new stash 
git checkout -b topic/newbranch 
git stash pop # apply stash and remove it from the stash list 
+7

或VonC指出'git checkout -b newbranch'並跳過存儲 – willcodejavaforfood 2010-10-10 15:46:52

+0

@will:我在想,創建一個新分支會覆蓋您所有未提交的更改,但如果情況並非如此,那麼您可以跳過藏。 – Ether 2010-10-10 15:58:09

+1

我試了一下,它工作正常,git非常周到,並且不會覆蓋任何本地更改 – willcodejavaforfood 2010-10-10 16:35:57

162

像在這個問題中說:Git: Create a branch from unstagged/uncommited changes on master:藏匿處是沒有必要的。

只需使用:

git checkout -b topic/newbranch

所有提交的工作將沿着新的分支服用。

如果您嘗試推你會收到以下消息

致命的:當前的分支功能/ NEWBRANCH沒有上游分支。爲了 推動當前分支和設置遠程上游,使用

git push --set-upstream origin feature/feature/NEWBRANCH 

只要做的建議,以創建遠程分支:

git push --set-upstream origin feature/feature/NEWBRANCH

+5

我已經做了兩次了。很棒! – simgineer 2014-01-16 03:59:58

+1

只有當您推送新分支時,纔會得到'無上游分支'錯誤,而不是在您提交新工作時。 – sam 2017-11-15 23:59:07

+1

@sam我已經修改了相應的答案 – 2018-01-11 22:51:06

51

遵循以下步驟:

  1. 創建新分支:

    git branch newfeature 
    
  2. 結帳新的分支:(這不會重置你的工作。)

    git checkout newfeature 
    
  3. 現在提交這一新的分支工作:使用上述步驟

    git commit -s 
    

將保持你的原始分支清潔,你不必做任何'混帳重置 - 硬'。通常

git branch branch/name 
git checkout branch/name 
git push origin branch/name 

次我忘了添加起始部分,推動並感到困惑,爲什麼我沒有看到新的分支/犯:

+1

'-s'在步驟3中做了什麼? – 2015-12-11 16:54:58

+7

@ScottBiggs這是沒有必要的,但一些人遵循的做法。它是[[--signoff]](https://git-scm.com/docs/git-commit)的縮寫,並將您的用戶名添加到提交給未來查看日誌的用戶,以知道您已經放棄了此提交。 – 2016-02-03 15:46:13

+2

很好的答案,但在步驟3中不需要'-s'。 – 2016-07-18 16:37:56

2

新的變化添加到一個新的分支,並推送到遠程bitbucket