回答
我已經看到了這樣做的乾淨的方式描述here
git show some_commit_sha1 -- some_file.c | git apply -R
到VonC的答覆,但使用git show
和git apply
類似。
轟!你是男人。 – yitznewton 2013-09-12 23:56:35
很好地完成。腳本解決方案對此是矯枉過正的。爲什麼不能只有git恢復sha-1文件名? – 2014-02-01 19:47:40
不錯,但VonCs也不錯。在這兩個都有東西學習每一天在混帳:) – hakre 2014-07-28 10:39:14
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
(從從smtlaissezfaire的git-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
只需添加到這裏的討論,你可以添加一個別名混帳,所以你可以做'git revert-file
@ Dropped.on.Caprica好點。我已經將它包含在答案中以提高可見性。 – VonC 2015-04-02 19:34:58
謝謝!我更新了你的文章,以適應正確的用法,但其他好東西! – 2015-04-02 20:50:22
我會簡單地使用--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
擺脫了剩餘的文件恢復,我們不想保留。
假設它是確定修改提交歷史,這裏的恢復在一個單一的文件更改工作流程的早期承諾:
例如,你想在一個文件中(badfile.txt
)還原更改在提交aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
底墊的託基礎上,提交,修改提交問題,&繼續。
1)啓動交互式的rebase:
git rebase -i aaa111
2)標記問題提交在編輯器中編輯通過改變pick
到e
(編輯):
e aaa222
pick aaa333
3)還原更改壞文件:
git show -- badfile.txt | git apply -R
4)添加更改&修改承諾:
git add badfile.txt
git commit --amend
5)完成底墊:
git rebase --continue
只是想指出,這裏假設你可以編輯git歷史記錄。上面的一些答案創建了一個新的提交,它可以在不編輯歷史的情況下反轉特定的更改,但這並不總是可行的。 – angularsen 2016-11-17 08:42:14
這個解決方案是我的選擇,並且工作完美!互動rebase可以做很多魔術:)謝謝! – 2017-03-01 13:54:47
簡單多了:
git reset HEAD^ path/to/file/to/revert
然後
git commit --amend
然後
git push -f
該文件不存在,並提交散列,消息等是相同的。
爲了完整性,你需要'git checkout - path/to/file/to/revert'步驟嗎?而且,之後的哈希值是不一樣的,對嗎?最後一句可能會更好,如下所示:「結果是最後一次提交被新文件替換,只是它不包含對已還原文件的更改。」 – Kevin 2017-12-20 17:16:41
- 1. 還原SVN中的提交?
- 2. 在Git中還原Unstaged對單個文件的更改
- 3. 將其還原爲提交文件
- 4. 在GIT中還原未提交的文件
- 5. 簡單地還原來自提交的更改
- 6. 還原DataGridView中的更改?
- 7. 還原.bash_profile中的更改?
- 8. 從git中的舊提交還原文件
- 9. 還原式未提交
- 10. 如何在提交對話框中顯示哪些文件具有「提交後還原」?
- 11. 如何完成還原提交以及如何還原大量提交
- 12. 針對已更改但未更改的特定文件提交更改
- 13. git:如何在提交時忽略對文件的更改?
- 14. 還原屬性的更改
- 15. 如何「取消還原」還原的Git提交?
- 16. TFS提交未更改的文件
- 17. Git將所有提交的原始/主文件提交到原始/主文件中的單個提交
- 18. 在Visual Studio中還原對UI的更改
- 19. 如何將單個文件還原爲我在Mercurial中提交的版本?
- 20. LINQ提交更改不提交更改
- 21. 如何在我的提交之前插入已提交的提交,並還原那些已提交的提交?
- 22. 還原一個Git合併提交,然後恢復該還原
- 23. 還原ClearCase中的用戶更改
- 24. 如何還原Pycharm中的更改
- 25. 如何還原couchdb中的更改?
- 26. 文件在提交之間改變,但限制文件列表更舊提交
- 27. 手動還原更改
- 28. 當還原店更改
- 29. git重新提交已還原的提交
- 30. 提交文件夾更改爲顛覆
重複的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
奇怪......爲什麼變化畢竟那些年? – VonC 2017-09-05 12:08:45