2013-11-01 220 views
2

假設我有一個git分支,並在分享之前進行最終審查,我發現了一些小錯誤,例如拼寫錯誤。我想要做的就是將這個補丁應用爲「fixup」,但是它實際上會影響許多提交,因此在最終歷史記錄中沒有任何錯誤跡象。Git rebase:用一次提交修正多個提交

也就是說,如果我在一個提交中更改了行A,然後在另一個提交中更改了行B,然後我有一個影響到A行和B行的補丁,我想在提交更改行A被該修補程序的A部分修復,並且提交更改行B獲取B部分,而無需手動確定提交它們是哪一個。是否有捷徑可尋?

我覺得僞腳本會是這樣的:

collect all hunks from the fixup 
for commit in the history we are rebasing: 
    check out commit 
    for hunk in fixups: 
     try: 
      apply hunk to the working tree 
     except: 
      continue 
     remove hunk from fixups 
    commit the working tree. 
+1

使用'git blame'(或'git annotate')查找引入Speling Erarrs的提交,單獨提交每個修復程序並將每個修復程序壓縮爲'rebase -i'可能更有意義修正每個「壞」的提交,也許。 – torek

+0

我認爲問題中提出的算法是一個好主意。有人應該實施它! –

回答

0

這裏的一個部分答案。這很醜陋,但它的工作原理很簡單。

我有一個提交,ce580fe,在幾個地方重命名的東西。我想讓原始名稱永遠不會出現在文件中。這至少工作在一種情況下:

git rebase -i 0881a5a --exec "git diff ce580fe^ ce580fe | git apply --reject; git add -u; git commit --amend -C HEAD" 
git diff ce580fe | git apply; git add -u git commit --amend -C HEAD # Apply any changes that got missed. 

即,在各變基步驟,它適用的差異爲ce580fe並允許DIFF的一部分被拒絕。它將所有更改添加到已知文件中,並使用相同的提交消息修改提交。然後最後應用剩下的和ce580fe之間的差異,使樹看起來像ce580fe

它不會對git apply --reject產生的.rej文件做任何事情。對於實際重命名,使用git rebase -i --exec以及搜索替換線可能會更好。