2013-03-19 42 views
0

想象我有以下git的歷史:變化git的歷史,包括修改後的代碼

a ----- b ----- c 
       HEAD 

這裏頭是位於C。

現在我發現了(a)中的一個錯誤,顯然現在在(b)和(c)中。我現在想做的是在(a)中更改代碼(修復bug),並且想要更新(b)和(c)中的代碼。我應該如何用git來做到這一點?

謝謝

+4

這可能是最好的修復代碼並創建一個新的(d)與修復VS取決於錯誤的類型,改寫歷史的承諾。 – 2013-03-19 18:57:03

+0

但是,如果我想在我的主分支上進行測試,那麼每次結賬(b)或(c) – 0xhacker 2013-03-19 18:58:52

+0

時,我將不得不手動編輯代碼您想要爲舊提交結賬? – Hauleth 2013-03-19 19:00:12

回答

4

從你的問題,你似乎希望歷史看起來像從來沒有一個錯誤。
你可以做這樣的事情:

  • 修復了一個新的,定期提交。我們將其稱爲提交d
  • 使用交互式數據庫:git rebase -i <hash-of-commit-before-a>
    在出現的編輯器窗口中,您會看到在新行上提交a,b,c,d,並在它們前面有一個命令(pick)。
  • 重新排序行,使新行提交的行恰好位於表示提交a(應該是第二行)的行後面。
  • 將新提交的命令改爲squash(而不是pick這是默認值)。
    這會導致您的新提交d合併到第一個提交a中。

請注意,如果您將這些提交推送到另一個回購,rebasing是一個壞主意。簡而言之,這是因爲您實際上正在創建新的提交(使用新的哈希),而不僅僅是重新排序現有的提交。如果其他人拉你的代碼和基於原始提交的工作,當他再次拉他會有重複,他將不得不手動解決這個問題。 請參閱The perils of rebasing以獲得更好的解釋。

2
git rebase -i HEAD~3 

#An editor window will now open showing 3 commits. Replace 'pick' with 'e', save exit. 
#git will now give you a chance to edit last 3 commits. Edit the files to fix the bug, then 

git add -u 
git commit -m"New message" 
git rebase --continue 

#This will repeat 3 times. After that, you will have a new set of last 3 commits (with new sha1 of course). 

BTW這一點後,你將不能夠做一個「推」,如果你的3個提交已經在遠程(來源)。您將必須執行以下操作:

git push -f 

這樣做還可以防止其他人在他們有舊提交的情況下進行提取。但是,這時候別人來解決這一點:

git stash # save your changes. 
git reset --hard HEAD~3 
git pull 
git stash pop 
+2

請注意,我的解決方案是我的「其他人」之一是將鞋子扔在造成這種情況的人身上。 – millimoose 2013-03-19 19:31:22