615 lines
12 KiB
Markdown
615 lines
12 KiB
Markdown
Git and Git Flow Cheat Sheet
|
|
===============
|
|
<hr>
|
|
<p align="center">
|
|
<img alt="Git" src="./Img/git-logo.png" height="190" width="455">
|
|
</p>
|
|
<hr>
|
|
# Other Available Languages:
|
|
1. [Arabic Git Cheat Sheet](https://github.com/arslanbilal/git-cheat-sheet/blob/master/other-sheets/git-cheat-sheet-ar.md)
|
|
2. [Chinese Git Cheat Sheet](https://github.com/arslanbilal/git-cheat-sheet/blob/master/other-sheets/git-cheat-sheet-zh.md)
|
|
3. [Hindi Git Cheat Sheet](https://github.com/arslanbilal/git-cheat-sheet/blob/master/other-sheets/git-cheat-sheet-hi.md)
|
|
4. [Turkish Git Cheat Sheet](https://github.com/arslanbilal/git-cheat-sheet/blob/master/other-sheets/git-cheat-sheet-tr.md)
|
|
5. [Spanish Git Cheat Sheet](https://github.com/arslanbilal/git-cheat-sheet/blob/master/other-sheets/git-cheat-sheet-es.md)
|
|
|
|
Git cheat sheet saves you from learning all the commands by heart.
|
|
|
|
Be free to contribute, update the grammar mistakes. You are also free to add your language file.
|
|
<hr>
|
|
|
|
Git Cheat Sheet English
|
|
===============
|
|
###Index
|
|
* [Set Up](#setup)
|
|
* [Configuration Files](#configuration-files)
|
|
* [Create](#create)
|
|
* [Local Changes](#local-changes)
|
|
* [Search](#search)
|
|
* [Commit History](#commit-history)
|
|
* [Branches & Tags](#branches--tags)
|
|
* [Update & Publish](#update--publish)
|
|
* [Merge & Rebase](#merge--rebase)
|
|
* [Undo](#undo)
|
|
* [Git Flow](#git-flow)
|
|
|
|
|
|
<hr>
|
|
##Setup
|
|
|
|
#####Show current configuration:
|
|
```
|
|
$ git config --list
|
|
```
|
|
#####Show repository configuration:
|
|
```
|
|
$ git config --local --list
|
|
```
|
|
|
|
#####Show global configuration:
|
|
```
|
|
$ git config --global --list
|
|
```
|
|
|
|
#####Show system configuration:
|
|
```
|
|
$ git config --system --list
|
|
```
|
|
|
|
#####Set a name that is identifiable for credit when review version history:
|
|
```
|
|
$ git config --global user.name “[firstname lastname]”
|
|
```
|
|
|
|
#####Set an email address that will be associated with each history marker:
|
|
```
|
|
$ git config --global user.email “[valid-email]”
|
|
```
|
|
|
|
#####Set automatic command line coloring for Git for easy reviewing:
|
|
```
|
|
$ git config --global color.ui auto
|
|
```
|
|
|
|
#####Set global editor for commit
|
|
```
|
|
$ git config --global core.editor vi
|
|
```
|
|
|
|
<hr>
|
|
##Configuration Files
|
|
|
|
#####Repository specific configuration file [--local]:
|
|
```
|
|
<repo>/.git/config
|
|
```
|
|
|
|
#####User-specific configuration file [--global]:
|
|
```
|
|
~/.gitconfig
|
|
```
|
|
|
|
#####System-wide configuration file [--system]:
|
|
```
|
|
/etc/gitconfig
|
|
```
|
|
|
|
<hr>
|
|
##Create
|
|
|
|
#####Clone an existing repository:
|
|
|
|
There are two ways:
|
|
|
|
Via SSH
|
|
|
|
```
|
|
$ git clone ssh://user@domain.com/repo.git
|
|
```
|
|
|
|
Via HTTP
|
|
|
|
```
|
|
$ git clone http://domain.com/user/repo.git
|
|
```
|
|
|
|
#####Create a new local repository:
|
|
```
|
|
$ git init
|
|
```
|
|
<hr>
|
|
##Local Changes
|
|
|
|
#####Changes in working directory:
|
|
```
|
|
$ git status
|
|
```
|
|
|
|
#####Changes to tracked files:
|
|
```
|
|
$ git diff
|
|
```
|
|
|
|
#####Add all current changes to the next commit:
|
|
```
|
|
$ git add .
|
|
```
|
|
|
|
#####Add some changes in <file> to the next commit:
|
|
```
|
|
$ git add -p <file>
|
|
```
|
|
|
|
#####Commit all local changes in tracked files:
|
|
```
|
|
$ git commit -a
|
|
```
|
|
|
|
#####Commit previously staged changes:
|
|
```
|
|
$ git commit
|
|
```
|
|
|
|
#####Commit with message:
|
|
```
|
|
$ git commit -m 'message here'
|
|
```
|
|
|
|
#####Commit skipping the staging area and adding message:
|
|
```
|
|
$ git commit -am 'message here'
|
|
```
|
|
|
|
#####Commit to some previous date:
|
|
```
|
|
git commit --date="`date --date='n day ago'`" -am "Commit Message"
|
|
```
|
|
|
|
#####Change last commit:<br>
|
|
<em><sub>Don't amend published commits!</sub></em>
|
|
|
|
```
|
|
$ git commit -a --amend
|
|
```
|
|
|
|
#####Change committer date of last commit:
|
|
```
|
|
GIT_COMMITTER_DATE="date" git commit --amend
|
|
```
|
|
|
|
#####Change Author date of last commit:
|
|
```
|
|
git commit --amend --date="date"
|
|
```
|
|
|
|
#####Move uncommitted changes from current branch to some other branch:<br>
|
|
```
|
|
git stash
|
|
git checkout branch2
|
|
git stash pop
|
|
```
|
|
|
|
#####Restore stashed changes back to current branch:
|
|
```
|
|
git stash apply
|
|
```
|
|
|
|
#####Remove the last set of stashed changes:
|
|
```
|
|
git stash drop
|
|
```
|
|
|
|
<hr>
|
|
##Search
|
|
|
|
#####A text search on all files in the directory:
|
|
```
|
|
$ git grep "Hello"
|
|
```
|
|
|
|
#####In any version of a text search:
|
|
```
|
|
$ git grep "Hello" v2.5
|
|
```
|
|
|
|
<hr>
|
|
###Commit History
|
|
|
|
#####Show all commits, starting with newest (it'll show the hash, author information, date of commit and title of the commit):
|
|
```
|
|
$ git log
|
|
```
|
|
|
|
#####Show all the commits(it'll show just the commit hash and the commit message):
|
|
```
|
|
$ git log --oneline
|
|
```
|
|
|
|
#####Show all commits of a specific user:
|
|
```
|
|
$ git log --author="username"
|
|
```
|
|
|
|
#####Show changes over time for a specific file:
|
|
```
|
|
$ git log -p <file>
|
|
```
|
|
|
|
#####Display commits that are present only in remote/branch in right side
|
|
```
|
|
$ git log --oneline <origin/master>..<remote/master> --left-right
|
|
```
|
|
|
|
#####Who changed, what and when in <file>:
|
|
```
|
|
$ git blame <file>
|
|
```
|
|
|
|
#####Show Reference log:
|
|
```
|
|
$ git reflog show
|
|
```
|
|
|
|
#####Delete Reference log:
|
|
```
|
|
$ git reflog delete
|
|
```
|
|
<hr>
|
|
##Branches & Tags
|
|
|
|
#####List all local branches:
|
|
```
|
|
$ git branch
|
|
```
|
|
|
|
#####List all remote branches:
|
|
```
|
|
$ git branch -r
|
|
```
|
|
|
|
#####Switch HEAD branch:
|
|
```
|
|
$ git checkout <branch>
|
|
```
|
|
|
|
#####Create and switch new branch:
|
|
```
|
|
$ git checkout -b <branch>
|
|
```
|
|
|
|
#####Create a new branch based on your current HEAD:
|
|
```
|
|
$ git branch <new-branch>
|
|
```
|
|
|
|
#####Create a new tracking branch based on a remote branch:
|
|
```
|
|
$ git branch --track <new-branch> <remote-branch>
|
|
```
|
|
|
|
#####Delete a local branch:
|
|
```
|
|
$ git branch -d <branch>
|
|
```
|
|
|
|
#####Force delete a local branch:
|
|
<em><sub>You will lose unmerged changes!</sub></em>
|
|
|
|
```
|
|
$ git branch -D <branch>
|
|
```
|
|
|
|
#####Mark the current commit with a tag:
|
|
```
|
|
$ git tag <tag-name>
|
|
```
|
|
|
|
#####Mark the current commit with a tag that includes a message:
|
|
```
|
|
$ git tag -a <tag-name>
|
|
```
|
|
<hr>
|
|
##Update & Publish
|
|
|
|
#####List all current configured remotes:
|
|
```
|
|
$ git remote -v
|
|
```
|
|
|
|
#####Show information about a remote:
|
|
```
|
|
$ git remote show <remote>
|
|
```
|
|
|
|
#####Add new remote repository, named <remote>:
|
|
```
|
|
$ git remote add <remote> <url>
|
|
```
|
|
|
|
#####Download all changes from <remote>, but don't integrate into HEAD:
|
|
```
|
|
$ git fetch <remote>
|
|
```
|
|
|
|
#####Download changes and directly merge/integrate into HEAD:
|
|
```
|
|
$ git remote pull <remote> <url>
|
|
```
|
|
|
|
#####Get all changes from HEAD to local repository:
|
|
```
|
|
$ git pull origin master
|
|
```
|
|
|
|
#####Get all changes from HEAD to local repository without a merge:
|
|
```
|
|
git pull --rebase <remote> <branch>
|
|
```
|
|
|
|
#####Publish local changes on a remote:
|
|
```
|
|
$ git push remote <remote> <branch>
|
|
```
|
|
|
|
#####Delete a branch on the remote:
|
|
```
|
|
$ git push <remote> :<branch> (since Git v1.5.0)
|
|
or
|
|
git push <remote> --delete <branch> (since Git v1.7.0)
|
|
```
|
|
|
|
#####Publish your tags:
|
|
```
|
|
$ git push --tags
|
|
```
|
|
<hr>
|
|
##Merge & Rebase
|
|
|
|
#####Merge <branch> into your current HEAD:
|
|
```
|
|
$ git merge <branch>
|
|
```
|
|
|
|
#####Rebase your current HEAD onto <branch>:<br>
|
|
<em><sub>Don't rebase published commit!</sub></em>
|
|
|
|
```
|
|
$ git rebase <branch>
|
|
```
|
|
|
|
#####Abort a rebase:
|
|
```
|
|
$ git rebase --abort
|
|
```
|
|
|
|
#####Continue a rebase after resolving conflicts:
|
|
```
|
|
$ git rebase --continue
|
|
```
|
|
|
|
#####Use your configured merge tool to solve conflicts:
|
|
```
|
|
$ git mergetool
|
|
```
|
|
|
|
#####Use your editor to manually solve conflicts and (after resolving) mark file as resolved:
|
|
```
|
|
$ git add <resolved-file>
|
|
```
|
|
|
|
```
|
|
$ git rm <resolved-file>
|
|
```
|
|
|
|
#####Squashing commits:
|
|
```
|
|
$ git rebase -i <commit-just-before-first>
|
|
```
|
|
|
|
Now replace this,
|
|
|
|
```
|
|
pick <commit_id>
|
|
pick <commit_id2>
|
|
pick <commit_id3>
|
|
```
|
|
|
|
to this,
|
|
|
|
```
|
|
pick <commit_id>
|
|
squash <commit_id2>
|
|
squash <commit_id3>
|
|
```
|
|
<hr>
|
|
##Undo
|
|
|
|
#####Discard all local changes in your working directory:
|
|
```
|
|
$ git reset --hard HEAD
|
|
```
|
|
|
|
#####Get all the files out of the staging area(i.e. undo the last `git add`):
|
|
```
|
|
$ git reset HEAD
|
|
```
|
|
|
|
#####Discard local changes in a specific file:
|
|
```
|
|
$ git checkout HEAD <file>
|
|
```
|
|
|
|
#####Revert a commit (by producing a new commit with contrary changes):
|
|
```
|
|
$ git revert <commit>
|
|
```
|
|
|
|
#####Reset your HEAD pointer to a previous commit and discard all changes since then:
|
|
```
|
|
$ git reset --hard <commit>
|
|
```
|
|
|
|
#####Reset your HEAD pointer to a remote branch current state.
|
|
```
|
|
git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature
|
|
```
|
|
|
|
#####Reset your HEAD pointer to a previous commit and preserve all changes as unstaged changes:
|
|
```
|
|
$ git reset <commit>
|
|
```
|
|
|
|
#####Reset your HEAD pointer to a previous commit and preserve uncommitted local changes:
|
|
```
|
|
$ git reset --keep <commit>
|
|
```
|
|
|
|
#####Remove files that were accidentally committed before they were added to .gitignore
|
|
```
|
|
$ git rm -r --cached .
|
|
$ git add .
|
|
$ git commit -m "remove xyz file"
|
|
```
|
|
<hr>
|
|
|
|
##Git-Flow
|
|
|
|
###Index
|
|
* [Setup](#setup)
|
|
* [Getting Started](#getting-started)
|
|
* [Features](#features)
|
|
* [Make a Release](#make-a-release)
|
|
* [Hotfixes](#hotfixes)
|
|
* [Commands](#commands)
|
|
<hr>
|
|
|
|
|
|
###Setup
|
|
######You need a working git installation as prerequisite. Git flow works on OSX, Linux and Windows.
|
|
|
|
#####OSX Homebrew:
|
|
```
|
|
$ brew install git-flow
|
|
```
|
|
|
|
#####OSX Macports:
|
|
```
|
|
$ port install git-flow
|
|
```
|
|
|
|
#####Linux (Debian-based):
|
|
```
|
|
$ apt-get install git-flow
|
|
```
|
|
|
|
#####Windows (Cygwin):
|
|
######You need wget and util-linux to install git-flow.
|
|
```
|
|
$ wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
|
|
```
|
|
<hr>
|
|
|
|
|
|
###Getting Started
|
|
######Git flow needs to be initialized in order to customize your project setup. Start using git-flow by initializing it inside an existing git repository:
|
|
#####Initialize:
|
|
######You'll have to answer a few questions regarding the naming conventions for your branches. It's recommended to use the default values.
|
|
```
|
|
git flow init
|
|
```
|
|
<hr>
|
|
|
|
|
|
###Features
|
|
######Develop new features for upcoming releases. Typically exist in developers repos only.
|
|
#####Start a new feature:
|
|
######This action creates a new feature branch based on 'develop' and switches to it.
|
|
```
|
|
git flow feature start MYFEATURE
|
|
```
|
|
|
|
#####Finish up a feature:
|
|
######Finish the development of a feature. This action performs the following:
|
|
######1)Merged MYFEATURE into 'develop'.
|
|
######2)Removes the feature branch.
|
|
######3)Switches back to 'develop' branch
|
|
```
|
|
git flow feature finish MYFEATURE
|
|
```
|
|
|
|
#####Publish a feature:
|
|
######Are you developing a feature in collaboration? Publish a feature to the remote server so it can be used by other users.
|
|
```
|
|
git flow feature publish MYFEATURE
|
|
```
|
|
|
|
#####Getting a published feature:
|
|
######Get a feature published by another user.
|
|
```
|
|
git flow feature pull origin MYFEATURE
|
|
```
|
|
|
|
#####Tracking a origin feature:
|
|
######You can track a feature on origin by using
|
|
```
|
|
git flow feature track MYFEATURE
|
|
```
|
|
<hr>
|
|
|
|
|
|
###Make a Release
|
|
######Support preparation of a new production release. Allow for minor bug fixes and preparing meta-data for a release
|
|
|
|
#####Start a release:
|
|
######To start a release, use the git flow release command. It creates a release branch created from the 'develop' branch. You can optionally supply a [BASE] commit sha-1 hash to start the release from. The commit must be on the 'develop' branch.
|
|
```
|
|
git flow release start RELEASE [BASE]
|
|
```
|
|
######It's wise to publish the release branch after creating it to allow release commits by other developers. Do it similar to feature publishing with the command:
|
|
```
|
|
git flow release publish RELEASE
|
|
```
|
|
######(You can track a remote release with the: ```git flow release track RELEASE``` command)
|
|
|
|
#####Finish up a release:
|
|
######Finishing a release is one of the big steps in git branching. It performs several actions:
|
|
######1)Merges the release branch back into 'master'
|
|
######2)Tags the release with its name
|
|
######3)Back-merges the release into 'develop'
|
|
######4)Removes the release branch
|
|
```
|
|
git flow release finish RELEASE
|
|
```
|
|
######Don't forget to push your tags with ```git push --tags```
|
|
<hr>
|
|
|
|
|
|
###Hotfixes
|
|
######Hotfixes arise from the necessity to act immediately upon an undesired state of a live production version. May be branched off from the corresponding tag on the master branch that marks the production version.
|
|
|
|
#####Git flow hotfix start:
|
|
######Like the other git flow commands, a hotfix is started with
|
|
```
|
|
$ git flow hotfix start VERSION [BASENAME]
|
|
```
|
|
######The version argument hereby marks the new hotfix release name. Optionally you can specify a basename to start from.
|
|
|
|
#####Finish a hotfix:
|
|
######By finishing a hotfix it gets merged back into develop and master. Additionally the master merge is tagged with the hotfix version
|
|
```
|
|
git flow hotfix finish VERSION
|
|
```
|
|
<hr>
|
|
|
|
|
|
###Commands
|
|
<p align="center">
|
|
<img alt="Git" src="./Img/git-flow-commands.png" height="270" width="460">
|
|
</p>
|
|
<hr>
|
|
|
|
###Git flow schema
|
|
|
|
<p align="center">
|
|
<img alt="Git" src="Img/git-flow-commands-without-flow.png">
|
|
</p>
|
|
<hr> |