2010-04-12 42 views
50

我想僅將特定提交所做的更改還原爲給定文件。在提交中還原對文件的更改

我可以使用git revert命令嗎?

任何其他簡單的方法來做到這一點?

+0

重複的http://stackoverflow.com/questions/215718/reset-or-revert-a-specific-file-to-a-specific-revision-using-git/215768 – koppor 2016-12-09 15:15:24

+0

奇怪......爲什麼變化畢竟那些年? – VonC 2017-09-05 12:08:45

回答

90

我已經看到了這樣做的乾淨的方式描述here

git show some_commit_sha1 -- some_file.c | git apply -R 

到VonC的答覆,但使用git showgit apply類似。

+2

轟!你是男人。 – yitznewton 2013-09-12 23:56:35

+6

很好地完成。腳本解決方案對此是矯枉過正的。爲什麼不能只有git恢復sha-1文件名? – 2014-02-01 19:47:40

+0

不錯,但VonCs也不錯。在這兩個都有東西學習每一天在混帳:) – hakre 2014-07-28 10:39:14

18

git revert適用於提交中的所有文件內容。

對於單個文件,您可以script it

#!/bin/bash 

function output_help { 
    echo "usage: git-revert-single-file <sha1> <file>" 
} 

sha1=$1 
file=$2 

if [[ $sha1 ]]; then 
git diff $sha1..$sha1^ -- $file | patch -p1 
else 
output_help 
fi 

(從從smtlaissezfairegit-shell-scripts公用事業)


注:

另一種方式是described here如果你還沒有提交您當前的修改。

git checkout -- filename 

git checkout有一些文件選項,從HEAD修改文件,覆蓋您的更改。


Dropped.on.Caprica提到in the comments

您可以添加一個別名與git所以你可以做git revert-file <hash> <file-loc>,並有具體的文件中恢復。
this gist

[alias] 
    revert-file = !sh /home/some-user/git-file-revert.sh 
+0

只需添加到這裏的討論,你可以添加一個別名混帳,所以你可以做'git revert-file '並且該特定文件被恢復。我從這個答案中解脫出來(儘管我必須做幾次編輯才能正確工作)。你可以在這裏找到我的.gitconfig和腳本的副本: https://gist.github.com/droppedoncaprica/5b67ec0021371a0ad438 – 2015-04-02 18:49:03

+0

@ Dropped.on.Caprica好點。我已經將它包含在答案中以提高可見性。 – VonC 2015-04-02 19:34:58

+0

謝謝!我更新了你的文章,以適應正確的用法,但其他好東西! – 2015-04-02 20:50:22

12

我會簡單地使用--no-commit選項git-revert然後最終提交前刪除您不想從索引中恢復的文件。這裏是展示瞭如何輕鬆地還原只是改變在第二最近到foo.c中犯的一個例子:

$ git revert --no-commit HEAD~1 
$ git reset HEAD 
$ git add foo.c 
$ git commit -m "Reverting recent change to foo.c" 
$ git reset --hard HEAD 

第一git-reset「unstages」的所有文件,這樣我們就可以重新添加只是一個文件,我們想要恢復。最後git-reset --hard擺脫了剩餘的文件恢復,我們不想保留。

15

假設它是確定修改提交歷史,這裏的恢復在一個單一的文件更改工作流程的早期承諾:

例如,你想在一個文件中(badfile.txt)還原更改在提交aaa222

aaa333 Good commit 
aaa222 Problem commit containing badfile.txt 
aaa111 Base commit 

底墊的託基礎上,提交,修改提交問題,&繼續。

1)啓動交互式的rebase:

git rebase -i aaa111 

2)標記問題提交在編輯器中編輯通過改變picke(編輯):

e aaa222 
pick aaa333 

3)還原更改壞文件:

git show -- badfile.txt | git apply -R 

4)添加更改&修改承諾:

git add badfile.txt 
git commit --amend 

5)完成底墊:

git rebase --continue 
+0

只是想指出,這裏假設你可以編輯git歷史記錄。上面的一些答案創建了一個新的提交,它可以在不編輯歷史的情況下反轉特定的更改,但這並不總是可行的。 – angularsen 2016-11-17 08:42:14

+0

這個解決方案是我的選擇,並且工作完美!互動rebase可以做很多魔術:)謝謝! – 2017-03-01 13:54:47

1

簡單多了:

git reset HEAD^ path/to/file/to/revert 

然後

git commit --amend 

然後

git push -f 

該文件不存在,並提交散列,消息等是相同的。

+0

爲了完整性,你需要'git checkout - path/to/file/to/revert'步驟嗎?而且,之後的哈希值是不一樣的,對嗎?最後一句可能會更好,如下所示:「結果是最後一次提交被新文件替換,只是它不包含對已還原文件的更改。」 – Kevin 2017-12-20 17:16:41