还原对提交中的文件的更改

Lak*_*sad 97 git version-control revert

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

我可以使用git revert命令吗?

还有其他简单的方法吗?

mga*_*lgs 173

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

git show some_commit_sha1 -- some_file.c | git apply -R
Run Code Online (Sandbox Code Playgroud)

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

  • 这适用于我的Mac,但在Windows上(在Cygwin下),它给了我:`致命:无法识别的输入` (12认同)
  • 做得很好.脚本解决方案对此有点矫枉过正.为什么不能只有git还原sha-1文件名? (9认同)
  • 不适用于二进制文件。尽管如此,我还是复制了原始文件并执行了 git add/git commit --amend。 (5认同)
  • 只是一个提示,我几乎总是必须添加`-3`标志,当补丁失败时,git申请三向合并,因为我通常会在时间上纠正一点变化. (3认同)
  • 也许对大多数人来说很明显,但确保`some_file.c` 包含文件的*path*,否则你将默默地不打补丁:) (3认同)
  • 我收到此错误``错误:补丁失败:<文件名>:<行号>错误:<文件名>:补丁不​​适用``` (2认同)

tee*_*tee 26

假设可以更改提交历史记录,这里是一个工作流,用于在先前的提交中还原单个文件中的更改:

例如,您想要badfile.txt在提交中还原1个文件()中的更改aaa222:

aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Run Code Online (Sandbox Code Playgroud)

重新基础提交,修改问题提交,继续.

1)启动交互式rebase:

git rebase -i aaa111
Run Code Online (Sandbox Code Playgroud)

2)通过更改picke(用于编辑)在编辑器中标记要编辑的问题提交:

e aaa222
pick aaa333
Run Code Online (Sandbox Code Playgroud)

3)还原对坏文件的更改:

git show -- badfile.txt | git apply -R
Run Code Online (Sandbox Code Playgroud)

4)添加更改并修改提交:

git add badfile.txt
git commit --amend
Run Code Online (Sandbox Code Playgroud)

5)完成rebase:

git rebase --continue
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 19

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
Run Code Online (Sandbox Code Playgroud)

(来自smtlaissezfairegit-shell-scripts实用程序)


注意:

如果您尚未提交当前修改,则此处描述了另一种方法.

git checkout -- filename
Run Code Online (Sandbox Code Playgroud)

git checkout 有一些文件选项,从HEAD修改文件,覆盖您的更改.


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

您可以为git添加别名,这样您就git revert-file <hash> <file-loc>可以恢复该特定文件.
看到这个要点.

[alias]
  revert-file = !sh /home/some-user/git-file-revert.sh
Run Code Online (Sandbox Code Playgroud)


Dan*_*ing 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
Run Code Online (Sandbox Code Playgroud)

第一个git-reset"unstages"所有文件,以便我们可以添加回我们想要还原的文件.最终git-reset --hard摆脱了我们不想保留的剩余文件还原.


For*_*est 6

简单得多:

git reset HEAD^ path/to/file/to/revert
Run Code Online (Sandbox Code Playgroud)

然后

git commit --amend   
Run Code Online (Sandbox Code Playgroud)

然后

git push -f
Run Code Online (Sandbox Code Playgroud)

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


小智 5

git reset HEAD^ path/to/file/to/revert/in/commit
Run Code Online (Sandbox Code Playgroud)

上面的命令将从提交中删除文件,但会在中反映出来git status

git checkout path/to/file/to/revert/in/commit
Run Code Online (Sandbox Code Playgroud)

上面的命令将还原更改(结果是您获得与HEAD相同的文件)。

git commit
Run Code Online (Sandbox Code Playgroud)

(通过--amend以修改提交。)

git push
Run Code Online (Sandbox Code Playgroud)

这样,已提交中的文件将被删除并还原。

应该从进行提交的分支中遵循上述步骤。


小智 5

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

  1. git revert -n <*commit*>-n还原所有更改但不会提交它们)
  2. git add <*filename*> (要还原和提交的文件的名称)
  3. git commit -m 'reverted message' (添加回复消息)
  4. 提交后丢弃其他文件更改,以便文件保持更新与还原之前提交的更改


Gab*_*eka 5

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

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

git checkout <prev_commit_hash> -- <path_to_your_file>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • 如果您不想重写历史,这就是您要走的路。我一直在使用它来清理在压缩合并之前不需要接触的文件。然后无论如何,搅动都会被铺平。 (3认同)