最近我一直在使用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,但保持当前工作副本完好无损?
答案 0 :(得分:3)
您应该可以使用以下方法简化重置:
git reset @~
这会将HEAD
重置为上一次提交,并将重置索引,但不是工作树。
它使用默认的reset
模式(如git reset --mixed
)
git diff
应该会显示最后一个补丁是什么
git status
应显示您上次修改的文件,随时可以修改/添加到索引并再次提交。
答案 1 :(得分:2)
根据您想要的确切行为,git reset --soft
和git 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
提交图和索引行为的术语。)