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

Clu*_*tch 141 git

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

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

bob*_*vil 188

您可以通过添加'--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
Run Code Online (Sandbox Code Playgroud)

  • 软复位后,您还可以执行`git add -p`来启动交互式会话,该会话允许您有选择地添加文件块而不是整个文件.(还有`git reset -p`可以选择性地取消更改.很高兴知道,但在这种情况下可能不是你想要的.) (41认同)
  • 这正是我正在寻找的:恢复到工作副本,交互式选择块,提交。为此,你应该得到一个又大又咸的男人接吻:* (6认同)
  • 受此启发的另一种解决方案是“恢复”、“重置”、“存储 -p”(存储“取消我实际上不想做的”)、“添加”其余部分、“提交” (2认同)

cmc*_*nty 81

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

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

git checkout -p COMMIT^ -- FILE_TO_REVERT
Run Code Online (Sandbox Code Playgroud)

Git会提示您添加当前版本文件中缺少的数据.您可以e在应用之前创建更改补丁.


Bri*_*ell 39

您只需手动检查要还原的文件的旧内容即可git checkout.例如,如果要恢复my-important-file到版本中的版本abc123,则可以执行此操作

git checkout abc123 -- my-important-file
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是一个`revert`,你只是收回了旧版本的文件.一个正确的`revert`将删除文件中的错误提交修改,即使它自那次错误的提交已经多次修改,你也不想放弃那些**修改. (19认同)
  • Totor,看我的答案.您可以使用'-p'来保存修改.答案实际上与这个非常接近. (2认同)

ntc*_*tc2 28

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

git show <commit> -- <path> | git apply --reverse
Run Code Online (Sandbox Code Playgroud)

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

变化

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

git show <commit> -- <path> | git apply --reverse --3way
Run Code Online (Sandbox Code Playgroud)

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

git log -S<string> --patch | git apply --reverse
Run Code Online (Sandbox Code Playgroud)

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

如果你已经diff.noprefix=true设置了~/.gitconfig你需要添加-p0git apply命令,例如

git show <commit> -- <path> | git apply -p0 --reverse
Run Code Online (Sandbox Code Playgroud)