Git is the standard version-control system for software development. Git was created by Linus Torvalds in 2005 to support the development of the Linux kernel. Since then, Git has become an essential tool for both junior and senior developers. It allows having a complete history and full version tracking of the project, easing all the different phases of the development process.

Git Configurations

First, add your username and email to the git global configurations. These commands will be automatically written to ~/.gitconfig.

git config --global user.name "César Soto Valero"
git config --global user.email "cesarsotovalero@gmail. com"

To remove the return characters added by the OS every time that you commit a file:.

git config --global  core.autocrlf input

Let’s make some useful aliases. The first one allows us to retrieve a simplified status with git s, the second is an improved log with git lg.

git config --gloabal alias.s "status -s" 
git config --global alias.lg "log --oneline --all --graph --decorate"

Git commits

To commit all the modified files, add them to the staging area and commit with a message:

git add .
git commit -m "commit message goes here"

Optionally, can do both commands at the same time:

git commit -am "commit message goes here"

To change the message of the last commit made:

git commit --amend

Git branches

To list all the existing branches (including the remote branch, often called origin/master):

git branch -a

To create a new branch and move to it:

git checkout  -b branch_name

To switch to a branch:

git checkout branch_name

To remove a branch:

git branch -d  branch_name

Git diff

To see the difference between unstagged files:

git diff

To see the difference between staged files:

git diff --staged

To see the difference with respect to the last commit made:

git diff HEAD

Git merge

To merge a branch using recursive merge, switch to the desired branch (e.g., the master branch) and create a commit message for the merge:

git merge --no-ff branch_name

To resolve a merge conflict, look at the status with git s and edit the file with the conflict with a text editor, then add and commit the files without a commit message to see additional details of the resolved conflict.

git add .
git commit

Git rebase

To put all the commit of a branch on the top of the HEAD:

git checkout -b branch_name
git rebase master

To rebase interactively:

git rebase -i HEAD~5

Then edit the list of commits by adding substituting pick by f to squash the commits into less, or r to reword the commit message.

Git fetch & push & pull

To push the content of your project to a remote repository (e.g., GitHub), create a repo and add it as a remote:

git remote add origin http://github.com/username/reponame.git
git push -u origin master

The fetch command allows retrieving the changes on the remote without merging to the master branch:

git  fetch

To fetch and merge the content of the remote repository at the same time:

git pull

Git tags

Tags are useful to keep track of the releases. To add an annotated tag to a commit:

git tag -a v1.0.0 -m "tag message"

To show the information about the tag:

git show v1.0.0

To push tags up to GitHub and add them as releases:

git push tags

Git revert

To undo the last commit and create a new commit with the revert:

git revert commit_id

Git reset

To throw away a certain number of commits (2 in this example) :

git reset HEAD~2

Troubleshooting

.gitignore is not working: You may need to remove every file that was cached in the .gitignore file. Be aware to commit all your changes before, otherwise you will loose control on all the changed files.

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

If what you want is to ignore a previously committed file:

git rm --cached <file_name>
git add .gitignore
git commit -m "update ignored files"

Git log of a Java method: You need to add the following to the .gitattributes file.

*.java diff=java

Then you can execute the log command with the name of a method and the path to the file.

 git log -L :<methodName>:<javaFilePath>