2017-04-12 35 views
0

我做了一個承諾,其中包括以下更改:增加一箇中間致力於簡化審覈

  • 移動一大塊文件main到一個新的文件aux
  • 然後,很輕微的編輯內容aux

不幸的是,這使得提交很難在GitHub上審查,因爲GitHub上顯示DIFF彷彿整個塊被刪除並重新插入。理想情況下,審閱者只會看內容移動後對aux所作的非常小的編輯。

我想補充一箇中間致力於簡化審查這一變化。中間提交將簡單地重複mainaux(即,aux將是main複印件)。那麼接下來將提交從main刪除移動的內容和表現出aux上的細微變化。這是否是一個很好的方法,如果是這樣,我應該如何去創建這個中間提交?請注意,不幸的是我已經完成了更改,我不想重做整個過程。

+0

您是否將此舉作爲單獨提交進行提交,或者您是否移動了內容,然後進行編輯,然後進行提交? (關於你已經做了什麼) –

+0

不,不幸的是,我有移動和編輯作爲一個單一的提交。 –

回答

1

這是可以做到,但要注意,如果你已經發布的提交(因爲它聽起來像你有),那麼不建議任何編輯歷史。所以有一些可能的程序。爲了這些解釋的目的,我將假定這些變化在分支my_branch上。 (它工作正常,如果有問題的分支是master;我只需要承擔東西與寫命令)

簡單,但笨重的

你可以回到以前的承諾,創建臨時分支,並在該分支上創建您的中間提交。然後告訴審閱者首先檢查臨時分支上的更改,然後將您的my_branch與臨時分支區別開。如果你的評論者會爲此付出代價,那麼它就會給他們更簡單的差異而不會混亂。但也許它不會以最好的方式保存歷史。

隨着歷史重寫

如果你能做到這一點,這將讓您有一個更清潔的歷史。但它涉及歷史重寫,並且如上所述,這可能會導致其他用戶推出更改的任何回購問題。見git rebase文檔重:從上游恢復變基

如果這不是一個問題,或者如果您發現該恢復過程是可以接受的,那麼你可以這樣做:

首先,收銀臺前提交到變化。我假設這是

git checkout my_branch^ 

現在你處於分離頭狀態。也許好創建一個臨時分支:

git checkout -b temp_branch 

複製mainaux和承諾。

接下來,您需要一個與my_branch HEAD類似的提交,但您希望其父代爲temp_branch HEAD。如果aux是在改變的唯一承諾:

git checkout my_branch -- aux 
git commit 
git branch -f my_branch 

如果在提交的其他變化,那麼它可能會更容易重新家長它。還有如何在這一點上,你可以清理temp_branch做到這一點的文檔中的git filter-branchhttps://git-scm.com/docs/git-filter-branch

當然股票的例子。您可能需要「強制推送」my_branch(如果它已經發布)。

git checkout my_branch 
git push -f 

而這所有其他的開發人員可能需要恢復,如果他們也有提及my_branch信號。

沒有歷史重寫

如果沒有以上可以正常工作,那麼你可以嘗試這樣的:首先,使用git revert回去變化之前。然後,分兩個階段重新應用提交。

再次,中間提交很容易做出(與重寫的情況相同)。如果對mainaux的更改是提交中的唯一更改,那麼您可以再次從原始提交中提取aux以簡化創建最終提交。但是,這一次的命令將

git checkout HEAD^ -- aux 

因爲HEAD是復歸犯這樣HEAD^是一個與它的變化。

如果提交有其他修改,然後一個braoder

git checkout HEAD^ -- . 

可能會做,但我會先傾向於rm -r工作樹剛走出偏執。你嘗試的任何步驟,您就可以驗證你與

git diff HEAD^ 

正確地重建了最終的樹那麼現在你有這個奇怪的背部和反覆詮釋他的歷史,但沒有改寫,並沒有「第二支」參與了簡化驗證。當然,您可能還需要分兩步進行驗證:首先顯示HEAD^等於先前驗證的狀態,然後驗證從HEAD^HEAD的補丁。

+0

完美!重新裝配確實正是我所需要的。感謝您的全面回答! –