Git - Commit

About

A commit 1) in git is an object 2) that stores the information about:

  • who saved the snapshots,
  • when they were saved,
  • why they were saved.
  • the parent commit
  • the commiter
  • the author

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 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"

Date

List:

  • GIT_AUTHOR_DATE
  • GIT_COMMITTER_DATE
# Give a date to the commit
git commit --date='Wed Feb 16 14:00 2037 +0100'
git commit --date='2005-04-07T22:13:13' # Iso

# Change the date of a previous commit
# The -C HEAD is just to bypass editing the commit message
git commit --amend --date='Wed Feb 16 14:00 2037 +0100' -C HEAD

See How can I tweak the date of a commit in the repo?

See

Cat file

git cat-file -p fdf4fc3
# where fdf4fc3 is the first characters of the commit hash
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
parent xxxx
author Foo <[email protected]> 1243040974 -0700
committer Bar <[email protected]> 1243040974 -0700

First commit

where:

  • you can see the tree
  • the parent commits if any
  • the author
  • the committer
  • and the message

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

git show --pretty="" --name-only commitHash
git ls-tree $(git rev-parse commitHash^{tree})

File in a commit

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

Git - Log (Commit History)

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

Delete

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

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

Documentation / Reference


Powered by ComboStrap