2011-03-05 107 views
6

下面是這種情況:我可以恢復一個特定的提交,以使它在文件中保留未刪除的內容嗎?

-I提出了很多大大小小的修改,我的文件,並沒有提交這些

-I決定使用和使用補丁命令的提交階段部分

-I試圖離開所有提交相關的,當我做到了

-I發現多次提交後,我不小心把在我應該在第一時間6犯前離開了變化,所以我恢復那個提交。

- 恢復刪除文件中的相關文本,這是預期的行爲。

最後一步是我想修改的那一步。我想要做的是恢復提交,但將文本留在文件中,以便我可以重新提交提交。我的方式是在回覆提交之前將HEAD區分爲提交,然後我複製並粘貼文本並對其進行修改,使其不是diff格式,因此我可以在文件中使用它,然後將其提交正常。

我知道我需要學習早期和經常做出承諾的習慣。我還沒有掌握它,但是,因爲當我只是在編碼時,它喜歡打斷我的思維。

我修正它的方式非常繁瑣。有沒有一種方法可以將文本保留在一個文件中,這個文件可以在恢復中被移除,就好像它是一個未分離的變化(有點像重置一樣)?除此之外的任何建議?

回答

7

可以運行兩次復歸,上次申請--no-commit將留在指數準備改變犯:

git revert <the commit you want back in the working tree> 
git revert HEAD --no-commit 

的變化正在上演,並準備一個新的提交。要unstage運行:

git reset HEAD 
+2

你可以說'git revert --no-commit HEAD' for第二個(不需要知道它的提交ID)。 – 2011-03-05 10:14:07

+0

太棒了!謝謝。我應該考慮一下:)我會編輯它。 – asgerhallas 2011-03-05 16:06:48

+0

這是一個非常好的方法來取消對很多文件的提交,並且通常當不想指定文件時。謝謝。 – minozake 2011-03-05 18:49:36

0
git reset -p <COMMITHASH> 

這會提示將補丁重新應用到索引。

請記住,這將選擇您提到的提交到索引的更改,這意味着它會嘗試將所有先前的6個提交應用於您的索引(反向)。您只需選擇要刪除的更改。

+0

這有利於在一系列提交(可以是分佈式的任何方式)多將恢復,但在這種情況下,我有一個特殊的復歸來選擇,因此這種方法是有點乏味通過工作,特別是如果我不得不手動編輯人羣。無論如何,謝謝你的答案。 – minozake 2011-03-05 18:55:35

0

後恢復提交,你可以在反向還原適用於「unrevert」它只是在工作樹:

git revert C &&     # you already did this part 
git show HEAD | git apply -R 

默認情況下,僅git apply修補工作樹。它也有選項來修補索引或索引和工作樹。因此,而不是使用git revert,你也可以使用git apply以相反的變化只適用於索引,然後提交(均無需接觸工作樹):

# assumption: we start with no staged changes, and have not reverted anything yet 

# revert C directly in the index (does not touch the working tree), then commit 
git show C | git apply --cached -R && 
git commit --edit -m'Reverted C' 
2

你運行git revert BADCOMMIT你之後

git checkout HEAD^ -- filename 

...這應該更新的filename你的工作副本的狀態復歸提交前:可以在此之前,與提交特定文件恢復到它的狀態。 (舊版本也將上演,所以如果你想取消它,請在git reset HEAD -- filename之後)。我認爲沒有更簡單的方法。

+0

這幫了很大忙。我相信我會一直使用它,直到我學會了良好的承諾。 – minozake 2011-03-05 18:45:16

相關問題