Saltar al contenido
← Volver a links

OMGit

Git Quick Reference

#OMGit! <3

Git Quick Reference

Git Cheat Sheet Image

#Setting up

#Set author name

(to be show on version history)

git config --global user.name "<firstname lastname>"

e.g.:

git config --global user.name "Andréia Bohner"

#Set email address

git config --global user.email "<email>"

#Change author's name and email

git commit --amend --author="<firstname lastname> <<email>>" --no-edit

#Set automatic CLI coloring for Git

git config --global color.ui auto

#Configure line-ending (CRLF)

git config core.autocrlf

show current CRLF config

git config --global core.autocrlf <input|true|false>

set line-ending style

  • input: convert crlf to lf on commit but not the other way around
  • false: turn off crlf
  • true: converts lf endings into crlf

e.g.:

git config --global core.autocrlf input

#List all Git config settings

git config --list

#Workflow

#Create a new repository from current local directory (local files)

git init <repository_name>

#Create a new repository locally from a remote repository

git clone <repository_url>

e.g:

git clone https://github.com/path/repository.git

#Create a new branch

Create a new branch based on [base_branch] or on current branch if [base_banch] isn't informed and check it out right away:

git checkout -b <branch_name> [base_banch]

Create a new branch based on current branch and stays on current branch:

git branch <branch_name>

#List all local branches

git branch

#List all local and remote branches

git branch -a

#List all tracking branches, their upstreams, last commit on branch, and if local branch is ahead, behind, or both

git branch -vv

#List all branches merged into the specified branch

git branch --merged <branch_name>

#Get new changes, branches, and tags from remote repository

(just get the changes, it doesn't merge them)

git fetch <remote_name>

it's usually:

git fetch origin

#Check changes on current branch

git status

Show the status of your working directory:

  • new, staged, and modified files.
  • current branch name
  • current commit identifier
  • changes pending to commit

#Add a local changed file to stage area

git add <path/to/file.txt>

#Add all local changes to stage area

git add .

#Commit staged local changes on current local branch

git commit -m "commit message"

#Add all local files to stage area and commit, with one line:

git commit -am "Commit message"

Equivalent to:

git add .
git commit -m "Commit message"

#Add missing file on last local commit

git add missing_file.txt
git commit --amend --no-edit

#Empty commit

git commit  --allow-empty

#Change to another local branch

git checkout <branch_name>

#Back to the previous branch

git checkout -

or:

git checkout @{-1}

#Get a remote branch locally

git fetch origin
git checkout <remote_branch_name>

or:

git checkout -t origin/<remote_branch_name>

#Merge another local branch on current local branch

git merge <branch_name_to_merge_on_current_branch>

#Merge changes from a remote branch on current local branch

(fetch from remote and merge into local)

git pull origin <remote_branch_name>

#Pick a commit from a branch and apply it to another

git cherry-pick <commit_hash>

#Conflicts

#Resolve merge conflicts in favor of pulled changes during a pull

git checkout --theirs <path/to/file.txt>

#Resolve merge conflicts in favor of my local changes during a pull

git checkout --ours <path/to/file.txt>

E.g.:

git checkout --ours package-lock.json

#Push local changes to a remote branch

git push origin <remote_branch_name>
  • -u: add upstream (tracking) reference
git push -u origin <remote_branch_name>
  • --tags: push also the tags
git push --tags origin <remote_branch_name>
  • --force: if there are changes on remote branch that aren't in local branch (command refuses to update the remote), and you want to overwrite them:
git push --force origin <remote_branch_name>

Note: You can use HEAD instead of <remote_branch_name>:

git push origin HEAD

HEAD is the current branch on your local repository:

cat .git/HEAD
ref: refs/heads/<name_of_the_branch>

#Force push and ensure you don't overwrite work from others

git push --force-with-lease origin <branch_name>

#List all operations made on local repository

e.g.: commits, checkouts, pull, ... (also list removed commits with git reset, git rebase, ...)

git reflog

#Have to work on another branch. What to do with the changes on current branch?

Move them to stash: a place to temporarily store the modified and staged files in order to change branches.

#Put the current working directory changes into stash, for later use

git stash

#Put the current working directory changes into stash with a message

git stash push -m <message>

#Put the current working directory changes into stash, including untracked files

git stash -u

or

git stash push -u

or

git stash push --include-untracked

#Add all changed files of the current working directory into stash (ignored, untracked, and tracked)

git stash -a

or

git stash --all

or

git stash push --all

#List all saved stashes

git stash list

#Show the contents of a specific stash in patch form

git stash show -p <stash@{n}>

#Get the stored stash content into working directory, and drop it from stash.

git stash pop

#Apply the content of a specific stash without removing it from the stashed list

git stash apply <stash@{n}>

#Checking changes

#Unstaged changes

git diff

#Changes staged but not commited

git diff --staged

or

git diff --cached

#Staged and unstaged changes

git diff HEAD

#All files with conflict

git diff --name-only --diff-filter=U

#Show only changed files

git show --name-only

#Changes since a provided period

git log --no-merges --raw --since='2 weeks ago'

or:

git whatchanged --since='2 weeks ago'

#Search commits by content

git log -S '<content to search>'

#Search by commit message

git log --all --grep='content to search'

or

git log --oneline | grep -F 'content to search'

#Search all changes for specific file

git log -p <path/to/file.txt>

#All changed files on specific commit

git diff-tree --no-commit-id --name-only -r <commit_sha>

#Show all commits (Git history)

(history as a one-line short message - sha & message)

git log --oneline --graph --all

#Summary of the commits grouped by author

(with the first line of each commit message)

git shortlog

#Rename Things

#Rename a local branch

git branch -m <old_name> <new_name>

#Rename a remote branch

  1. Delete the current remote branch:
git push origin --delete <old_name>
  1. Push the new local branch with the new name:
git push -u origin <new_name>

#Rename an existing remote name

List your existing remotes to get the name of the remote you want to change:

git remote -v

> origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
> origin  https://github.com/USERNAME/REPOSITORY.git (push)

Rename the remote from old_name to new_name:

git remote rename <old_name> <new_name>

E.g.:

git remote rename origin production

Check that the remote URL has changed:

git remote -v

> production  https://github.com/USERNAME/REPOSITORY.git (fetch)
> production  https://github.com/USERNAME/REPOSITORY.git (push)

#Rename the remote url of an existing local repository to match the renamed remote repository

To rename the existing local repository accordingly to the remote you can first rename the repository directory (optional) and then, to rename the remote URL to the new name:

List your existing remotes:

git remote -v

> origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
> origin  https://github.com/USERNAME/REPOSITORY.git (push)

Rename the remote URL to new_url:

git remote set-url <remote_name> <new_url>
  • <remote_name> could be origin or upstream for example
  • <new_url> could be the HTTPS or SSH URL

Change the origin remote's HTTPS URL e.g.:

git remote set-url origin https://github.com/USERNAME/NEW-REPOSITORY.git

Change the origin remote's SSH URL e.g.:

git remote set-url origin git@github.com:USERNAME/NEW-REPOSITORY.git

Check that the remote URL has changed:

git remote -v

> origin  https://github.com/USERNAME/NEW-REPOSITORY.git (fetch)
> origin  https://github.com/USERNAME/NEW-REPOSITORY.git (push)

#Rename a file

git mv <old_name> <new_name>
git commit -m "renamed"
git push origin main

#Undo Things

#Unstage a file

(retain the changes in working directory)

git reset HEAD <path/to/file.txt>

#Unstage all files

(retain the changes in working directory)

git reset HEAD -- .

#Discard changes on unstaged file in working directory

(changes to the modified file are discarded)

git checkout -- <path/to/file.txt>

#Discard changes on all unstaged files in working directory

(changes to the modified files are discarded)

git checkout .

#Undo local unpushed commit

(most recent commit)

Keep the work done on last commit (files will show in the stage area as an uncommitted change):

git reset --soft HEAD^
git reset HEAD~
git reset HEAD <path/to/file.txt>

Delete all the work done on last commit:

git reset --hard HEAD~1

#Reverting changes

git reset [--hard] <target_reference>

Switch the current branch to the target reference, leaving a difference as an uncommitted change:

git reset origin/master

Switch the current branch to the target reference, discarding all changes

git reset --hard origin/master

#Reverting changes of a specific commit

(Create a new commit, reverting changes from the specified commit. It generates an inversion of changes.)

git revert <commit_sha>

#Reverting local changes to a relative time

git reset --hard HEAD@{3.minutes.ago}

#Change the last (unpushed) commit message

git commit --amend -m "New message here"

#Untrack files without deleting on working directory

git rm --cached <path/to/file.txt>

#Discard all uncommitted changes on local working directory

(uncommitted changes will be removed)

git restore .

#Revert local commits added on wrong branch and add them to the correct branch

git branch <correct_branch_name>
git reset --hard <target_reference>
git checkout <correct_branch_name>

Example: add local commits on correct fix_typo branch, remove them from the master branch, and checkout fix_typo branch:

git branch fix_typo
git reset --hard origin/master
git checkout fix_typo

#Removing

#Remove local branch

git branch -d <branch_name>
  • -D instead of -d forces deletion

#Remove remote branch

git push --delete <remote_name> <branch_name>

e.g.:

git push --delete origin my_remote_branch

#Remove file from working directory and Git repo

git rm <path/to/file.txt>

#Remove a tag from local repository

git tag -d <name>

#Remove a tag from remote repository

git push --delete origin <tag_name>

or:

git push origin :refs/tags/tag_name

#Remove changes from stash

Remove the [stash_name] informed or the last one if none is provided.

git stash drop [stash_name]

e.g.:

git stash drop stash@{0}

#Remove all stored stashes

git stash clear

#Remove untracked files

(Remove untracked files. Modified files are unchanged)

git clean -f

#Remove untracked files and directories

(Remove untracked files and directories. Modified files are unchanged)

git clean -f -d

#Tagging

Types of tags:

  • lightweight: just the commit checksum stored in a file, i.e., a pointer to a specific commit
  • annotated: stored as full objects in Git (checksummed; contain the tagger name, email, and date; have a tagging message; and can be signed and verified with GNU Privacy Guard - GPG).

#List all tags

git tag

#Show the current tag you are

git describe --tags

#Create a lightweight tag for current commit or for [commit sha], if informed.

git tag <tag_name> [commit_sha]

#Create an annoted tag for current commit if [commit sha] it's not informed

git tag -a <tag_name> [commit_sha] [-m "tagging_message"]

e.g.:

git tag -a v2.1 -m "version 2.1"

#Show tag data with the commit that was tagged

git show <tag_name>

e.g.:

git show v2.1

#Remote

#List all remote references

git remote

#Change the remote's URL from SSH to HTTPS:

git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

#Change the remote's URL from HTTPS to SSH:

git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

#Notes

#Add object notes

git notes add -m 'Note message here'

#Show all notes

git log --show-notes='*'

#More useful commands

#Git help guide

git help -g

#Git web-based UI

git instaweb --httpd apache2
git instaweb --httpd nginx
git instaweb --httpd=webrick

#Sync with remote, overwrite local changes

git fetch origin && git reset --hard origin/<branch_name> && git clean -f -d

#Find the commit that has introduced a bug in the code (using binary search)

git bisect start
git bisect bad
git bisect good

#References

Nueva versión disponible.