如何在不更改工作副本的情况下签出git修订版

时间:2014-06-20 06:42:13

标签: git

最近我一直在使用git系统将补丁应用为提交(Phabricator& Arcanist,但我不认为这对这个问题很重要)

我经常会遇到以提交形式应用补丁的情况,但我想编辑该提交。 当然,我总是可以进行编辑和git commit --amend,但我也希望能够git diff,使用meld .和其他工具,假设编辑是在顶部进行的最后一次提交。

目前,我执行以下操作。


git diff HEAD~1 > temp.diff
git reset --hard HEAD~1
git apply temp.diff
rm temp.diff

编辑补丁......

git commit -a

然而,这似乎有点笨拙,有没有办法将git存储库设置为另一个sha1,但保持当前工作副本完好无损?

2 个答案:

答案 0 :(得分:3)

您应该可以使用以下方法简化重置:

git reset @~

这会将HEAD重置为上一次提交,并将重置索引,但不是工作树
它使用默认的reset模式(如git reset --mixed

git diff应该会显示最后一个补丁是什么 git status应显示您上次修改的文件,随时可以修改/添加到索引并再次提交。

答案 1 :(得分:2)

根据您想要的确切行为,git reset --softgit reset --mixed会将当前提交更改为另一个提交(如果您在分支上,则通过重写分支标签)。他们都根据提交图执行此类操作:

[before `git reset`]

A - B - C - D   <-- HEAD=br1
      \
        E - F   <-- br2
          \
            G   <-- br3    [before `git reset`]

[after `git reset HEAD~1`]

            D   <-- only in reflog now
          /
A - B - C       <-- HEAD=br1
      \
        E - F   <-- br2
          \
            G   <-- br3

不同之处在于git reset --soft使工作目录和索引保持不变,而git reset --mixed保持工作目录不变,但更改索引以匹配重置提交。

(为了完整性,git reset --hard执行git reset --mixed所做的事情,但也更改工作目录以匹配重置提交。通过保存差异然后使用git apply重新应用它你得到git reset --mixed的效果。如果你计划重新add所有内容,--soft可能更有意义。请注意,git commit --amend基本上只是git reset --soft && git commit提交图和索引行为的术语。)