--- Original Message -----
From: Thiago Rossi
To: [email protected]
Sent: Saturday, September 29, 2012 1:55 AM
Subject: Re: [git-users] “Ghost” commit
Thank you very much for the links. Actually I've read a few pages of the book
recently…
And I think I understand the part about blobs, trees, commits… But what I
don't understand is… if I stage a file, edit it, and stage it again, the blob
created during the first staging will be purged if I run git purge. That
happens because no commit was made between the two “adds”/staging. Nothing
refers to the first one (any more).
I also get that if a commit is amended, we are not supposed to use the
amended one… or reference it, as the intention of amending is replacing it…
pretend the replaced commit never happened. What I don't understand (or see the
reasons) is why the blob for the amended commit is not “purge-able”… If it's
not listed there, I guess something is referencing to it, and I wonder what, as
it seems only reflog is capable of show it.
If I have
A <--- B and amend B, now I have
A <--- C, and B, as far as I know, is no longer listed as a child of A and
doesn't have A as a parent.
Aha, there is the misunderstanding.
First, it isn't the child relation that is listed. Commit A does not know if it
has any, or lots of, children.
Rather, it is Commit B and Commit C that both (second point) know who their
parent was at the point of their commit snapshot.
Third point it's actually a new commit snapshot. What is actually ammended is
the branch tip pointer, to change from pointing to B, to pointing at C.
The commit B is 'left behind' without a home branch to belong to.
reflog shows B, but who is using B? I am able to checkout B if I know its
SHA1 code, and I think it would be a bad idea… I don't know why B can't be
purged then.
On Friday, 28 September 2012 09:16:04 UTC+1, Konstantin Khomoutov wrote:
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
> referenced…
>
> 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
info.
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
repositories).
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" [1],
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" [2] -- 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.
1. http://newartisans.com/2008/04/git-from-the-bottom-up/
2. http://tom.preston-werner.com/2009/05/19/the-git-parable.html
--
You received this message because you are subscribed to the Google Groups
"Git for human beings" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/git-users/-/b0PR0Mnu-VAJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/git-users?hl=en.
No virus found in this message.
Checked by AVG - www.avg.com
Version: 2012.0.2221 / Virus Database: 2441/5297 - Release Date: 09/28/12
--
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 protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/git-users?hl=en.