我想将特定提交所做的更改还原到给定文件。
我可以使用git revert命令吗?
还有其他简单方法吗?
答案 0 :(得分:141)
我所见过的最简洁的方法是here
git show some_commit_sha1 -- some_file.c | git apply -R
与VonC的回复相似,但使用git show
和git apply
。
答案 1 :(得分:24)
假设可以更改提交历史记录,这里是一个工作流程,可以在之前的提交中恢复单个文件中的更改:
例如,您希望在提交badfile.txt
中还原1个文件(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)完成rebase:
git rebase --continue
答案 2 :(得分:19)
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
(来自git-shell-scripts的smtlaissezfaire实用程序)
注意:
另一种方式是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
答案 3 :(得分: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
摆脱了我们不想保留的剩余文件还原。
答案 4 :(得分:4)
git reset HEAD^ path/to/file/to/revert/in/commit
以上命令将文件从提交中删除,但它将反映在git status
。
git checkout path/to/file/to/revert/in/commit
上述命令将恢复更改(因此您获得与HEAD相同的文件)。
git commit
(通过--amend
修改提交。)
git push
这样,已删除并恢复已提交的文件。
应该从提交提交的分支开始执行上述步骤。
答案 5 :(得分:3)
更简单:
git reset HEAD^ path/to/file/to/revert
然后
git commit --amend
然后
git push -f
文件消失了,提交哈希,消息等是一样的。
答案 6 :(得分:1)
如果您想重置上次提交时对文件所做的更改,这就是我通常使用的方法。我认为这是最简单的解决方案。
请注意,该文件将被添加到暂存区域。
git checkout <prev_commit_hash> -- <path_to_your_file>
希望它会有所帮助:)
答案 7 :(得分:0)
您可以按照以下步骤操作:
git revert -n <*commit*>
(-n
还原所有更改,但不会
提交他们)git add <*filename*>
(您要还原并提交的文件的名称)git commit -m 'reverted message'
(添加要还原的消息)