2011-08-08 60 views
4

我修復了一段代碼中的兩個bug,它修改了常用文件。例如,錯誤修復1修改的文件A,B,C和錯誤修復2修改了B,C和D.我在一次提交中進行了所有更改。爲了代碼審查的目的,我需要將更改分成兩個提交(實際上是兩個分支)。將git commit分裂成幾個提交

我在想什麼是從我目前的分支fix,我創建了兩個分支,如git branch fix-1 fixgit branch fix-2 fix。兩個分支都有所變化。現在,在分支fix-1中,我想保留僅與修復1相關的更改,即文件A中的所有更改以及文件B和C中的部分更改。是否可以在git中執行此更改?什麼命令與此相關?

我知道在git add中,我可以做交互式添加,在這裏我可以選擇用於添加的代碼塊,而不僅僅是在文件級。有沒有類似的東西我可以在這裏做?

+0

可能重複(HTTP [如何分割提交到Git的小提交?]://計算器。com/questions/2118042/how-to-split-a-commit-into-smaller-commitits-with-git) – 2013-07-14 19:27:10

回答

5

如果提交是你最後一次提交,這裏是一個解決方案。

  1. 結帳與修復分支

    git checkout fix 
    
  2. 重置回修復前,但保持發生在你的工作目錄

    git reset HEAD^ 
    
  3. 用於修復-1創建分支

    git checkout -b fix-1 
    
  4. 添加/提交修復-1修復

    git add -p 
    git commit 
    
  5. 藏匿的剩餘變化

    git stash 
    
  6. 結帳/創建分支的FIX-2

    git checkout -b fix-1 
    
  7. 流行把你藏起來的變化

    git stash pop 
    
  8. 提交/添加它們的

    git commit -a 
    
+0

我認爲第二個命令應該是'git reset --mixed HEAD ^'。這個解決方案對我來說效果很好。謝謝。 –

+1

正確:)編輯顯示更正。當沒有給出標誌時,它將默認爲 - 混合。 – Andy

+0

我用它與'git rebase -i HEAD〜X'結合,向前移動我想分割的提交。 其中X是提交回執以提交目標提交的提交數量。 –

3

從你所在的狀態(兩個分支,每個都有所有更改)進入每個分支並執行git rebase -i fix^並選擇fix提交的「編輯」。然後,當它暫停編輯提交時,您使用git reset HEAD^,這會拋出提交,但將更改留在工作樹中。然後使用您慣常的git add -p策略將承諾拆分爲多個git commits,然後使用git rebase --continue

我認爲這是在git rebase手冊下的SPLITTING COMMITS

+0

做完'git add -p'後,我做了'git commit',但之後做'git rebase --continue'結果爲 /path/to/file1.txt:需要更新 /path/to/file2.txt:需要更新 工作樹很髒 我留在'(no branch)'。在此之後無法弄清楚該怎麼做。我所做的就是「藏起來」,它扔掉了變化,我回到原來的分支。任何想法,當我得到'工作樹很髒'後,我應該做'git commit'。 –

+0

噢,對,因爲你不想要所有的改變,所以在你提交你想要的部分後,你會想'git reset --hard'放棄所有的工作拷貝編輯。 –

+0

謝謝本。這個解決方案運行良好,但上面Andy的解決方案更簡單,我更好地理解正在發生的事情。當git開始顯示'(no branch)'時,我的理解就是搖搖欲墜的,而這個解決方案涉及到'(no branch)'模式! :-)感謝您提出解決方案。 –