我看过GIT commit --amend in detached HEAD state。这个问题要求答案比需要更复杂。我想了解git commit --amend
在正常情况下的工作方式。git如何提交 - 准确的工作?
回答
假设你在一个干净的工作状态,并且您的回购如下所示:
如果你再运行
git commit --amend
写提交信息,保存并退出您的编辑器发生以下情况:
- 您的暂存区域 - 如果您没有s进行任何新的更改,将与提交
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 [email protected]{1}
将使您在以下情况:
但现在,提交31b8e
将BEC ome无法访问。
您可以通过“checkout”或通过reflog回到'f42c5'吗?我承认这将是一件愚蠢的事情,但我很好奇,如果可以访问旧提交* * – 2014-09-26 00:59:20
@JasonBaker是的,你总是可以检查修改后的(现在无法访问的)提交,只要它还没有被垃圾收集,你有一个方法来提及它。 – Jubobs 2014-09-26 01:11:29
呵呵,现在命令不太正确,'git reset' * always *会重置* current *分支(这意味着'HEAD'也不能被分离)。把结账大师放在第一位,等等...... – torek 2014-09-26 01:19:44
说你只是犯了“B”
... --- A --- B
^
|
master
HEAD
修订“B”将建立一个平行的承诺成为新的分支头。
+---- B
|
... --- A --- B'
^
|
master
HEAD
B”是从提交的从B改变加时发出的git commit --amend
你已经上演了变化的组合产生。
要建立在此答案上,B'将包含来自B的更改的组合,以及您现在坐在回购中的任何分阶段更改 – 2014-09-26 00:47:59
@Jason Baker,Added。 – ikegami 2014-09-26 00:50:16
据我所知,ammend
作品这样的:
为git commit --ammend
工作的变化ammend必须到脚手架区(SA)
- 它使
git reset -- soft
对带回的变化在SA的最后一次提交(提交给ammend)中提交并将索引移动到先前的提交(在提交之前提交以进行修改)。一切都保持了git commit
命令之前的使用。 - 它使
git add
与所有文件添加到新的提交(这将是ammend承诺)。要添加的文件是那些在git reset --soft
登陆之前进入SA的文件,重置后此文件将保存到WD中,因此有必要将它们添加到SA以生成推荐提交。 - 使git提交。它将生成一个新的提交,因此推荐提交的新ID。对于这一点,git的承诺--ammend不应该被用来与推提交
如果使用--no-edit
注释重新应用于ammended提交,否则你必须引入一个新的评论(becouse它是一个新的提交,每个提交需要注释)。
有关脚手架区和工作目录的详细信息,请参阅Reset Demystified
- 1. git工作流后提交
- 2. 如何正确提交点火工作?
- 3. Git的 - 保留工作,无需提交
- 4. 如何在git中提交提交?
- 5. Git commit squashing(rebase -i):提交实际上如何工作?
- 6. Git如何恢复提交但记住工作?
- 7. 远程git提交工具?
- 8. 当协作者提交不同的更改时,git如何工作(BitBucket)?
- 9. 如何恢复从git提交更改?
- 10. 用于本地提交,上游提交和部署的Git工作流程
- 11. 如何确定Git中樱桃树的提交者?
- 12. TFS Git提交链接如何存储
- 13. Git + Intellij - 如何恢复本地提交?
- 14. 如何在Git中非交互地重新提交提交
- 15. 如何在一次提交中提交SVN和GIT?
- 16. 如何恢复本地提交git
- 17. Git冲突提交
- 18. 提交签名如何工作?
- 19. Git Squash按作者 - 所有作者提交到一个提交
- 20. 如何提交提交,而不是工作目录?
- 21. 如何让git合并处理我的工作树的未提交更改?
- 22. 如何跟踪处理的git提交?
- 23. 我如何找到空的git提交?
- 24. 如何跳过git中的提交?
- 25. 如何删除Git中的旧提交?
- 26. 自动备份的工作项目的git或HG上提交
- 27. 具有较早的git的更换工作目录提交
- 28. python的Git提交
- 29. git:如何“巩固”本地提交
- 30. Git损坏提交
我会生成图表的简单情况。等一下。 – Jubobs 2014-09-26 00:47:11
你如何制作你的图表?我明天将要为青年教Git。 – 2014-09-26 00:48:56
查看https://github.com/Jubobs/gitdags – Jubobs 2014-09-26 00:58:13