Internally, git stores information about the project directory tree, commits, etc. as objects in the .git/objects
folder. It uses a unique key/hash to refer to these "data objects". One such data object is the "commit object", which (as the name would suggest) contains information about a git commit. A commit object is created when you run the git commit
command.
For example, you can use the git cat-file -p <object-hash>
command to see the contents of a commit object, like so:
git cat-file -p 95e67358676574c9254f734f5b3f0fc3f43749ed
This would result in an output like the following:
tree 6418daa1541f090b7ab144f09b79d93bb9a60218 parent 81c948a6488fc505be7eb22575a15e2db65c5d32 author John Doe <email@example.com> 1639416517 +0100 committer John Doe <email@example.com> 1639416517 +0100 Related commit message is shown here
As you can see, it contains the following information related to a commit:
#Reference to the Tree Object
The commit object stores the hash of the tree object (that represents a snapshot of the contents of the working directory at a certain point in time). This is so that the changes can be preserved and referenced to, whenever needed.
Similar to the commit object, you can use the git cat-file
command to see the contents of the tree object, for example, like so:
git cat-file -p 6418daa1541f090b7ab144f09b79d93bb9a60218
It will produce an output similar to the following:
040000 tree 43ceb55a59da70d655153c156fbdcdbd1b9ee751 .github 100644 blob 9187d9c929f5fb86d8f20b1ffe03d6ece8dc79fe .gitignore 100644 blob e939c09a29d48f98c3a233f7b08ad65ee3f6c889 README.md 040000 tree b0d4a6557ac193f35307a77ee4a6ed14bebbe028 src # ...
#Commit Hash of Parent(s)
In git, when a commit object is created (using the git commit
command), value of the reference HEAD
points to is set as the "parent" of that commit. It is possible for a commit to have an arbitrary number of parents — in which case, the hash of each parent is stored in the commit object, for example, like so:
# ... parent 81c948a6488fc505be7eb22575a15e2db65c5d32 parent bdb425d2e0f76f30991f9c92c33fdfb9b09918ff # ...
This happens when you git merge
one or more commits into your current branch (without fast-forwarding).
There can also be a case when a commit has no parent. This happens when you create a new repository and make the first commit. This is called a "root" commit.
#Commit Author
Information about the authorship of the commit is stored in the commit object. This includes; the name and email of the person responsible for the change, as well as the date the commit was created. For example, it looks something like the following:
author John Doe <email@example.com> 1639416517 +0100
#Committer
Typically, the author of the code is the committer as well:
author John Doe <email@example.com> 1639416517 +0100 committer John Doe <email@example.com> 1639416517 +0100
However, in certain cases, the author and committer could be different people. For example, this could be the case in larger projects, where the setup might be something like the following:
- Author of the code creates a patch (e.g. using
git format-patch
) and emails the patch via email (e.g. usinggit send-email
); - The committer could be a project maintainer for example, who applies the patch (e.g. using
git apply
orgit am
).
#Commit Message
This is self-explanatory — it is the message/comment associated with the commit. This is used to describe what the commit is about.
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.