在我的git倉庫中,跟蹤svn倉庫,我對一個文件進行了一些編輯。git選擇性恢復文件的本地更改
現在我想恢復這些更改(如svn恢復),但只有部分文件。
我希望能夠查看文件上的差異,放棄(恢復)我不想要的更改並保留所需的更改。
的
git add -i
命令似乎有一個選項來做到這一點,但我不想尚未階段這一點。
在我的git倉庫中,跟蹤svn倉庫,我對一個文件進行了一些編輯。git選擇性恢復文件的本地更改
現在我想恢復這些更改(如svn恢復),但只有部分文件。
我希望能夠查看文件上的差異,放棄(恢復)我不想要的更改並保留所需的更改。
的
git add -i
命令似乎有一個選項來做到這一點,但我不想尚未階段這一點。
您可以直接使用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
,清理集結區。
你可以對文件運行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
看起來像你想
git revert --no-commit $REVSISON
然後可以使用
git diff --cached
,看看會做出怎樣的改變commiting之前(如需要恢復的僅僅是在前進方向上的承諾是複製過去的變化)
如果你是一個pur e Git存儲庫,您可以根據自己的目標利用交互式重定位(git rebase -i
)返回到您不喜歡的提交,並追溯編輯提交,以便您不喜歡的更改從未發生過,但通常情況下只適用於如果你知道你永遠不會想再看到它。
重新閱讀這個問題,它聽起來像是要恢復工作樹中的更改,而不是之前已經提交的更改,但其他一些答案使其聽起來像我的閱讀可能是錯誤的。你能澄清嗎?
如果變化只是在你的工作拷貝,然後做到這一點的最簡單方法是階段,你要保持與變化:
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>
可以「暫停」更改。
我相信你可以做到這一點最簡單的:
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.
的答案下面介紹的命令行選項是很方便的文件的時候在我通過ssh終端訪問的服務器上。 但是,當文件在我的本地機器上時,我更喜歡以下方式:
在netbeans編輯器(它附帶有git支持)中打開該文件。 Netbeans在行號處標記紅色/綠色/藍色標記以指示哪些內容被刪除/添加/修改(分別)。
右鍵單擊這些標記中的任何一個都可以讓您選擇撤銷該更改。 此外,您可以右鍵單擊紅色和藍色標記以查找彈出窗口中的舊版本。
我在我的補丁文件中有2個hunk,並刪除了一個。不知道是什麼原因,但補丁-R一直拒絕與此。 – Pradeep 2009-07-10 12:40:55
您在另一條評論中提到`git diff`顯示整個文件已更改。這通常發生在您使用與之前不同的行結尾保存文件時。這也會導致`patch`拒絕補丁文件。這聽起來像可能發生的事情嗎? – 2009-07-10 12:50:13
你是對的。每當我使用patch命令時,行結束符都會切換。我在窗戶上使用cream/vim。首先需要對此進行分類。 – Pradeep 2009-07-10 12:58:23