2009-11-21 49 views
2

恢復以前刪除的代碼(不一定是單個或整個文件)我刪除的類的功能可以從我的代碼而回,並承諾拆除。該功能被實現爲具有BDD風格規範的單個類,並且在使用該功能時,其他一些類在刪除提交中被更改。提交是乾淨的,因爲提交中唯一的變化是刪除這一個特性。在混帳

現在,我改變了主意,決定,我想回去只是因爲我刪除它,我做了一大堆的變化的特徵。 (我知道這是一種可能性,但我沒有保留副本,因爲我知道我可以將它從版本控制中解脫出來)。我發現了提交:cb2a6b1,當I:git show cb2a6b1時,我可以看到刪除的行。問題是我該如何將這些行重新應用到我的代碼中?

git diff cb2a6b1 cb2a6b1~1產生一個差異,重新刪除作爲一個添加,但它不會git apply,主要是因爲行號已更改。我可以手動將這些東西重新加入一些手動文本編輯,但有沒有更自動的替代方法?

回答

7

嘗試git revert cb2a6b1

如果它不能自動地找出正確的事情,它應該爲你展示合併衝突,您可以通過手工修復了。

1

另一種選擇是git rebase -i。它比git revert涉及更多,但您也有更多的選擇。

比方說,你有一個混帳回購協議只包含一個README文件:

$ cat README 
This is line alpha. 
Line Beta. 
Line Gamma. 

然後你刪除線測試並提交您的更改:

(make changes) 
$ git commit -am 'removed beta' 

現在,添加一些行,犯一路上:

(make changes) 
$git commit -am 'added delta' 
(make changes) 
$git commit -am 'added epsilon' 

現在我們的README文件和git的日誌是這樣的:

$ cat README 
This is line alpha. 
Line Gamma. 
Line Delta. 
Line Epsilon. 
$ git log --pretty=oneline 
56ae2db58905607270434045b2a7218237d3716e added epsilon 
058ec4b92fb279370f6e5b81c4aebb6250f93c6b added delta 
19801b380956b60f36b4922796ea86935a75e569 removed beta 
bc9057cebf05352eb5596eaf753708a14de589d2 initial commit 

現在我們決定不應該刪除測試版。 git rebase來拯救!每當我做任何重塑我喜歡使用臨時分支,因爲我正在改變歷史。

$ git checkout -b fixingthings 

現在我們想要重新佈置自我們初次提交以來發生的所有事情。看着日誌,這是提交bc9057c...。現在

$ git rebase -i bc9057c 

,你會在你的編輯器中看到這一點:

pick 19801b3 removed beta 
pick 058ec4b added delta 
pick 56ae2db added epsilon 

# Rebase bc9057c..56ae2db onto bc9057c 
# 
# Commands: 
# p, pick = use commit 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

底部的意見是有益的。只需要刪除與你想要擺脫提交的行,保存並退出,git會照顧其餘的。現在您的自述文件如下所示:

$ cat README 
This is line alpha. 
Line Beta. 
Line Gamma. 
Line Delta. 
Line Epsilon. 

這就像魔法!

如果你願意,你現在可以合併回你的主分支並刪除你的臨時分支。

$ git checkout master 
Switched to branch "master" 
$ git merge fixingthings 
Auto-merging README 
Merge made by recursive. 
$ git branch -d fixed 
Deleted branch fixingthings (was 1247141). 

git rebase做什麼是考慮每提交一個補丁,並重播它們按順序(或沒有,因爲你告訴它)。這意味着你可以合併衝突。如果這發生在你身上,rebase會暫停並讓你解決衝突。有很多關於在這種情況下做什麼的教程。 This one looked good to me.