Git - Commit
About
A commit 1) in git is an object 2) that stores the information about:
- who saved the file system snapshots,
- when they were saved,
- why they were saved.
- the commiter
- the author
- the parent commit
It's added in commit log (or log) behind its parent commit.
For each commit, a new snapshots (tree) of the project directory is preserved.
Property
Identifier
SHA
Commit identifier are the hash object calculated on the following inputs:
- the SHA of the all files and directories
- the SHA of all ascendant commit
- the commit message
- the author name/email/timestamp
- the committer name/email/timestamp
Name
To reference a commit by name and not by SHA, named called ref can be used.
HEAD is a special ref that refers to the current branch (ie last commit of the current branch)
Message
The commot message is given with the -m option.
git commit -m "My Commit"
Author and Committer Date
- The date of a commit is the author date.
- There is also a committer date.
Committer / Author
A commit has a:
- and a Author
See
Cat file
git cat-file -p fdf4fc3
# where fdf4fc3 is the first characters of the commit hash
# for the last commit
git cat-file -p HEAD
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
parent xxxx
author Foo <[email protected]> 1243040974 -0700
committer Bar <[email protected]> 1243040974 -0700
First commit
where:
Last commit
Just for the last commit
git cat-file -p HEAD
Tree
The commit tree is the tree of the commit. It's an image of the file system (ie file and directory)
Get the hash of the commit tree
- short hand notation that can be used in any commdn
commitHash^{tree}
# dos: commitHash^^{tree}
For example:
- to print the hash:
git rev-parse commitHash^{tree}
- the list the tree
git ls-tree commitHash^{tree}
List the files in a commit
- With the show command
git show --pretty="" --name-only commitHash
- With the listing of the commit tree
git ls-tree $(git rev-parse commitHash^{tree})
File in a commit
- Get the hash
git rev-parse commitHash:path/to/file
- Get the content
git show commitHash:path/to/file
Commit viewer : gitk
gitk the commit viewer
gitk file
gitk --follow file # for rename
Management
Creation
git commit
The commit-tree 3)is a low level command that permits to creates a commit from a tree
echo 'First commit Message' | git commit-tree d8329f
# d8329f is the tree hash
Visualization
To visualize the type of commit, you can use emoji. See a list of emoji by commit type at Emojis Commit
List
What is the Git Log (also known as commit history or commit log) ?
git log --format=fuller
git log --pretty=oneline
Undo
Soft
Undo the last commit without deleting the changed files - Reset
# --soft is the default
git reset --soft HEAD~
Hard
If you accidentally commit on master, it's not hard to fix things up. Assuming you've just made an errant commit on master:
- “Backs up” your commit, creating a topic branch
git branch myNewTopicBranch
- Reset your master branch to the same state as upstream/master
git reset --hard upstream/master
Modify
the Last Commit
git commit --amend args
Example:
- last message
git commit --amend -m "another commit message"
- the author's date
git commit --amend --date='Wed Feb 16 14:00 2037 +0100' -C HEAD
Delete the last local commit
- The last commit if not pushed
git reset HEAD~
If you want to your working directory back to the status of upstream, see working directory purge
Diff
Command line
- commits that branch-X has but master doesn't
git log master..branch-X
Options:
- –oneline
- –stat will show the files
DiffTool
git difftool -y origin/master..origin/develop
Checkout
git checkout commit_hash
git checkout 56a4e5c08
You are then in a detached head state.
or
git checkout -b branchName commitHash
Get the number of commit since a period
PERIOD_HOURS=4
git log --oneline --since '$PERIOD_HOURS hour ago' | wc -l