我只想将特定提交所做的更改仅还原到给定文件。
我可以使用git revert命令吗?
还有其他简单的方法吗?
我只想将特定提交所做的更改仅还原到给定文件。
我可以使用git revert命令吗?
还有其他简单的方法吗?
Answers:
git show some_commit_sha1 -- some_file.c | git apply -R
与VonC的响应类似,但使用git show
和git apply
。
fatal: unrecognized input
-3
在修补程序失败时向git 添加标志以申请三路合并,因为我通常会及时更正更改。
some_file.c
包含该文件的路径,否则您将默默地不打补丁:)
假定可以更改提交历史记录,以下是一个工作流程,可以在较早的提交中还原单个文件中的更改:
例如,您要badfile.txt
在commit中还原1个文件()中的更改aaa222
:
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
edit
没有显示为已更改。但是git show -- badfile.txt | git apply -R
给出了我需要的答案<3
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 revert-file <hash> <file-loc>
并恢复该特定文件。我从这个答案中解脱出来(尽管我必须进行一些编辑才能正常工作)。您可以.gitconfig
在此处找到我的脚本和编辑后的脚本的副本: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
我只需要使用--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 revert -n <*commit*>
(-n
还原所有更改,但不会提交)git add <*filename*>
(您要还原并提交的文件名)git commit -m 'reverted message'
(添加一条要还原的消息)