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.
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.
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:
However, commit 31b8e would now be unreachable.
f42c5
by doing a checkout
, or by going through the reflog? I admit that it would be a silly thing to do, but I'm curious if the old commit can be accessed at all –
Thenceforward git reset
always resets the current branch (which means HEAD
must not be detached, too). Put the checkout master
first, etc... –
Periphery :)
–
Lansing reset
is re-setting. –
Periphery Say you just committed "B"
... --- A --- B
^
|
master
HEAD
Amending "B" will create a parallel commit which becomes the new branch head.
+---- B
|
... --- A --- B'
^
|
master
HEAD
B' is the commit resulting from a combination of the changes from B plus the changes you had staged when you issued the git commit --amend
.
B' is the commit resulting from a combination of the changes from B plus the changes you had staged when you issued the git commit --amend.
is very important for me. Until now I used to use git commit --amend
only to change commit messages. I didn't know I could use git commit --amend
to update changes in a commit. –
Alti -C HEAD
(instead of -m'...'
) to avoid changing the message. –
Lovett According to my knowledge, amend works thus:
For git commit --amend
works the changes to amend must be into the stagging area (SA)
git reset -- soft
for bring back changes committed in the last commit (commit to amend) to the SA and move the index to previous commit (commit before commit to amend). Everything keep how it was before the git commit
command were used.git add
with all files to add to new commit (it will be the amended commit). The files to add are those were into the SA before the git reset --soft
was landed, and after reset these files are kept in the working directory (WD), so it is necessary add them to the SA for generate the amended commit.git commit --amend
should not be used with pushed commits.If you use --no-edit
the comment is reused in the amended commit, else you must introduce a new comment (because it is a new commit and every commit needs a comment).
For more information about the staging area and working directory, see Reset Demystified.
Suppose you create two files test1.txt and test2.txt then you you run
git add test1.txt && git commit -m “test1.txt and test2.txt “
later you remember you did not add test2.txt So you want to add the missing test2.txt file and modify the previous commit git add test2.txt
git commit --amend -m "test1.txt & test2.txt added"
git log [to see that the previous commit message updated and test2.txt file added]
© 2022 - 2024 — McMap. All rights reserved.