On Thu, Sep 27, 2012 at 05:28:23AM -0700, Thiago Rossi wrote:
> Not sure what dangling means. I mean, how it differs from orphans/not being
> In my current repository, b95cad5 has been replaced by b219846. Both have
> the same parent. But b95cad5 became “invisible” in most interfaces,
> including git log, gitk and GitX.
This commit should be reachable from the "reflog" of your repository as
amending the (tip) commit moved the HEAD in a non-linear way, so this
has been recorded to the reflog. Read the `git reflog` manual for more
In general, you should just absorb the fact that reaching for the commit
replaced by `git commit --amend` is an *unusual* case, and providing for
a way to routinely expose it in various parts of Git's user interface is
odd. I mean, when you do `git commit --amend`, provided you read and
understood its manual page, you expect that command to completely
replace the commit you're amending, as if the original commit just did
not exist in the first place. The fact the original commit is
still there by the time `git commit --amend` completed is just an
implementation detail of the Git storage backend which uses garbage
collection. The reflog I mentioned above, while not being a recent
addition, have not always been there (and it's usually disabled in bare
I understand you might have complications understanding why amending a
commit works like it works (that is, why the commit changes, I mean,
it's SHA-1 changes). This is because the commit object consists of
metadata and a reference to a tree object, representing the state of
files associated with that commit. The metadata, among other things,
records the date and time the commit was made, and the commit message.
Observe, that even if you did not change anything in the commit while
amending it (I bother to check if Git compares the new commit message
with the original one), the commit date/time changes and hence changes
the commit object and hence changes its SHA-1. Changing the tree
referenced by the commit (say, adding a forgotten file) changes that
tree's SHA-1 hash which is recorded in the commit object and hence
changes the commit object itself.
If you like to dabble in such technical subtleties to better understand
your tools, I highly recommend to read "Git from the bottom up" ,
and if you do not feel quite confident about those SHA-1 hashes and why
commit object reference tree objects and stuff, you could start from
"The Git Parable"  -- it's probably the simplest introduction to the
concepts and is very fun to read.
Another aspect is that different people have different tastes and
different ideas about how a VCS tool should work, and you might just
dislike the (frivolous) ways in which Git treats unpushed history (and
pushed, too, as you'll discover sometime). You then can just try to
refrain from using `git commit --amend`. This won't help if you want to
fix the commit message up [*], but if you forgot to add a file or want
to remove a file, you might just record another commit doing exactly
that. This is not considered to be a best practice, but you know better
what works better for your workflow/approach.
[*] For instance, Fossil, while not allowing rewriting history at all,
would allow you to change the commit message, but it does this by
recording a special artifact in the repository, and the original
commit message is preserved for later inspection. As you can see,
Git's developers have radically different idea about how to treat
the unpublished history.
You received this message because you are subscribed to the Google Groups "Git
for human beings" group.
To post to this group, send email to email@example.com.
To unsubscribe from this group, send email to
For more options, visit this group at