2017-06-02 43 views
2

我在本地Git存儲庫中創建了一個包含功能更改和重構的提交。回想起來,如果我爲重構創建了一個單獨的提交會更好:重構是重命名,因此在許多文件中引起了差異。在所有這些重命名差異之間,很難看到功能變化。例如,使代碼複審比需要更難。如何拆分包含重構的Git提交?

那麼,有沒有簡單的方法來解決這個問題?即是否有可能將提交拆分爲重構提交和提交功能更改?

我試圖通過差異的手動分類來分裂提交 - 正如Break a previous commit into multiple commits的答案中提出的那樣 - 但這確實很乏味。沒有更簡單的方法嗎?

回答

2

是的,有一個簡單的方法 - 假設您可以輕鬆地重複重構。該方法是僅用重構創建一個提交,然後從混合提交中「減去」它。

您可以通過以下方式做到這一點:

  1. 檢查你當前的分支,e.g.git branch。對於剩下的步驟,我們假定您從分支開始master
  2. (可選)創建備份分支:git branch backup
  3. 恢復提交之前的狀態以進行拆分。這是通過檢查出父所做的承諾的承諾被分割:git checkout HEAD^
  4. 再次進行重構,並與git add --all && git commit
  5. 提交它創建提交包含由「減去」剩餘的變更重構從呈交混合承諾:

    git reset --hard master 
    git reset --soft [email protected]{1} 
    git commit -c [email protected]{1} 
    git branch -f master 
    git checkout master 
    
  6. (可選)驗證,事實上,兩個新提交含有相同的修改:git diff backup不應有差異列表。

  7. (可選)查看您創建的兩個提交。如果你不喜歡結果,你可以把它們壓回去(或者用git reset --hard backup恢復)並重新開始。否則,刪除backput分支:git branch -D backup
0

意譯splitting commits section of the git-rebase documentation

  1. git rebase -i <commit>啓動交互式重訂一些你要拆分的一個前提交。

  2. 將要分割的提交標記爲edit

  3. 當底座達到要分割的提交時,執行git reset HEAD^將組合更改保留在工作目錄中但未提交的狀態。

  4. 做兩次提交:一個與你的重構和一個與你的改名[*]

  5. git rebase --continue重播之上以後的任何變化。

很明顯,通常的注意事項只適用於如果您尚未分享您的更改。

-

[*]編輯

在這個階段,你有不分階段缺失的負荷和用不同的名字,可能編輯的內容不分階段的新文件的負載。

要重新應用重構,你可以這樣做:

一個。複製新文件名舊文件名(對於每個重構文件);它們將作爲修改出現

b。 git以通常的方式添加並提交這些更改

c。從磁盤上再次刪除舊文件

然後,所有重新命名都出現在工作文件夾中,並可以按照原樣形成第二次提交。

+0

根據重構,步驟4可能非常困難。例如。圖像,一個類被重命名,然後一些代碼被添加到它。在這種情況下,你很難做到這一點 - 而在[這個答案](https://stackoverflow.com/a/44325383/1523648)中,這只是開箱即用。 – oberlies

+1

我想這取決於(在一般情況下)哪個更難再做一次,重命名或重構。總是很高興看到人們回答自己的問題,爲社區的利益,所以謝謝你:-) –