我只想将特定提交所做的更改还原到给定文件。
我可以为此使用 git revert 命令吗?
还有其他简单的方法吗?
这里描述了我见过的最干净的方法
git show some_commit_sha1 -- some_file.c | git apply -R
类似于 VonC 的响应,但使用git show
and git apply
。
假设可以更改提交历史记录,以下是在早期提交中还原单个文件中的更改的工作流程:
例如,您想badfile.txt
在 commit 中恢复 1 个文件 ( ) 中的更改aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
基于基本提交,修改问题提交,然后继续。
1)启动交互式变基:
git rebase -i aaa111
pick
2)通过更改为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 revert
适用于提交中的所有文件内容。
对于单个文件,您可以编写脚本:
#!/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实用程序)
笔记:
如果您尚未提交当前修改,此处描述了另一种方法。
git checkout -- filename
git checkout
有一些文件选项,从 HEAD 修改文件,覆盖您的更改。
您可以向 git 添加别名,以便您可以执行
git revert-file <hash> <file-loc>
并恢复该特定文件。
请参阅此要点。
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
简单得多:
git reset HEAD^ path/to/file/to/revert
然后
git commit --amend
接着
git push -f
文件不见了,提交哈希、消息等是相同的。
我会简单地使用该--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
“取消暂存”所有文件,这样我们就可以只添加我们想要恢复的一个文件。finalgit-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 checkout <prev_commit_hash> -- <path_to_your_file>
希望能帮助到你 :)
您可以按照以下步骤操作:
git revert -n <*commit*>
(-n
还原所有更改但不会提交)git add <*filename*>
(您要还原和提交的文件的名称)git commit -m 'reverted message'
(添加回复消息)