我想撤销特定提交所做的文件更改。
我可以使用git revert命令吗?
还有其他简单的方法吗?
我想撤销特定提交所做的文件更改。
我可以使用git revert命令吗?
还有其他简单的方法吗?
我见过的最干净的做法在这里描述。
git show some_commit_sha1 -- some_file.c | git apply -R
与VonC的回答类似,但使用git show
和git apply
。
som_file.c
包含了文件的路径,如果有的话,否则你将会悄无声息地修补错误 :) - Warpling如果可以更改提交历史,这里有一个撤销先前提交中单个文件更改的工作流程:
例如,您想要撤销提交 aaa222
中 1 个文件 (badfile.txt
) 中的更改:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
在基础提交上变基,修改问题提交,然后继续。
1) 开始交互式变基:
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 reset HEAD^ path/to/file/to/revert
然后
git commit --amend
然后
git push -f
文件已经消失,但提交哈希值、信息等内容保持不变。
git checkout -- path/to/file/to/revert
步骤吗?此外,事实并非如此,哈希值之后也不同,对吧?最后一句话可能更好地表述为:“结果是最后一个提交被一个新的提交所替换,两者唯一的区别在于新提交不包含对还原文件的更改。” - Kevingit 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 提供)
git checkout -- filename
git checkout
命令有一些选项可以针对文件进行操作,从HEAD中修改文件,覆盖您的更改。
你可以为git添加别名,这样你就可以使用
git revert-file <hash> <file-loc>
来还原特定的文件。
查看此gist。
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
并还原特定文件。 我从这个答案中提取(尽管我不得不进行一些编辑才能正常工作)。 您可以在此处找到我的.gitconfig
和编辑后的脚本的副本:https://gist.github.com/droppedoncaprica/5b67ec0021371a0ad438 - AlbertEngelB如果您想要将文件的更改恢复到上次提交的状态,这是我通常使用的方法。我认为这是最简单的解决方案。
请注意,该文件将被添加到暂存区。
git checkout <prev_commit_hash> -- <path_to_your_file>
希望它有所帮助 :)我会简单地使用--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
会“取消暂存”所有文件,这样我们就可以只添加回想要还原的那个文件。最后的git-reset --hard
会丢弃我们不想保留的其余文件还原。
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
通过这样做,已经提交的文件被删除并还原。
上述步骤应该在提交所在的分支中执行。
git revert -n <*commit*>
(-n
撤消所有更改但不会提交它们)git add <*filename*>
(要恢复和提交的文件名)git commit -m 'reverted message'
(添加一个撤销的消息)