git status
git log --graph --oneline --decorate --all --stat
git log --oneline --grep="STRING" -F -i
: Find/list all commits with msg including case-insensitive STRING
git fetch [--all]
: Fetch all remote[s] changes
git reset --hard @{u}
: RESET (hardly) current branch state to its upstream
git rebase
: Rebase current branch state to its upstream (without loosing the unpushed local commits)
git commit -am "COMMIT_MSG"
: Add only changed tracked-files to staging area & commit
git commit -a --amend
: Amend/edit the last commit to include changes in tracked files
git checkout BRANCH_NAME
: Switch/Checkout to BRANCH_NAME
git checkout -b NEW_BRANCH_NAME
: Create & checkout a new branch
git branch
: List LOCAL branches. git branch -r
: List REMOTE branches. git branch -a
: List ALL branches.
git for-each-ref --ignore-case --sort=refname --format='%(refname:lstrip=3)' refs/remotes/
: List remote branches
git branch NEW_BRANCH [<start-point>]
: Create new branch [optionally from a start-point (refs)]
git branch -d BRANCH_TO_DELETE
: Delete a branch (if it is fully-merged to its upstream or HEAD)
git branch -D BRANCH_TO_DELETE
: Delete a branch (regardless the merge state to its upstream or HEAD)
git branch -m <oldname> <newname>
: to rename a branch while pointed to any branch
git branch -m <newname>
: to rename the current branch
git checkout HEAD -- my-file.txt
: resets only my-file.txt
to its state at current HEAD
git reset HEAD~1 [--mixed]
: remove the last 1 commit & KEEP changes in working directory/tree
git reset HEAD~1 --soft
: remove the last 1 commit & KEEP changes in "Changes to be committed"
git reset HEAD~1 --hard
: remove the last 1 commit & DISCARD changes in working directory/tree
git reset --hard
: DISCARD all uncommited changes in working tree or staging area
git revert COMMIT_ID
: Revert/Undo the changes of a commit and Create a new commit with the reverted changes
git config [--global] user.email "YOU@EXAMPLE.COM"
: set the Email of the author/committer
git config [--global] user.name "YOUR NAME"
: set the Name of the author/committer
difftool.meld: git config --global difftool.meld.cmd '"C:/Program Files (x86)/Meld/Meld.exe" "$LOCAL" "$REMOTE"'
mergetool.meld: git config --global mergetool.meld.cmd '"C:/Program Files (x86)/Meld/Meld.exe" --auto-merge "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"'
difftool.p4merge: git config --global difftool.p4.cmd '"C:/Program Files/Perforce/p4merge.exe" "$LOCAL" "$REMOTE"'
mergetool.p4merge: git config --global mergetool.p4.cmd '"C:/Program Files/Perforce/p4merge.exe" "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
difftool.winmerge: git config --global difftool.winmerge.cmd '"WinMergeU.exe" -e -u -dl Local -dr Remote "$LOCAL" "$REMOTE"'
mergetool.winmerge: git config --global mergetool.winmerge.cmd '"WinMergeU.exe" -e -u -dl Base -dr Mine "$LOCAL" "$REMOTE" "$MERGED"'
git config --global difftool.prompt false
: disable prompt on lanching difftool
on each file diff
git config --global mergetool.prompt false
: disable prompt on lanching mergetool
on each file diff
git config --global diff.tool meld
: set the difftool
to meld
, p4
OR winmerge
git config --global merge.tool meld
: set the mergetool
to meld
, p4
OR winmerge
git difftool [-d|--dir-diff] ..RightBranch
: diff with another branch/commit using difftool
git difftool [-d|--dir-diff] LeftBranch..RightBranch
: diff with another branch/commit using difftool
git config credential.helper store
: store the next input credentials as plaintext in ~/.git-credentials
git config credential.helper cache [--timeout=900]
: cache the next input credentials as plaintext in global file.
git credential-cache exit
: Forget all cached credentails (stored by credential.helper cache) even before timeout
git remote set-url origin https://USER:PASS@repo-url.com/repo.git
: store credentials as plaintext for local repository (.git/config
)
git config --global core.autocrlf false
: True => EOL in working directory is CRLF while in repository is LF. False => EOL is not changed. (EOL changes "LF=>CRLF" occur @ checkout in windows).
git config --global core.excludesfile ~/.gitignore
: Global .gitignore
file (can be for vendor
, node_modules
, .idea
, nbproject
...)
*git diff ..BRANCH_TO_MERGE --ignore-all-space
or git diff CURRENT_BRANCH..BRANCH_TO_MERGE
: Compare the tips of two branches
**git merge --no-commit --stat --progress [--strategy-option==ours|theirs] BRANCH_TO_MERGE
: Merge branch to current HEAD (current checked-out branch)
*git diff HEAD -w --ignore-blank-lines
: Show any changes (in case merge is done with --no-commit)
*git diff HEAD -w --ignore-blank-lines --name-only
: List file names that changed (in case merge is done with --no-commit)
*[if conflict] git mergetool
: run the pre-configured mergetool
to resolve conflicts
*[if conflict] git diff -w --ignore-blank-lines
: Show the merge conflicts
*[if conflict] git diff -w --ignore-blank-lines --name-only --diff-filter=U
: List file names that have merge conflicts
git log --merge --decorate --source -p PATH_TO_FILE
: Show the history of a single file indicating branch names of each change
git checkout --ours -- PATH_TO_FILE
: Revert a file to to its version at "our branch" (was checked out / being merged INTO)
git checkout --theirs -- PATH_TO_FILE
: Revert a file to to its version at "their branch" (being merged)
git checkout BRANCH_NAME -- PATH_TO_FILE
: Revert a file to to its version at specific branch
**git commit -am "Merged branch BRANCH_TO_MERGE"
: Commit the merge
git tag <tagname> <commit>
: Create new tag at specified commit
git tag -d <tagname>
: Delete existing tag with given name
git tag -l
: List all existing tags
-
(Introducing concepts remote, local, push, pull) Learn to Git: Basic Concepts
-
(Branching for large projects) Git workflows in the Enterprise
-
Increasing Agility Through Continuous Delivery: Branching Strategy
-
BuildaModule: How to use a scalable Git branching model called Gitflow
Pro Git book:
An official & fully-updated guide to Git and its usage in the modern world.
Extenstion: git-flow
A collection of Git extensions to provide high-level repository operations for Vincent Driessen's branching model with functionality not added to original branch.
-
To install (updated edition):
curl https://raw.githubusercontent.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh | bash -s install develop;
-
To initialize/use:
cd REPO_PATH;
, then:git flow init;
, then run any of git-flow commands, see: cheatsheet, 1 2, 3, 4, 5, compare commands -
To uninstall:
curl https://raw.githubusercontent.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh | bash -s uninstall;
-
Note: use
--showcommands
option with anygit-flow command
to: Show git commands while executing them -
Note: you can also install
git-flow-completion
Extenstion: git-webui
A standalone git-extension for git repositories web-based user interface.
(~/.git-webui
folder, <2MB, ~ = user's home dir)
-
To install:
curl https://raw.githubusercontent.com/alberthier/git-webui/master/install/installer.sh | bash;
-
To run:
cd REPO_PATH;
, then:git webui [-h] [--port PORT] [--repo-root REPO_ROOT] [--allow-hosts ALLOW_HOSTS] [--no-browser] [--host HOST];
-
To stop: kill the
python
process -
To uninstall:
curl https://raw.githubusercontent.com/alberthier/git-webui/master/install/uninstaller.sh | bash;
--graph
: Draw a text-based graphical representation of the commit history on the left hand side of the output.
--oneline
: This is a shorthand for --pretty=oneline --abbrev-commit
used together.
--decorate
: Print out the ref names of any commits that are shown
--all
: Pretend as if all the refs in refs/
, along with HEAD
, are listed on the command line as <commit>
--relative-date
|--date=relative
: shows dates relative to the current time, e.g. “2 hours ago”.
--stat
: Generate a diffstat. By default, as much space as necessary will be used for the filename part, and the rest for the graph part
--merges
: Print only merge commits. This is exactly the same as --min-parents=2
--merge
: After a failed merge, show refs that touch files having a conflict and don’t exist on all heads to merge
--source
: show the ref (branch) name given on the command line by which each commit was reached
--pretty[=<format>]
|--format=<format>
: Pretty-print the contents of the commit logs in a given format, where can be one of oneline
, short
, medium
, full
, fuller
, email
, raw
, format:<string>
and tformat:<string>
. When <format>
is none of the above, and has %placeholder
in it, it acts as if --pretty=tformat:<format>
were given. See the "PRETTY FORMATS" section for some additional details for each format. When =<format>
part is omitted, it defaults to medium.
--grep=<pattern>
: Limit the commits output to ones with log message that matches the specified pattern (regex). With more than one --grep=<pattern>
, commits whose message matches any of the given patterns are chosen (but see --all-match
). When --show-notes
is in effect, the message from the notes is matched as if it were part of the log message.
--all-match
: Limit the commits output to ones that match all given --grep
, instead of ones that match at least one
--invert-grep
: Limit the commits output to ones with log message that do not match the pattern specified with --grep=<pattern>
-i
|--regexp-ignore-case
: Match the regular expression limiting patterns without regard to letter case
--basic-regexp
: Consider the limiting patterns to be basic regular expressions; this is the default
-E
|--extended-regexp
: Consider the limiting patterns to be extended regular expressions instead of the default basic regular expressions
-F
|--fixed-strings
: Consider the limiting patterns to be fixed strings (don’t interpret pattern as a regular expression)
--perl-regexp
: Consider the limiting patterns to be Perl-compatible regular expressions. Requires libpcre to be compiled in
-S<string>
: Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file. Intended for the scripter’s use.
It is useful when you’re looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into -S, and keep going until you get the very first version of the block.
-G<regex>
: Look for differences whose patch text contains added/removed lines that match . Notice the difference between -S<regex> --pickaxe-regex
and -G<regex>
.
--pickaxe-all
: When -S or -G finds a change, show all the changes in that changeset, not just the files that contain the change in
--pickaxe-regex
: Treat the given to -S as an extended POSIX regular expression to match
-w
|--ignore-all-space
: Ignore whitespace when comparing lines. This ignores differences even if one line has whitespace where the other line has none
-a
|--all
: automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected
--reset-author
: When used with -C/-c/--amend options, or when committing after a conflicting cherry-pick, declare that the authorship of the resulting commit now belongs to the committer. This also renews the author timestamp.
-m <msg>
|--message=<msg>
: Use the given <msg>
as the commit message. If multiple -m options are given, their values are concatenated as separate paragraphs (use multiple -m
attributes for multi-line commit message)
--amend
: Replace the tip of the current branch by a new commit. The new commit has the same parents and author as the current one (the --reset-author option can countermand this). It is a rough equivalent for:
$ git reset --soft HEAD^
$ ... do something else to come up with the right tree ...
$ git commit -c ORIG_HEAD
-F <file>
|--file=<file>
: Take the commit message from the given file
-v
|--verbose
: Show unified diff between the HEAD commit and what would be committed at the bottom of the commit message template to help the user describe the commit by reminding what changes the commit has. Note that this diff output doesn’t have its lines prefixed with #. This diff will not be a part of the commit message.
--dry-run
: Do not create a commit, but show a list of paths that are to be committed, paths with local changes that will be left uncommitted and paths that are untracked.
<file>…
: When files are given on the command line, the command commits the contents of the named files, without recording the changes already staged
git reset HEAD~1 [--mixed]
: remove a commit (reset HEAD to 1st previous commit) & KEEP changes in working directory/tree
git reset HEAD~1 --soft
: remove a commit (reset HEAD to 1st previous commit) & KEEP changes in "Changes to be committed"
git reset HEAD~1 --hard
: remove a commit (reset HEAD to 1st previous commit) & DISCARD changes in working directory/tree
git revert <commit>
: Revert/Undo/Negate the changes specified by a commit and Create a new commit with the reverted changes
-n
|--no-commit
: Usually the command automatically creates some commits with commit log messages stating which commits were reverted. This flag applies the changes necessary to revert the named commits to your working tree and the index, but does not make the commits
-f
|--force
: proceed even if the index or the working tree differs from HEAD. This is used to throw away local changes.
-b <new_branch>
: Create a new branch named <new_branch> and start it at <start_point>
-t
|--track
: set up "upstream" configuration
-m
|--merge
: When switching branches, if you have local modifications to files that are different between the current branch and the branch to which you are switching, the command refuses to switch branches in order to preserve your modifications in context. However, with this option, a three-way merge between the current branch, your working tree contents, and the new branch is done, and you will be on the new branch.
--detach
: Rather than checking out a branch to work on it, check out a commit for inspection and discardable experiments. This is the default behavior of "git checkout " when is not a branch name.
git checkout <branch/commit>
-d
|--delete
: Delete a branch. The branch must be fully merged in its upstream branch, or in HEAD if no upstream was set with --track or --set-upstream.
-D
: Shortcut for --delete --force
.
-f
|--force
: Reset to if exists already
-i
|--ignore-case
: Sorting and filtering branches are case insensitive.
-m
|--move
: Move/rename a branch and the corresponding reflog. To rename: git branch -m <oldname> <newname>
.To rename the current branch, you can do: git branch -m <newname>
.
-r
|--remotes
: List both remote-tracking branches.
-a
|--all
: List both remote-tracking branches and local branches.
-u <upstream>
|--set-upstream-to=<upstream>
: Set up 's tracking information so is considered 's upstream branch. git branch -u myRemoteName/myBranchName [myBranchName]
-a
|--all
: automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected
-w
|--ignore-all-space
: Ignore whitespace when comparing lines
--ignore-blank-lines
: Ignore changes whose lines are all blank
git status
git add "FILES"
git config credential.helper store
: The next input credentials are stored in .git-credentials
is as plaintext in order of precedence of: ~/.git-credentials
or $XDG_CONFIG_HOME/git/credentials
git config credential.helper cache [--timeout=900]
: The next input credentials are cached in $XDG_CACHE_HOME/git/credential/socket
unless ~/.git-credential-cache/socket
exists
git credential-cache exit
: Forget all cached credentails before timeout
git remote set-url origin https://USERNAME:PASSWORD@repository-url.com/group/repo.git
: Store credentials as plaintext in .git/config
file of local repository
In any git command: parameter --
(with space before & after) basically means: treat every argument after this point as a file name.