想象我有以下git的歷史:變化git的歷史,包括修改後的代碼
a ----- b ----- c
HEAD
這裏頭是位於C。
現在我發現了(a)中的一個錯誤,顯然現在在(b)和(c)中。我現在想做的是在(a)中更改代碼(修復bug),並且想要更新(b)和(c)中的代碼。我應該如何用git來做到這一點?
謝謝
想象我有以下git的歷史:變化git的歷史,包括修改後的代碼
a ----- b ----- c
HEAD
這裏頭是位於C。
現在我發現了(a)中的一個錯誤,顯然現在在(b)和(c)中。我現在想做的是在(a)中更改代碼(修復bug),並且想要更新(b)和(c)中的代碼。我應該如何用git來做到這一點?
謝謝
從你的問題,你似乎希望歷史看起來像從來沒有一個錯誤。
你可以做這樣的事情:
d
。git rebase -i <hash-of-commit-before-a>
。 pick
)。a
(應該是第二行)的行後面。squash
(而不是pick
這是默認值)。 d
合併到第一個提交a
中。請注意,如果您將這些提交推送到另一個回購,rebasing是一個壞主意。簡而言之,這是因爲您實際上正在創建新的提交(使用新的哈希),而不僅僅是重新排序現有的提交。如果其他人拉你的代碼和基於原始提交的工作,當他再次拉他會有重複,他將不得不手動解決這個問題。 請參閱The perils of rebasing以獲得更好的解釋。
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
請注意,我的解決方案是我的「其他人」之一是將鞋子扔在造成這種情況的人身上。 – millimoose 2013-03-19 19:31:22
這可能是最好的修復代碼並創建一個新的(d)與修復VS取決於錯誤的類型,改寫歷史的承諾。 – 2013-03-19 18:57:03
但是,如果我想在我的主分支上進行測試,那麼每次結賬(b)或(c) – 0xhacker 2013-03-19 18:58:52
時,我將不得不手動編輯代碼您想要爲舊提交結賬? – Hauleth 2013-03-19 19:00:12