从git中的单个目录还原更改

从git中的单个目录还原更改,git,git-revert,Git,Git Revert,我找不到一个很好的匹配,但必须有一个更短的方法来做到这一点。。。假设我们有一个项目的子树,picking,作为本地存储库,我想回到12月11日的修订版6b6e73b3e77176a8a80ae01a1844914102728acd,也就是撤销上面的六个提交(在编写本文时)。通过阅读文档,我知道我可以做到: git revert commit1 commit2 commit3 commit4 commit5 commit6 但肯定有一种更简单、更普遍的方法,比如说: git revert HEA

我找不到一个很好的匹配,但必须有一个更短的方法来做到这一点。。。假设我们有一个项目的子树,picking,作为本地存储库,我想回到12月11日的修订版6b6e73b3e77176a8a80ae01a1844914102728acd,也就是撤销上面的六个提交(在编写本文时)。通过阅读文档,我知道我可以做到:

git revert commit1 commit2 commit3 commit4 commit5 commit6
但肯定有一种更简单、更普遍的方法,比如说:

git revert HEAD...6b6e73b3e77176a8a80ae01a1844914102728acd \
        src/vs/editor/contrib/codelens
这给了我“致命的:糟糕的修订‘src/vs/editor/contrib/codelens’”

当然,做:

git checkout 6b6e73b3e77176a8a80ae01a1844914102728acd \
        src/vs/editor/contrib/codelens

为给定的目录提供了所需的修订版,但我希望有一个git生成的恢复日志,以便进行跟踪,等等。

我进行了实验,得出结论这不是一个好主意,但本着共享的精神,这是我想到的。首先,为了获得要还原的版本列表,我执行了以下操作:

git log --first-parent --no-merges --pretty=format:"%h" \
                  HEAD...6b6e73b3e77176a8a80ae01a1844914102728acd .
git revert --no-commit $(git log --first-parent --no-merges --pretty=format:"%h" \
                  HEAD...6b6e73b3e77176a8a80ae01a1844914102728acd .)
因此,为了将其输入git revert,我做了:

git log --first-parent --no-merges --pretty=format:"%h" \
                  HEAD...6b6e73b3e77176a8a80ae01a1844914102728acd .
git revert --no-commit $(git log --first-parent --no-merges --pretty=format:"%h" \
                  HEAD...6b6e73b3e77176a8a80ae01a1844914102728acd .)
然而,在我自己的存储库中,事情变得一团糟,并且有很多合并冲突,所以我放弃了,并这样做了:

git revert --abort
git checkout 6b6e73b3e77176a8a80ae01a1844914102728acd \
        src/vs/editor/contrib/codelens
然后手动添加以下结果:

git log --first-parent --no-merges --oneline \
                  HEAD...6b6e73b3e77176a8a80ae01a1844914102728acd .

提交到提交消息。

如果提交对其他目录有更改怎么办?是否也应该将它们还原?我假设它们不会,但即使它们还原,我也可以使用
git checkout
将它们还原为
HEAD
,以便我们可以忽略此问题。一句话:一般来说,
--first parent
--no merges
的组合可能会隐藏修改目录的步骤。我建议您查看一下您单独使用
--第一父级
--无合并
时看到的提交列表