Skip to content

Instantly share code, notes, and snippets.

@hofmannsven
Last active April 7, 2024 09:28
Show Gist options
  • Save hofmannsven/6814451 to your computer and use it in GitHub Desktop.
Save hofmannsven/6814451 to your computer and use it in GitHub Desktop.
Git CLI Cheatsheet

Git

Global Settings

Reminder

Press minus + shift + s and return to chop/fold long lines!

Show folder content: ls -la

Notes

Do not put (external) dependencies in version control!

Setup

See where Git is located: which git

Get the version of Git: git --version

Create an alias (shortcut) for git status: git config --global alias.st status

Help: git help

General

Initialize Git: git init

Get everything ready to commit: git add .

Get custom file ready to commit: git add index.html

Commit changes: git commit -m "Message"

Commit changes with title and description: git commit -m "Title" -m "Description..."

Add and commit in one step: git commit -am "Message"

Remove files from Git: git rm index.html

Update all changes: git add -u

Remove file but do not track anymore: git rm --cached index.html

Move or rename files: git mv index.html dir/index_new.html

Undo modifications (restore files from latest commited version): git checkout -- index.html

Restore file from a custom commit (in current branch): git checkout 6eb715d -- index.html

Reset

Go back to commit: git revert 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Soft reset (move HEAD only; neither staging nor working dir is changed): git reset --soft 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Undo latest commit: git reset --soft HEAD~

Mixed reset (move HEAD and change staging to match repo; does not affect working dir): git reset --mixed 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Hard reset (move HEAD and change staging dir and working dir to match repo): git reset --hard 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Hard reset of a single file (@ is short for HEAD): git checkout @ -- index.html

Update & Delete

Test-Delete untracked files: git clean -n

Delete untracked files (not staging): git clean -f

Unstage (undo adds): git reset HEAD index.html

Update most recent commit (also update the commit message): git commit --amend -m "New Message"

Branch

Show branches: git branch

Create branch: git branch branchname

Change to branch: git checkout branchname

Create and change to new branch: git checkout -b branchname

Rename branch: git branch -m branchname new_branchname or: git branch --move branchname new_branchname

Show all completely merged branches with current branch: git branch --merged

Delete merged branch (only possible if not HEAD): git branch -d branchname or: git branch --delete branchname

Delete not merged branch: git branch -D branch_to_delete

Merge

True merge (fast forward): git merge branchname

Merge to master (only if fast forward): git merge --ff-only branchname

Merge to master (force a new commit): git merge --no-ff branchname

Stop merge (in case of conflicts): git merge --abort

Stop merge (in case of conflicts): git reset --merge // prior to v1.7.4

Undo local merge that hasn't been pushed yet: git reset --hard origin/master

Merge only one specific commit: git cherry-pick 073791e7

Rebase: git checkout branchname » git rebase master or: git merge master branchname (The rebase moves all of the commits in master onto the tip of branchname.)

Cancel rebase: git rebase --abort

Squash multiple commits into one: git rebase -i HEAD~3 (source)

Squash-merge a feature branch (as one commit): git merge --squash branchname (commit afterwards)

Stash

Put in stash: git stash save "Message"

Show stash: git stash list

Show stash stats: git stash show stash@{0}

Show stash changes: git stash show -p stash@{0}

Use custom stash item and drop it: git stash pop stash@{0}

Use custom stash item and do not drop it: git stash apply stash@{0}

Use custom stash item and index: git stash apply --index

Create branch from stash: git stash branch new_branch

Delete custom stash item: git stash drop stash@{0}

Delete complete stash: git stash clear

Gitignore & Gitkeep

About: https://help.github.com/articles/ignoring-files

Useful templates: https://github.com/github/gitignore

Add or edit gitignore: nano .gitignore

Track empty dir: touch dir/.gitkeep

Log

Show commits: git log

Show oneline-summary of commits: git log --oneline

Show oneline-summary of commits with full SHA-1: git log --format=oneline

Show oneline-summary of the last three commits: git log --oneline -3

Show only custom commits: git log --author="Sven" git log --grep="Message" git log --until=2013-01-01 git log --since=2013-01-01

Show only custom data of commit: git log --format=short git log --format=full git log --format=fuller git log --format=email git log --format=raw

Show changes: git log -p

Show every commit since special commit for custom file only: git log 6eb715d.. index.html

Show changes of every commit since special commit for custom file only: git log -p 6eb715d.. index.html

Show stats and summary of commits: git log --stat --summary

Show history of commits as graph: git log --graph

Show history of commits as graph-summary: git log --oneline --graph --all --decorate

Shows commits where the given string was added or removed: git log -S 'assertInvalid' -- src/Illuminate/Testing/TestResponse.php (If assertInvalid only appears once in the git history of src/Illuminate/Testing/TestResponse.php file, it means that once it was introduced, it wasn't removed or added back, hence only one commit is shown in the results.)

Compare

Compare modified files: git diff

Compare modified files and highlight changes only: git diff --color-words index.html

Compare modified files within the staging area: git diff --staged

Compare branches: git diff master..branchname

Compare branches like above: git diff --color-words master..branchname^

Compare commits: git diff 6eb715d git diff 6eb715d..HEAD git diff 6eb715d..537a09f

Compare commits of file: git diff 6eb715d index.html git diff 6eb715d..537a09f index.html

Compare without caring about spaces: git diff -b 6eb715d..HEAD or: git diff --ignore-space-change 6eb715d..HEAD

Compare without caring about all spaces: git diff -w 6eb715d..HEAD or: git diff --ignore-all-space 6eb715d..HEAD

Useful comparings: git diff --stat --summary 6eb715d..HEAD

Blame: git blame -L10,+1 index.html

Releases & Version Tags

Show all released versions: git tag

Show all released versions with comments: git tag -l -n1

Create release version: git tag v1.0.0

Create release version with comment: git tag -a v1.0.0 -m 'Message'

Checkout a specific release version: git checkout v1.0.0

Collaborate

Show remote: git remote

Show remote details: git remote -v

Add remote upstream from GitHub project: git remote add upstream https://github.com/user/project.git

Add remote upstream from existing empty project on server: git remote add upstream ssh://root@123.123.123.123/path/to/repository/.git

Fetch: git fetch upstream

Fetch a custom branch: git fetch upstream branchname:local_branchname

Merge fetched commits: git merge upstream/master

Remove origin: git remote rm origin

Show remote branches: git branch -r

Show all branches (remote and local): git branch -a

Create and checkout branch from a remote branch: git checkout -b local_branchname upstream/remote_branchname

Compare: git diff origin/master..master

Push (set default with -u): git push -u origin master

Push: git push origin master

Force-Push: `git push origin master --force

Pull: git pull

Pull specific branch: git pull origin branchname

Fetch a pull request on GitHub by its ID and create a new branch: git fetch upstream pull/ID/head:new-pr-branch

Clone to localhost: git clone https://github.com/user/project.git or: git clone ssh://user@domain.com/~/dir/.git

Clone to localhost folder: git clone https://github.com/user/project.git ~/dir/folder

Clone specific branch to localhost: git clone -b branchname https://github.com/user/project.git

Clone with token authentication (in CI environment): git clone https://oauth2:<token>@gitlab.com/username/repo.git

Delete remote branch (push nothing): git push origin :branchname or: git push origin --delete branchname

Archive

Create a zip-archive: git archive --format zip --output filename.zip master

Export/write custom log to a file: git log --author=sven --all > log.txt

Troubleshooting

Ignore files that have already been committed to a Git repository: http://stackoverflow.com/a/1139797/1815847

Security

Hide Git on the web via .htaccess: RedirectMatch 404 /\.git (more info here: http://stackoverflow.com/a/17916515/1815847)

Large File Storage

Website: https://git-lfs.github.com/

Install: brew install git-lfs

Track *.psd files: git lfs track "*.psd" (init, add, commit and push as written above)

@devanandjha
Copy link

Simply awesome...very helpful

@ankurloriya
Copy link

awesome. Thank you

@urja-satodiya
Copy link

This is very helpful to me. But,
What is the command if i want to fetch one specific remote branch?

@KuthumiPepple
Copy link

Very helpful. Thanks

@cacad101
Copy link

Thanks!

@sachin8516
Copy link

very helpful 👍

@JDSRAO
Copy link

JDSRAO commented Jan 10, 2019

very helpful thank you!

@erdincozden
Copy link

@hofmannsven
Copy link
Author

👍

@haseebkhan1421
Copy link

haseebkhan1421 commented Jan 23, 2019

how can we push repository on to remote using git Bash

Asking because I'm new to this version control system

@YuvrajKhavad
Copy link

Wow, Thank you for this.

@shakiz
Copy link

shakiz commented Mar 19, 2019

Wohoo!! Thanks for sharing these information.

@mrsantacruz86
Copy link

Nice summary! Very useful! Thank you!

@realgio95
Copy link

best git summary I have ever seen! Thank You!

@Hakky54
Copy link

Hakky54 commented Oct 14, 2019

Hi Sven, thank you for this great cheatsheet. Could you maybe add this one at the git stash part: git stash save --include-untracked --keep-index
This is an option to stash all tracked and untracked git changes.

@anieriz
Copy link

anieriz commented Oct 28, 2019

Hi, thanks for this cheatsheet. Just what i wanted. Nice work.

@RamAndKrishna
Copy link

Thank you very much.

@jmnb-sdbg-edi
Copy link

Releases & Version Tags

  • Git tag identifying HEAD of current branch: git tag --points-at HEAD

@Asifmohammedtkd2
Copy link

Very useful! Thank you!

@Helloshanto
Copy link

Thank you :)

@agustinpfs
Copy link

great!

@nthanniru
Copy link

Thank You!

@speedyprem
Copy link

It's very useful, Good work man .. Thanks 😊

@Arj20
Copy link

Arj20 commented Jun 29, 2021

Thank you!

@Prasanth-Shakti
Copy link

Thanks a lot.

@rajendratechment
Copy link

I am very thankful by your work

@Pablo23117
Copy link

Thanks!

@RamsesPH
Copy link

Helpful, Thanks a lot

@lizardkingLK
Copy link

lizardkingLK commented Oct 12, 2023

Cloning with submodules

  • Clone the repo
    git clone <repo_url>

  • Go to Root
    cd <repo_name>

  • Initialize submodules
    git submodule init

  • Clone submodules
    git submodule update

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment