How does git commit –amend work, exactly?

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.

  • How to modify existing, unpushed commits?
  • Make a diff with amend commit
  • Does Git store amends?
  • If i push an amended commit will it create a new commit
  • git: change one line in file for the complete history
  • How to amend a commit without changing commit message (reusing the previous one)?
  • `fatal: Not a valid object name: 'master'` when creating a new branch in git
  • Git how to revert a commit but remember the work?
  • Scare of My Life With GIT: I've got no branch!
  • how to pop git stash without triggering an auto-merge
  • git checkout-index: unable to create file (File name too long)
  • Do I need bcsymbolmap files created by Carthage
  • 2 Solutions collect form web for “How does git commit –amend work, exactly?”

    Assume that you’re in a clean working state and that your repo looks as follows:

    enter image description here

    If you then run

    git commit --amend

    write a commit message, save and quit your editor, the following happens:

    1. Your staging area—which, if you haven’t staged any new changes, will be identical commit f42c5—is used to create a new commit: 31b8e. Its parent(s) will be the same as that(those) of the commit you’re amending: f42c5.
    2. The master branch reference is moved to point to that new commit (31b8e).
    3. The HEAD reference, which already points to master, is moved along with it.

    enter image description here

    Note that the amended commit (f42c5) is now unreachable from any reference in your repo (hence its “transparent” style on my graph). It still lives in your repository’s object database, but 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 repo 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:

    enter image description here

    But now, commit 31b8e would become unreachable.

    Say you just committed “B”

    ... --- A --- B

    Amending “B” will create a parallel commit which becomes the new branch head.

            +---- B
    ... --- A --- B'

    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.

    Git Baby is a git and github fan, let's start git clone.