176

我只想将特定提交所做的更改还原到给定文件。

我可以为此使用 git revert 命令吗?

还有其他简单的方法吗?

4

8 回答 8

285

这里描述了我见过的最干净的方法

git show some_commit_sha1 -- some_file.c | git apply -R

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

于 2011-08-25T20:12:58.840 回答
54

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

例如,您想badfile.txt在 commit 中恢复 1 个文件 ( ) 中的更改aaa222

aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit

基于基本提交,修改问题提交,然后继续。

1)启动交互式变基:

git rebase -i aaa111

pick2)通过更改为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
于 2015-09-11T16:32:38.487 回答
21

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 修改文件,覆盖您的更改。


Dropped.on.Caprica在评论中提到:

您可以向 git 添加别名,以便您可以执行git revert-file <hash> <file-loc>并恢复该特定文件。
请参阅此要点

[alias]
  revert-file = !sh /home/some-user/git-file-revert.sh
于 2010-04-12T08:54:03.067 回答
17

简单得多:

git reset HEAD^ path/to/file/to/revert

然后

git commit --amend   

接着

git push -f

文件不见了,提交哈希、消息等是相同的。

于 2017-05-19T15:37:20.107 回答
13

我会简单地使用该--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删除了我们不想保留的剩余文件还原。

于 2010-04-17T22:50:56.087 回答
9
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

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

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

于 2018-03-12T11:44:46.467 回答
8

如果您想从上次提交中重置文件的更改,这就是我通常使用的。我认为这是最简单的解决方案。

请注意,该文件将被添加到暂存区。

git checkout <prev_commit_hash> -- <path_to_your_file>

希望能帮助到你 :)

于 2020-04-08T14:28:46.363 回答
5

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

  1. git revert -n <*commit*>-n还原所有更改但不会提交)
  2. git add <*filename*>(您要还原和提交的文件的名称)
  3. git commit -m 'reverted message'(添加回复消息)
  4. 提交后丢弃其他文件更改,以便文件使用您在还原之前提交的更改保持更新
于 2019-04-09T20:43:28.003 回答