我见过GIT commit --amend in detached HEAD state。这个问题要求答案比需要的要复杂得多。我想了解git commit --amend
在正常HEAD情况下的工作原理。
答案 0 :(得分:20)
假设您处于干净的工作状态,并且您的仓库看起来如下:
如果你再运行
git commit --amend
编写提交消息,保存并退出编辑器,发生以下情况:
f42c5
相同 - 用于创建新提交:31b8e
。它的父母将与您正在修改的提交的那些(那些)相同:f42c5
。master
分支引用以指向新提交(31b8e
)。HEAD
引用跟随master
。
请注意,修改后的提交(f42c5
)现在无法从您的仓库中的任何引用访问(因此我的图表上的“透明”样式)。它仍然存在于您的存储库的对象数据库中,但是当Git运行其定期内务处理时,或者如果您通过运行git gc
(垃圾收集)显式触发它,最终将被删除。
附录(基于Jason Baker's comment):请注意,只要修改后的提交f42c5
仍然存在于您的回购中,您就有办法找到答案它的提交ID(例如,通过从master
分支的reflog中捕获它),你仍然可以检查它。运行
git checkout master # just to be sure that master is the current branch
git reset --hard f42c5
或(假设您在此期间未对master
进行任何新提交,重置master
或以其他方式移动master
分支引用)
git checkout master # just to be sure that master is the current branch
git reset --hard master@{1}
会让你遇到以下情况:
但现在,提交31b8e
将无法访问。
答案 1 :(得分:5)
说你刚刚承诺" B"
... --- A --- B
^
|
master
HEAD
修改" B"将创建一个并行提交,成为新的分支头。
+---- B
|
... --- A --- B'
^
|
master
HEAD
B'是由B的变化加上您发出git commit --amend
时所发生的变更的组合而产生的提交。
答案 2 :(得分:0)
据我所知,ammend
因此起作用:
对于git commit --ammend
工作,修改的更改必须是 Stagging Area(SA)
git reset -- soft
将上次提交(提交修改)中提交的更改带回SA并将索引移至上一次提交(提交之前提交修改)。一切都保持在使用git commit
命令之前的状态。git add
包含要添加到新提交的所有文件(它将是 ammend commit )。要添加的文件是在git reset --soft
到达之前进入SA的文件,重置后这些文件会保存到WD中,因此有必要将它们添加到SA以生成 ammend commit 。 如果您使用--no-edit
,则会在 ammend commit 中重复使用该注释,否则您必须引入新注释(因为它是一个新提交,每次提交都需要注释)
有关Stagging Area和Working Directory的更多信息,请参阅Reset Demystified