2009-07-10 56 views
123

在我的git倉庫中,跟蹤svn倉庫,我對一個文件進行了一些編輯。git選擇性恢復文件的本地更改

現在我想恢復這些更改(如svn恢復),但只有部分文件。

我希望能夠查看文件上的差異,放棄(恢復)我不想要的更改並保留所需的更改。

git add -i 

命令似乎有一個選項來做到這一點,但我不想尚未階段這一點。

回答

74

您可以直接使用git checkout -p來做到這一點。請參閱下面的Daniel Stutzbach's answer


老答案(之前被介紹checkout -p):

你可以這樣說:

git add -i 

(選擇要保留大塊)

git commit -m "tmp" 

現在,您只有對您所做的更改提交nt保留,其餘的不分配。

git reset --hard HEAD 

在這一點上,提交的修改已經被丟棄,讓您擁有一個乾淨的工作目錄,你要保持堅定頂部的變化。

git reset --mixed HEAD^ 

這會刪除最後一個提交('tmp'),但會保留您的工作目錄中的修改,爲非暫存。

編輯:用--mixed替換--soft,清理集結區。

3

你可以對文件運行git diff,保存生成的差異,修改或移除你要保存更改,然後運行它通過​​3210撤消剩餘的diff。

git diff file.txt >patch.tmp 
# edit patch.tmp to remove the hunks you want to keep 
patch -R <patch.tmp
+0

我在我的補丁文件中有2個hunk,並刪除了一個。不知道是什麼原因,但補丁-R一直拒絕與此。 – Pradeep 2009-07-10 12:40:55

+2

您在另一條評論中提到`git diff`顯示整個文件已更改。這通常發生在您使用與之前不同的行結尾保存文件時。這也會導致`patch`拒絕補丁文件。這聽起來像可能發生的事情嗎? – 2009-07-10 12:50:13

+0

你是對的。每當我使用patch命令時,行結束符都會切換。我在窗戶上使用cream/vim。首先需要對此進行分類。 – Pradeep 2009-07-10 12:58:23

2

看起來像你想

git revert --no-commit $REVSISON 

然後可以使用

git diff --cached 

,看看會做出怎樣的改變commiting之前(如需要恢復的僅僅是在前進方向上的承諾是複製過去的變化)

如果你是一個pur e Git存儲庫,您可以根據自己的目標利用交互式重定位(git rebase -i)返回到您不喜歡的提交,並追溯編輯提交,以便您不喜歡的更改從未發生過,但通常情況下只適用於如果你知道你永遠不會想再看到它。

1

重新閱讀這個問題,它聽起來像是要恢復工作樹中的更改,而不是之前已經提交的更改,但其他一些答案使其聽起來像我的閱讀可能是錯誤的。你能澄清嗎?

如果變化只是在你的工作拷貝,然後做到這一點的最簡單方法是階段,你要保持與變化:

git add -i <file> 

然後扔掉你不想要的變化通過檢查索引版本保持:

git checkout -- <file> 

然後unstage的變化,如果你不想讓他們上演尚未:

git reset -- <file> 

此配方只會將選定的更改還原到文件(或您指定的文件),並且不會創建任何需要還原的臨時提交。

如果你想選擇僅適用於一些在以前提交所做的更改,那麼你可以將文件恢復到以前提交狀態第一:

git reset <commit_before_first_unwanted_change> -- <file> 

然後你就可以按照git add -i <file>以前的配方階段您想要保留的那些更改,git checkout -- <file>可以丟棄不需要的更改,git reset -- <file>可以「暫停」更改。

279

我相信你可以做到這一點最簡單的:

git checkout -p <optional filename(s)> 

從手冊頁:

−p, −−patch 
     Interactively select hunks in the difference between the <tree−ish> 
     (or the index, if unspecified) and the working tree. The chosen 
     hunks are then applied in reverse to the working tree (and if a 
     <tree−ish> was specified, the index). 
 This means that you can use git checkout −p to selectively discard 
     edits from your current working tree. 
0

的答案下面介紹的命令行選項是很方便的文件的時候在我通過ssh終端訪問的服務器上。 但是,當文件在我的本地機器上時,我更喜歡以下方式:

在netbeans編輯器(它附帶有git支持)中打開該文件。 Netbeans在行號處標記紅色/綠色/藍色標記以指示哪些內容被刪除/添加/修改(分別)。

右鍵單擊這些標記中的任何一個都可以讓您選擇撤銷該更改。 此外,您可以右鍵單擊紅色和藍色標記以查找彈出窗口中的舊版本。