在提交时恢复对文件的更改

我只想恢复特定提交对给定文件所做的更改。

我可以使用git revert命令吗?

还有其他简单的方法吗?

103848 次浏览

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

(从git-shell-scripts实用程序到Smtlaissezfaire


注意:

如果您还没有提交当前的修改,另一种方法是在这里描述

git checkout -- filename

git checkout为文件提供了一些选项,从HEAD修改文件,覆盖您的更改。


掉在.卡布里卡上提到在评论中

您可以向Git添加一个别名,这样您就可以执行git revert-file <hash> <file-loc>并恢复该特定文件。
请参见这个要点

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

我会简单地使用--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 show some_commit_sha1 -- some_file.c | git apply -R

类似于VonC的响应,但使用git showgit apply

假设可以更改提交历史记录,下面是在早期提交中恢复单个文件中的更改的工作流:

例如,您希望在提交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 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

这样,已经在提交中的文件将被删除并恢复。

应从进行提交的分支开始执行上述步骤。

您可以按照以下步骤操作:

  1. git revert -n <*commit*>-n恢复所有更改,但不会 提交它们)
  2. git add <*filename*>(要恢复的文件的名称&;犯罪)
  3. git commit -m 'reverted message'(添加还原消息)
  4. 提交
  5. 后,放弃其他文件更改,使文件保留 已使用还原
  6. 前提交的更改进行更新

如果你想重新设置上次提交的文件,这是我通常使用的。我认为这是最简单的解决办法。

请注意,该文件将被添加到临时区域。

git checkout <prev_commit_hash> -- <path_to_your_file>

希望能有所帮助:)