Git : Operations

You’ll find in this article, some informations/commands to know to work with the Git tool.

What’s Git

Git is a distributed version-control system for tracking changes in text file created by Linus Torvalds in 2005.

A full documentation is available from official website.

Setting up Git

Git installation

For OpenSUSE :

  • Execute the following command : $ sudo zypper in --no-recommend git

For Windows :

  • Go on the official website to download the tool and install it on your workstation.

Vocabulary definition

The states :

  • Untracked : The file is not tracked by Git
  • Unmodified : The file is tracked by Git but has not yet been modified
  • Modified : The file is tracked by Git and has been modified
  • Staged : The file is tracked by Git but has not yen been committed

Diagram : diagram

Git config

You will find more information on official website.

Retrieve the list of configuration parameters :

  • all the parameters : $ git config --list
  • All the global parameters : $ git config --list --global
  • All the parameters and their origin : $ git config --list --show-origin

Define of user parameters :

  • User name : $ git config --global user.name "user"
  • User email : $ git config --global user.email "user@mail"

Define of system parameters :

  • To avoid automatically changing the end of line character format between Windows (CRLF) and Linux (LF) : $ git config --global core.autocrlf false

Setting up a Git repository (Github)

1/ Initialization of Git in an existing folder To initializing Git in a folder : $ git init To link to a remote repository : $ git remote add <remote_name> <remote_url>

2/ Cloning of an existing remote repository (example with github) To retrieve a remote repository on your workspace : $ git clone <url> <folder>

Management of files with Git

You will find, below, a list of operations to know to manage files with Git.

CommandComment
$ git statusAnalysis of the state of all elements
$ git status -sAnalysis of the state of all elements with a synthetic display
$ git add <fichier ou pattern>Tracking a new file
$ git add -f <fichier ou pattern>Force the tracking of a new file (gitignore)
$ git add -ATracking all the new files
$ git commit -m "<message>"Commit of all elements in the staged space with a message
$ git commit --amend"Commit all elements in the staged space in the preceding commit
$ git rm <fichier ou pattern>Deleting a file in the current directory if it has already been commit
$ git rm --cached <fichier ou pattern>Deleting a file from the staged space but not from the current folder
$ git checkout -- <fichier ou pattern>Cancelling changes to a file not present in the staged state

Management of a remote repository

You will find, below, a list of the operations to know to be able to manage a remote repository with Git

CommandComment
$ git remote -vList the remote repositories
$ git remote add <remote_name> <remote_url>Add a remote repository
$ git fetch <remote_name>Retrieving metadata from a remote repository
$ git chekout <remote_name>/<branch>Retrieving all the elements of a branch from a remote repository
$ git push <remote_name> <branhc>Sending new commit to a branch of a remote repository
$ git remote show <remote_name>Inspect a remote repository
$ git remote rename <remote_name_old> <renomte_name_new>Modify the local name used to define a remote repository
$ git remote remove <remote_name>Deleting a remote repository

Definition of a .gitignore file

It is possible to ignore some files/folders with Git using a .gitignore file.

Example of a .gitignore file content

 1# ignore all .a files
 2*.a
 3
 4# ignore all .a or .o files
 5*.[oa]
 6
 7# ignore all files ending by ~
 8*~
 9
10# but do track lib.a, even though you're ignoring .a files above
11!lib.a
12
13# only ignore the TODO file in the current directory, not subdir/TODO
14/TODO
15
16# ignore all files in any directory named build
17build/
18
19# ignore doc/notes.txt, but not doc/server/arch.txt
20doc/*.txt
21
22# ignore all .pdf files in the doc/ directory and any of its subdirectories
23doc/**/*.pdf

Retrieving differences and change history

Some commands to see the differences between commit :

CommandComment
$ git diffDifference between the working directory and the last commit
$ git diff --cachedDifference between files added for the next commit and the last commit
$ git diff <commit_1> <commit_2> <pattern>List of differences between two commit for all files corresponding to the choosen pattern

Some commands to read a commit history :

CommandComment
$ git logSee the history of all commit
$ git log -2See the history of the two last commit
$ git log -p -1See the history of the last commit with details of the differences between them
$ git log -stat -1See the history of the last commit with statitics
$ git log --pretty=format:"<format>"See the history of the commit in the choosen format
$ git log --oneline --decorate"Example of command …
$ git log --oneline --decorate --graph --all"Example of command …

Example of options that can be used as a format :

OptionDescription
%HCommit hash
%hAbbreviated commit hash
%TTree hash
%tAbbreviated tree hash
%PParent hashes
%pAbbreviated parent hashes
%anAuthor name
%aeAuthor email
%adAuthor date (format respects the –date=option)
%arAuthor date, relative
%cnCommitter name
%ceCommitter email
%cdCommitter date
%crCommitter date, relative
%sSubject

Tags management

CommandComment
$ git tagList existing tags
$ git tag -l <pattern>List the tags corresponding to a pattern
$ git tag -a <tag> -m "<message>"Creating an annotated tag
$ git tag <tag>Creating a lightweight tag
$ git tag -d <tag>Deleting a tag
$ git show <tag>Retrieving the description of an annotated tag
$ git tag -a <tag> <checksum>Creating a tag on an existing commit (checksum)
$ git push <remote> <tag>Send the tag on the remote repository
$ git push <remote> --tagsSend all tags ont the remote reporitoty
$ git push <remote> --delete <tag>Deleting a tag from the remote repository
$ git checkout <tag>Retrieving the content of a tag in a detached branch
$ git checkout -b <branch> <tag>Retrieving the content of a tag in a new branch

Alias management

You can set aliases to access git command faster.

1$ git config --global alias.co checkout
2$ git config --global alias.br branch
3$ git config --global alias.ci commit
4$ git config --global alias.st status
5$ git config --global alias.unstage 'reset HEAD --'
6$ git config --global alias.last 'log -1 HEAD'

Branch management with Git

CommandeCommentaire
$ git branchList of branches
$ git branch -vList of branches with the last commit
$ git branch --mergedList of branches merged with the current branche
$ git branch testCreating a new branch named test
$ git branch -d corf1Removing the branch corf1
$ git checkout masterSwitch branche (on the branch master)
$ git checkout -b devf1Creating the devf1 branch and switch on the branch devf1
$ git merge corf1Merge the branch corf1 on the current branch

Others operations

The rebase operation to apply the set of modifications of a branch by rewriting the history : documentation.