是否可以仅还原单个文件或在多文件提交中还原文件中的某些更改?
全文 我提交了一堆文件。一些提交之后,一个将保持匿名的人(JACK !!!)将文件复制到他的存储库中,并提交了几个文件,覆盖了我所做的某些更改。我想还原一个被破坏或更严重的文件,请进入并还原该文件中的两个更改。由于它已被拉入和推入,因此必须是单独的还原提交。
--3way结果会导致合并冲突,而不是无法应用补丁。
是否可以仅还原单个文件或在多文件提交中还原文件中的某些更改?
全文 我提交了一堆文件。一些提交之后,一个将保持匿名的人(JACK !!!)将文件复制到他的存储库中,并提交了几个文件,覆盖了我所做的某些更改。我想还原一个被破坏或更严重的文件,请进入并还原该文件中的两个更改。由于它已被拉入和推入,因此必须是单独的还原提交。
--3way结果会导致合并冲突,而不是无法应用补丁。
Answers:
您可以通过添加'--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
git add -p可以启动一个交互式会话,该会话允许您选择性地添加文件块,而不是整个文件。(还有git reset -p选择性地取消变更的步骤。很高兴知道,但在这种情况下可能不是您想要的。)
revert,reset,stash -p(藏“取消,我不想actualy化妆”),add其余部分commit
您只需使用即可手动检出要还原的文件的旧旧内容git checkout。例如,如果您想还原my-important-file到version中的版本abc123,则可以执行
git checkout abc123 -- my-important-file
现在您有了my-important-fileback 的旧内容,甚至可以根据需要对其进行编辑,然后像往常一样提交以进行提交,以恢复他所做的更改。如果您只想还原其提交的某些部分,请使用git add -p,从您提交的补丁中仅选择一些块。
revert,您只是在取回文件的旧版本。适当的人员revert将删除文件中的错误提交修改,即使自该错误提交以来已对其进行了多次修改,并且您也不想丢失这些修改。
git checkout -p。
我在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的回答可能更实际):
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
git show ... > foo.txt (2)编辑foo.txt以删除差异,我不想还原(3) git apply --reverse foo.txt还原仍在中列出的差异foo.txt。