I have seen 'git commit --amend' in detached HEAD state. The question requires the answer to be more complex than needs be.
I'd like to understand just how git commit --amend
works in a normal HEAD situation.
If you amend the HEAD commit and push usually (without --force) then surprisingly it does not fail. HEAD commit message is updated with the changed commit Id. It means other commit IDs except HEAD remains intact.
The git commit –amend command lets you modify your last commit. You can change your log message and the files that appear in the commit. The old commit is replaced with a new commit which means that when you amend your old commit it will no longer be visible in the project history.
Use the selected commit message without launching an editor. For example, git commit --amend --no-edit amends a commit without changing its commit message. Replace the tip of the current branch by creating a new commit.
Assume that you're in a clean working state and that your repository looks as follows:
If you then run
git commit --amend
write a commit message, save and quit your editor, the following happens:
Note that the amended commit (f42c5) is now unreachable from any reference in your repository (hence its "transparent" style on my graph). It still lives in your repository's object database, but it will eventually be deleted for good, when Git runs its periodic housekeeping, or if you trigger it explicitly by running git gc
(garbage collection).
Addendum (based on Jason Baker's comment): Note that, as long as the amended commit, f42c5, still exists in your repository and you have a way of finding out its commit ID (for example, by fishing it out of the master branch's reflog), you can still check it out. Running
git checkout master # just to be sure that master is the current branch
git reset --hard f42c5
or (assuming you haven't, in the meantime, made any new commit on master, reset master, or otherwise moved the master branch reference)
git checkout master # just to be sure that master is the current branch
git reset --hard master@{1}
would put you in the following situation:
But now, commit 31b8e would become unreachable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With