我可以在GIT中进行部分还原吗?

时间:2011-04-14 20:36:50

标签: git

是否可以在多文件提交中仅还原单个文件或文件中的某些更改?

全文 我提交了一堆文件。许多提交后来有人将保持无名(JACK !!!)将文件复制到他的存储库并提交了几个文件,覆盖了我所做的一些更改。我想恢复已被破坏或更好的一个文件,进入并恢复该文件中的两个更改。这是必须的一个单独的恢复提交,因为它被拉动和推动。

4 个答案:

答案 0 :(得分:175)

您可以通过添加“--no-commit”选项来还原提交而不创建新提交。这会将所有已还原的文件保留在暂存区域中。从那里开始,我会执行软复位并添加我真正想要的更改。有关示例工作流程:

git revert <sha-of-bad-commit> --no-commit
git reset   // This gets them out of the staging area
<edit bad file to look like it should, if necessary>
git add <bad-file>
git checkout . // This wipes all the undesired reverts still hanging around in the working copy
git commit

答案 1 :(得分:77)

您可以使用checkout命令以交互方式应用旧版本的文件。

例如,如果您知道删除了要添加的代码的COMMIT,则可以运行以下命令:

git checkout -p COMMIT^ -- FILE_TO_REVERT

Git会提示您添加当前版本文件中缺少的数据。您可以使用e创建更改补丁,然后再将其应用。

答案 2 :(得分:38)

您只需使用git checkout手动检查要还原的文件的旧内容即可。例如,如果您要将my-important-file还原为版本abc123中的版本,则可以执行

git checkout abc123 -- my-important-file

现在你有my-important-file的旧内容,如果你愿意,甚至可以编辑它们,并像往常一样提交一个将恢复他所做的更改的提交。如果他想要恢复其提交的某些部分,请使用git add -p从您正在提交的修补程序中仅选择几个人。

答案 3 :(得分:28)

我在Git邮件列表上找到了一种方法:

git show <commit> -- <path> | git apply --reverse

来源:http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406

的变化

如果补丁不能完全应用,那么该命令会失败(不会导致任何更改),但是--3way您会遇到冲突,然后您可以手动解决(在这种情况下Casey's answer可能更实用) :

git show <commit> -- <path> | git apply --reverse --3way

您也可以使用它来部分还原多个提交,例如:

git log -S<string> --patch | git apply --reverse

在任何提交中还原更改为<string>的文件。这正是我在用例中所需要的(一些单独的提交引入了对不同文件的类似更改,以及以不相关的方式更改其他文件,我不想回复)。

如果您在diff.noprefix=true中设置了~/.gitconfig,那么您需要在-p0命令中添加git apply,例如

git show <commit> -- <path> | git apply -p0 --reverse