Git and Git Flow
Git Cheat Sheet
Index
- Set Up
- Configuration Files
- Create
- Local Changes
- Search
- Commit History
- Branches & Tags
- Update & Publish
- Merge & Rebase
- Undo
- Git Flow
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
Configuration Files
Repository specific configuration file [–local]:
/.git/config
User-specific configuration file [–global]:
~/.gitconfig
System-wide configuration file [–system]:
/etc/gitconfig
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 in the current directory:
$ git init
Create a new local repository in a specific directory:
$ git init
Local Changes
Changes in working directory:
$ git status
Changes to tracked files:
$ git diff
See changes/difference of a specific file:
$ git diff
Add all current changes to the next commit:
$ git add .
Add some changes in Add only the mentioned files to the next commit: Commit all local changes in tracked files: Commit previously staged changes: Commit with message: Commit skipping the staging area and adding message: Commit to some previous date: Change last commit: Don’t amend published commits!
Amend with last commit but use the previous commit log message Don’t amend published commits!
Change committer date of last commit: Change Author date of last commit: Move uncommitted changes from current branch to some other branch: Restore stashed changes back to current branch: Restore particular stash back to current branch: Remove the last set of stashed changes: Search A text search on all files in the directory: In any version of a text search: Show commits that introduced a specific keyword Show commits that introduced a specific keyword (using a regular expression) Commit History Show all commits, starting with newest (it’ll show the hash, author information, date of commit and title of the commit): Show all the commits(it’ll show just the commit hash and the commit message): Show all commits of a specific user: Show changes over time for a specific file: Display commits that are present only in remote/branch in right side Who changed, what and when in Show Reference log: Delete Reference log: Move / Rename Rename a file: Rename Index.txt to Index.html
Branches & Tags List all local branches: List local/remote branches List all remote branches: Switch HEAD branch: Checkout single file from different branch Create and switch new branch: Switch to the previous branch, without saying the name explicitly: Create a new branch from an exiting branch and switch to new branch: Checkout and create a new branch from existing commit Create a new branch based on your current HEAD: Create a new tracking branch based on a remote branch: Delete a local branch: Rename current branch to new branch name Force delete a local branch: You will lose unmerged changes!
Mark Mark Mark List all tags: List all tags with their messages (tag message or commit message if tag has no message): Update & Publish List all current configured remotes: Show information about a remote: Add new remote repository, named Rename a remote repository, from Remove a remote: Note: git remote rm does not delete the remote repository from the server. It simply removes the remote and its references from your local repository. Download all changes from Download changes and directly merge/integrate into HEAD: Get all changes from HEAD to local repository: Get all changes from HEAD to local repository without a merge: Publish local changes on a remote: Delete a branch on the remote: OR
Publish your tags: Configure the merge tool globally to meld (editor) Use your configured merge tool to solve conflicts: Merge & Rebase Merge branch into your current HEAD: List merged branches Rebase your current HEAD onto Don’t rebase published commit!
Abort a rebase: Continue a rebase after resolving conflicts: Use your editor to manually solve conflicts and (after resolving) mark file as resolved: Squashing commits: Now replace this,
to this,
Undo Discard all local changes in your working directory: Get all the files out of the staging area(i.e. undo the last Discard local changes in a specific file: Revert a commit (by producing a new commit with contrary changes): Reset your HEAD pointer to a previous commit and discard all changes since then: Reset your HEAD pointer to a remote branch current state. Reset your HEAD pointer to a previous commit and preserve all changes as unstaged changes: Reset your HEAD pointer to a previous commit and preserve uncommitted local changes: Remove files that were accidentally committed before they were added to .gitignore Git-Flow Improved Git-flow Index Setup You need a working git installation as prerequisite. Git flow works on OSX, Linux and Windows. OSX Homebrew: OSX Macports: Linux (Debian-based): Windows (Cygwin): You need wget and util-linux to install git-flow. 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. OR To use default 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. 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 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. Getting a published feature: Get a feature published by another user. Tracking a origin feature: You can track a feature on origin by using 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. 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: (You can track a remote release with the:
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 Don’t forget to push your tags with
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 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 add -p
$ git add
$ git commit -a
$ git commit
$ git commit -m 'message here'
$ git commit -am 'message here'
$ git commit --date="`date --date='n day ago'`" -am "
$ git commit -a --amend
$ git commit --amend --no-edit
GIT_COMMITTER_DATE="date" git commit --amend
$ git commit --amend --date="date"
$ git stash
$ git checkout branch2
$ git stash pop
$ git stash apply
git stash list
$ git stash apply stash@{stash_number}
$ git stash drop
$ git grep "Hello"
$ git grep "Hello" v2.5
$ git log -S 'keyword'
$ git log -S 'keyword' --pickaxe-regex
$ git log
$ git log --oneline
$ git log --author="username"
$ git log -p
$ git log --oneline
$ git blame
$ git reflog show
$ git reflog delete
$ git mv Index.txt Index.html
$ git branch
$ git branch -a
$ git branch -r
$ git checkout
$ git checkout
$ git checkout -b
$ git checkout -
$ git checkout -b
$ git checkout
$ git branch
$ git branch --track
$ git branch -d
$ git branch -m
$ git branch -D
HEAD
with a tag:
$ git tag
HEAD
with a tag and open the editor to include a message:
$ git tag -a
HEAD
with a tag that includes a message:
$ git tag
$ git tag
$ git tag -n
$ git remote -v
$ git remote show
$ git remote add
$ git remote rename
$ git remote rm
$ git fetch
$ git remote pull
$ git pull origin master
$ git pull --rebase
$ git push remote
$ git push
$ git push
$ git push --tags
$ git config --global merge.tool meld
$ git mergetool
$ git merge
$ git branch --merged
$ git rebase
$ git rebase --abort
$ git rebase --continue
$ git add
$ git rm
$ git rebase -i
pick
pick
$ git reset --hard HEAD
git add
):
$ git reset HEAD
$ git checkout HEAD
$ git revert
$ git reset --hard
$ git reset --hard
$ git reset
$ git reset --keep
$ git rm -r --cached .
$ git add .
$ git commit -m "remove xyz file"
$ brew install git-flow-avh
$ port install git-flow
$ sudo apt-get install git-flow
$ wget -q -O - --no-check-certificate https://raw.githubusercontent.com/petervanderdoes/gitflow/develop/contrib/gitflow-installer.sh install
git flow init
git flow init -d
git flow feature start MYFEATURE
git flow feature finish MYFEATURE
git flow feature publish MYFEATURE
git flow feature pull origin MYFEATURE
git flow feature track MYFEATURE
git flow release start RELEASE [BASE]
git flow release publish RELEASE
git flow release track RELEASE
git flow release finish RELEASE
git push --tags
$ git flow hotfix start VERSION [BASENAME]
git flow hotfix finish VERSION