Git Cheatsheet
Git autocomplete
# curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash
# .bashrc
if [ -f ~/.git-completion.bash ]; then
export GIT_COMPLETION_CHECKOUT_NO_GUESS=0
export GIT_COMPLETION_SHOW_ALL_COMMANDS=1
export GIT_COMPLETION_SHOW_ALL=1
source ~/.git-completion.bash
fi
Debug flag, verbose output of commands, output debug
Clean working tree remove untracked files
Restore
Restore local branch like remote one
Restore local branch with saving all the work
# save work to staging
git reset --soft origin/master
# save work to working dir
git reset --mixed HEAD~2
Restore removed file, restore deleted file, find removed file, show removed file
# find full path to the file
file_name="integration_test.sh.j2"
git log --diff-filter=D --name-only | grep $file_name
# find last log messages
full_path="ansible/roles/data-ingestion/templates/integration_test.sh.j2"
git log -2 --name-only -- $full_path
second_log_commit="99994ccef3dbb86c713a44815ab5ffa"
# restore file from specific commit
git checkout $second_log_commit -- $full_path
# show removed file
git show $second_log_commit:$full_path
Remove last commit and put HEAD to previous one
Checkout with tracking
New branch from stash
Show removed remotely
Delete local branch, remove branch, remove local branch
git branch -d release-6.9.0
git branch --delete release-6.9.0
# delete with force - for non-merged branches
git branch -D origin/release/2018.05.00.12-test
# the same as
git branch -d -f release-6.9.0
git branch --delete --force origin/release/2018.05.00.12-test
Delete remote branch, remove remote, remove remote branch
Remove branches, delete branches that exist locally only ( not remotely ), cleanup local repo
Delete local branches that was(were) merged to master ( and not have 'in-progress' marker )
Remove commit, remove wrong commit
commit1=10141d299ac14cdadaca4dd586195309020
commit2=b6f2f57a82810948eeb4b7e7676e031a634 # should be removed and not important
commit3=be82bf6ad93c8154b68fe2199bc3e52dd69
current_branch=my_branch
current_branch_ghost=my_branch_2
git checkout $commit1
git checkout -b $current_branch_ghost
git cherry-pick $commit3
git push --force origin HEAD:$current_branch
git reset --hard origin/$current_branch
git branch -d $current_branch_ghost
Squash commit replace batch of commits
git checkout my_branch
# take a look into your local changes, for instance we are going to squeeze 4 commits
git reset --soft HEAD~4
# in case of having external changes and compress commits: git rebase --interactive HEAD~4
git commit # your files should be staged before
git push --force-with-lease origin my_branch
Check hash-code of the branch, show commit hash code
Print current hashcode commit hash last commit hash
Print branch name by hashcode to branch name show named branches branchname find branch by hash
git ls-remote | grep <hashcode>
# answer will be like: <hashcode> <branch name>
# ada7648394793cfd781038f88993a5d533d4cdfdf refs/heads/release-dataapi-13.0.2
or
Print branch hash code by name branch hash branch head hash
Check all branches for certain commit ( is commit in branch, is branch contains commit ), commit include in
git branch --all --contains 0ff27c79738a6ed718baae3e18c74ba87f16a314
git branch --all --merged 0ff27c79738a6ed718baae3e18c74ba87f16a314
# if branch in another branch
git branch --all --contains | grep {name-of-the-branch}
Is commit included in another, commit before, commit after, if commit in branch
git merge-base --is-ancestor <commit_or_branch> <is_commit_in_branch>; if [[ 1 -eq "$?" ]]; then echo "NOT included"; else echo "included"; fi
Check log by hash, message by hash
Check last commits for specific branch, last commits in branch
Check last commits for subfolder, check last commits for author, last commit in folder
Log pretty print log oneline
Check files only for last commits
Check last commits by author, commits from all branches
git log -10 --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --all --author "Cherkashyn"
List of authors, list of users, list of all users
List of files by author, list changed files
Often changes by author, log files log with files
Commit show files, files by commit
Commit diff, show changes by commit, commit changes
Pretty log with tree
Git log message search commit message search commit search message
git log | grep -i jwt
git log --all --grep='jwt'
git log --name-only --grep='XVIZ instance'
git log -g --grep='jwt'
Show no merged branches
Show branches with commits
Checkout branch locally and track it
Copy file from another branch
git checkout experiment -- deployment/connection_pool.py
git checkout origin/develop datastorage/mysql/scripts/_write_ddl.sh
# print to stdout
git show origin/develop:datastorage/mysql/scripts/_write_ddl.sh > _write_ddl.sh
Git add
Git mark file unchanged skip file
Set username, global settings
git config --global user.name "vitalii cherkashyn"
git config --global user.email vitalii.cherkashyn@wirecard.de
git config --global --list
or
Default editor, set editor
Avoid to enter login/password
Revert all previous changes with "credential.helper"
Git config mergetool
Show all branches merged into specified
git branch --all --merged "release" --verbose
git branch --all --no-merged "release" --verbose
git branch -vv
Difference between two commits ( diff between branches )
Difference between branches for file ( diff between branches, compare branches )
github difference between two branches https://github.com/cherkavi/management/compare/release-4.0.6...release-4.0.7
Difference between branch and current file ( compare file with file in branch )
Difference between commited and staged
Difference between two branches, list of commits list commits, messages list of messages between two commits
git rev-list master..search-client-solr
# by author
git rev-list --author="Vitalii Cherkashyn" item-598233..item-530201
# list of files that were changed
git show --name-only --oneline `git rev-list --author="Vitalii Cherkashyn" item-598233..item-530201`
# list of commits between two branches
git show --name-only --oneline `git rev-list d3ef784e62fdac97528a9f458b2e583ceee0ba3d..eec5683ed0fa5c16e930cd7579e32fc0af268191`
List of commits between two tags
# git tag --list
start_tag='1.0.13'
end_tag='1.1.2'
start_commit=$(git show-ref --hash $start_tag )
end_commit=$(git show-ref --hash $end_tag )
git show --name-only --oneline `git rev-list $start_commit..$end_commit`
All commits from tag till now
start_tag='1.1.2'
start_commit=$(git show-ref --hash $start_tag )
end_commit=$(git log -n 1 --pretty=format:'%H')
git show --name-only --oneline `git rev-list $start_commit..$end_commit`
Difference for log changes, diff log, log diff
Copying from another branch, copy file branch
branch_source="master"
branch_dest="feature-2121"
file_name="src/libs/service/message_encoding.py"
# check
git diff $branch_dest..$branch_source $file_name
# apply
git checkout $branch_source -- $file_name
# check
git diff $branch_source $file_name
Tags
Create tag
Push tags only
Show tags
# show current tags show tags for current commit
git show
git describe --tags
git describe
# fetch tags
git fetch --all --tags -prune
# list of all tags list tag list
git tag
git tag --list
git show-ref --tags
# tag checkout tag
git tags/1.0.13
Show tag hash
Remove tag delete tag delete
# remove remote
git push --delete origin 1.1.0
git push origin :refs/tags/1.1.0
git fetch --all --tags -prune
# or remove remote
git push --delete origin 1.2.1
# remove local
git tag -d 1.1.0
git push origin :refs/tags/1.1.0
Conflict files, show conflicts
Conflict file apply remote changes
Git fetch
Find by comment
Find by diff source, find through all text changes in repo
Current comment
Find file into log
History of file, file changes file authors file log file history file versions
Files in commit
Difference between current state and remote branch
Show changes into file only
git show 143243a3754c51b16c24a2edcac4bcb32cf0a37d -- db-scripts/src/main/python/db-diff/db-update.py
Show changes by commit, commit changes
Git cherry pick without commit, just copy changes from another branch
Git cherry pick with original commit message cherry pick tracking cherry pick original hash
Git cherry pick, git cherry-pick conflict
# in case of merge conflict during cherry-pick
git cherry-pick --continue
git cherry-pick --abort
git cherry-pick --skip
# !!! don't use "git commit"
Git new branch from detached head
Git revert commit
Git revert message for commit
Git show author of the commit, log commit, show commits only
Show author, blame, annotation, line editor, show editor
Git into different repository, different folder, another folder, not current directory
find . -name ".git" -maxdepth 2 | while read each_file
do
echo $each_file
git --git-dir=$each_file --work-tree=`dirname $each_file` status
done
Show remote url
Git chain of repositories
Connect to existing repo
PATH_TO_FOLDER=/home/projects/bash-example
# remote set
git remote add local-hdd file://${PATH_TO_FOLDER}/.git
# commit all files
git add *; git commit --message 'add all files to git'
# set tracking branch
git branch --set-upstream-to=local-hdd/master master
# avoid to have "refusing to merge unrelated histories"
git fetch --all
git merge master --allow-unrelated-histories
# merge all conflicts
# in original folder move to another branch for avoiding: branch is currently checked out
git push local-hdd HEAD:master
# go to origin folder
cd $PATH_TO_FOLDER
git reset --soft origin/master
git diff
Using authentication token personal access token, git remote set, git set remote
example of using github.com
# Settings -> Developer settings -> Personal access tokens
# https://github.com/settings/apps
git remote set-url origin https://$GIT_TOKEN@github.com/cherkavi/python-utilitites.git
# in case of Error: no such remote
git remote add origin https://$GIT_TOKEN@github.com/cherkavi/python-utilitites.git
# in case of asking username & password - check URL, https prefix, name of the repo....
remove old password-access approach
Change remote url
Git clone via https
# username - token
# password - empty string
git clone https://$GIT_TOKEN@cc-github.group.net/swh/management.git
git clone https://oauth2:$GIT_TOKEN@cc-github.group.net/swh/management.git
git clone https://$GIT_TOKEN:x-oauth-basic@cc-github.group.net/swh/management.git
Git push via ssh git ssh
Issue with removing files, issue with restoring files, can't restore file, can't remove file
Clone operation under the hood
if during the access ( clone, pull ) issue appear:
fatal: unable to access 'http://localhost:3000/vitalii/sensor-yaml.git/': The requested URL returned error: 407
or
fatal: unable to access 'http://localhost:3000/vitalii/sensor-yaml.git/': The requested URL returned error: 503
use next command to 'simulate' cloning
git clone http://localhost:3000/vitalii/sensor-yaml.git
< equals >
wget http://localhost:3000/vitalii/sensor-yaml.git/info/refs?service=git-upload-pack
Clone only files without history, download code
Download single file from repo
Update remote branches, when you see not existing remote branches
Worktree
worktree it is a hard copy of existing repository but in another folder all worktrees are connected
# list of all existing wortrees
git worktree list
# add new worktree list
git worktree add $PATH_TO_WORKTREE $EXISTING_BRANCH
# add new worktree with checkout to new branch
git worktree add -b $BRANCH_NEW $PATH_TO_WORKTREE
# remove existing worktree, remove link from repo
git worktree remove $PATH_TO_WORKTREE
git worktree prune
Git lfs
echo 'deb http://http.debian.net/debian wheezy-backports main' > /etc/apt/sources.list.d/wheezy-backports-main.list
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
tool installation
if you are using SSH access to git, you should specify http credentials ( lfs is using http access ), to avoid possible errors: "Service Unavailable...", "Smudge error...", "Error downloading object"
file .gitconfig will have next section
file ~/.git-credentials ( default from previous command ) should contains your http(s) credentials
```file:~/.git-credentials https://username:userpass@aa-github.mygroup.net https://username:userpass@aa-artifactory.mygroup.ne
NO_PROXY=localhost,127.0.0.1,.localdomain,.advantage.org HTTP_PROXY=muc.proxy HTTPS_PROXY=muc.proxy Encountered 1 file(s) that should have been pointers, but weren't: git lfs migrate import --no-rewrite path-to-filecheck tracking changes in file:
Create local repo in filesystem
# create bare repo file:///home/projects/bmw/temp/repo
# for avoiding: error: failed to push some refs to
mkdir /home/projects/bmw/temp/repo
cd /home/projects/bmw/temp/repo
git init --bare
# or git config --bool core.bare true
# clone to copy #1
mkdir /home/projects/bmw/temp/repo2
cd /home/projects/bmw/temp/repo2
git clone file:///home/projects/bmw/temp/repo
# clone to copy #1
mkdir /home/projects/bmw/temp/repo3
cd /home/projects/bmw/temp/repo3
git clone file:///home/projects/bmw/temp/repo
Configuration for proxy server, proxy configuration
Set proxy, using proxy
git config --global http.proxy 139.7.95.74:8080
# proxy settings
git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:8080
git config --global https.proxy 139.7.95.74:8080
Check proxy, get proxy
Remove proxy configuration, unset proxy
Using additional command before 'fetch' 'push', custom fetch/push
# remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
git config core.sshCommand 'ssh -i private_key_file'
Set configuration
Remove auto replacing CRLF for LF on Windows OS
.gitattributes
Http certificate ssl verification
git config --system http.sslcainfo C:\soft\git\usr\ssl\certs\ca-bundle.crt
# or
git config --system http.sslverify false
Download latest release from github, release download
curl -s https://api.github.com/repos/bugy/script-server/releases/latest | grep browser_download_url | cut -d '"' -f 4
Download last version of file from github, url to source, source download
Linux command line changes
#git settings parse_git_branch() {
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\[\033[32m\]\W\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
Ignore tracked file, ignore changes
Hooks
Check commit message
result=`cat $1 | grep "^check-commit"`
if [ "$result" != "" ]; then
exit 0
else
echo "message should start from 'check-commit'"
exit 1
fi
if you want to commit hooks, then create separate folder and put all files there
git --git-dir $DIR_PROJECT/integration-prototype/.git config core.hooksPath $DIR_PROJECT/integration-prototype/.git_hooks
Git template message template
git --git-dir $DIR_PROJECT/integration-prototype/.git config commit.template $DIR_PROJECT/integration-prototype/.commit.template
Git lint
.gitlint
# See http://jorisroovers.github.io/gitlint/rules/ for a full description.
[general]
ignore=T3,T5,B1,B5,B7
[title-match-regex]
regex=^[A-Z].{0,71}[^?!.,:; ]
Github REST API
export PAT=07f1798524d6f79... export GIT_USER=tech_user export GIT_USER2=another_user export GIT_REPO=system_description export GIT_URL=https://github.sbbgroup.zur
# read user's data
curl -H "Authorization: token ${PAT}" ${GIT_URL}/api/v3/users/${GIT_USER}
curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/users/${GIT_USER2}
# list of repositories
curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/users/${GIT_USER2}/repos | grep html_url
# read repository
curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/repos/${GIT_USER2}/${GIT_REPO}
curl -H "Authorization: token ${PAT}" ${GIT_URL}/api/v3/repos/${GIT_USER2}/${GIT_REPO}
# read path
export FILE_PATH=doc/README
curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/repos/${GIT_USER2}/${GIT_REPO}/contents/${FILE_PATH}
curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/repos/${GIT_USER2}/${GIT_REPO}/contents/${FILE_PATH} | jq .download_url
# https://docs.github.com/en/enterprise-server@3.1/rest/reference/repos#contents
# read content
DOWNLOAD_URL=`curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/repos/${GIT_USER2}/${GIT_REPO}/contents/${FILE_PATH} | jq .download_url | tr '"' ' '`
echo $DOWNLOAD_URL
curl -u ${GIT_USER}:${PAT} -X GET $DOWNLOAD_URL
# read content
curl -u ${GIT_USER}:${PAT} ${GIT_URL}/api/v3/repos/${GIT_USER2}/${GIT_REPO}/contents/${FILE_PATH} | jq -r ".content" | base64 --decode