Skip to content

Git

Config

Disable SSL verification in global config

git config --global http.sslVerify false

Disable SSL verification for a single repo

git -c http.sslVerify=false clone <repo>

Then from the root of the repo (where the .git folder resides)

git config http.sslVerify false

Cater for different users using git as user 'root'

In root's /.kshrc

SUDO_USER="${SUDO_USER:-'none'}"
if [ ${SUDO_USER} = "johndoe" ]; then
    export GIT_AUTHOR_NAME="John Doe"
    export GIT_COMMITTER_NAME="John Doe"
    export GIT_AUTHOR_EMAIL="[email protected]"
    export GIT_COMMITTER_EMAIL="[email protected]"
elif [ ${SUDO_USER} = "janedoe" ]; then
    export GIT_AUTHOR_NAME="Jane Doe"
    export GIT_COMMITTER_NAME="Jane Doe"
    export GIT_AUTHOR_EMAIL="[email protected]"
    export GIT_COMMITTER_EMAIL="[email protected]"
fi

Remotes

Changing a remote's URL (https or ssh)

$ git remote -v
origin  https://github.com/Kristijan/notes.git (fetch)
origin  https://github.com/Kristijan/notes.git (push)
$ git remote set-url origin https://github.com/somethingelse/notes.git
$ git remote -v
origin  https://github.com/somethingelse/notes.git (fetch)
origin  https://github.com/somethingelse/notes.git (push)

Add remote upstream after fork

$ git remote -v
origin  ssh://[email protected]:7999/~kristijan/compliance.git (fetch)
origin  ssh://[email protected]:7999/~kristijan/compliance.git (push)
$ git remote add upstream ssh://[email protected]:7999/unix/compliance.git
$ git remote -v
origin  ssh://[email protected]:7999/~kristijan/compliance.git (fetch)
origin  ssh://[email protected]:7999/~kristijan/compliance.git (push)
upstream        ssh://[email protected]:7999/unix/compliance.git (fetch)
upstream        ssh://[email protected]:7999/unix/compliance.git (push)

Pull down changes from both upstream and origin

git remote update

Aliases

Decorated oneline graph

git config --global alias.lga "log --oneline --all --decorate --graph"

One line summary

git config --global alias.lgo "log --color --pretty=format:'%C(yellow)%h%Creset - %C(cyan)%ad%Creset %<(80,trunc)%s   %C(cyan)%>(20,trunc)%an - %Cgreen%>(12)%ar%Creset' --date=short --abbrev-commit --all"

Commits

Automatically commit all files being tracked

git commit -a -m "commit message"

Squashing commits and rebase onto master

$ git switch master
$ git pull
$ git switch <other_branch>
$ git rebase -i master
pick dedd08d commit1
squash 8e782a4 commit2
squash 036bca2 commit3
squash ff8a125 commit4
$ git push --force-with-lease

Find parent commits of a merge

$ git log --format=raw -n1
commit 61713c9ac641091c20045e9d3bde34f31d8e3621
tree 9d8c97f166cc9082c1949f21ed7b61a4fc33a420
parent c507b242517ba651b4fae5254c607571f666ffe2
parent a12033cb2e0933849a374defd272bd71a06b62ed

The highlighted commit above should be where the branch was before the merge.

Create empty commit

Create an empty commit to do things like trigger builds, etc...

git commit --allow-empty -m "Trigger build"

Show commit hash for each file

$ git ls-files --sparse --full-name -z | xargs -0 -I FILE -P 20 git log -1 --date=iso-strict-local --format='%ad %>(14) %cr %<(5) %an  %h ./FILE' -- FILE | sort --general-numeric-sort
2021-06-05T14:40:30+10:00  2 years, 5 months ago  Kristian Milos  d280e68 ./docs/gpfs.md
2021-06-05T14:40:30+10:00  2 years, 5 months ago  Kristian Milos  d280e68 ./docs/index.md
2021-06-05T14:40:30+10:00  2 years, 5 months ago  Kristian Milos  d280e68 ./docs/nim.md
2021-06-05T14:40:30+10:00  2 years, 5 months ago  Kristian Milos  d280e68 ./docs/vios.md
2021-06-05T14:40:30+10:00  2 years, 5 months ago  Kristian Milos  d280e68 ./docs/wpar.md
2021-06-05T14:59:15+10:00  2 years, 5 months ago  Kristian Milos  170190d ./.github/workflows/ci.yml
...

Show all commit hashes for file

$ git ls-files --sparse --full-name -z | xargs -0 -I FILE -P 20 git log --date=iso-strict-local --format='%ad %>(14) %cr %<(5) %an  %h ./FILE' -- FILE | sort --general-numeric-sort
2023-01-11T17:19:25+11:00   10 months ago  Kristian Milos  cac3a2a ./docs/git.md
2023-03-17T16:09:35+11:00    7 months ago  Kristian Milos  9633d50 ./docs/aix.md
2023-03-23T12:41:12+11:00    7 months ago  Kristian Milos  0c1ce12 ./docs/aix.md
2023-06-09T12:00:20+10:00    5 months ago  Kristian Milos  30b8b9b ./docs/git.md
2023-06-15T17:06:15+10:00    4 months ago  Kristian Milos  229804b ./docs/aix.md
2023-06-15T17:14:56+10:00    4 months ago  Kristian Milos  358c456 ./docs/aix.md
...

Show commit count for each file

This will list which files have been in commits the most.

$ git log --pretty=format: --name-only | sed '/^$/d' | sort | uniq -c | sort -g
   1 docs/CNAME
   1 docs/gpfs.md
   1 docs/nim.md
   1 docs/vios.md
   1 docs/wpar.md
   2 .gitignore
   4 docs/hmc.md
   4 docs/index.md
   4 docs/powerha.md
   7 .github/workflows/ci.yml
  10 docs/aix.md
  11 mkdocs.yml
  15 docs/git.md

Branches

Create new branch and switch

git switch -c <new-branch>

Create new branch from another branch and switch

git switch -c <new-branch> <start-point>

Switch back and forth between two different branches

git switch -

Update a branch with changes from master

git fetch origin master
git rebase origin/master

Reset local branch to match remote

git fetch origin
git reset --hard origin/master

Rename a branch

git branch -m <new_name>

Rename branch if already pushed to remote

git branch -m <new_name>
git push -u origin <new_name>
git push origin --delete <old_name>

Delete a branch

git branch -d <branch>

Delete a remote branch

git push origin -d <branch>

List all branches and the commit they point to

git branch -av

Delete local remote tracking branch if the remote branch has been merged

git checkout master
git remote update origin --prune
git branch --merged | grep -v master | xargs git branch -d

Logs

Condensed summary

git log --summary

Decorated graph

git log --oneline --all --decorate --graph

Details of a specific commit

git show <commit> [-s]

List of commits per user

git shortlog -sne
    16  Kristian Milos <[email protected]>
     2  Goat Man <[email protected]>
     2  Mwark <[email protected]>

List of commits per user after a certain date

git shortlog -sne --after 2023-06-01
    16  Kristian Milos <[email protected]>
     2  Goat Man <[email protected]>

Blame

Show blame from a specific line in a file

This will show a git blame of 10 lines commencing at line 14.

git blame -L 14,+10 -- files/to/blame.txt

Diff

Diff from staged files

git diff --staged

Show committed files to be pushed to remote

git diff --stat --cached <remote/branch>

Diff between local and remote file

git diff origin/branchname -- location/of/file.txt

Diff between two branches

git diff <branch1>..<branch2>

Diff between file in two different branches

git diff <branch1>..<branch2> -- location/of/file.txt

Diff of filenames between two commits/branches

git diff --name-only <commit1/branch1> <commit2/branch2>
git diff --name-status <commit1/branch1> <commit2/branch2>
git diff --stat <commit1/branch1> <commit2/branch2>

Diff contents of a single file between two commits

git diff 9e9384392 61713c9ac <filename>

Tags

Tag an existing commit

git log --pretty=oneline
git tag -m "Package version 1.5.0.22" -a v1.5.0.22 <commit_id>

Push all tags to remotte

git push origin --tags

Push a single tag to remote

git push origin v1.5.0.22

Delete local tag

git tag -d v1.5.0.22

Delete remote tag

git push --delete origin v1.5.0.22

Update local tags from remote

git fetch --tags --force

Show the commit a tag is pointing to

git rev-list -n 1 <tag>

Reset, Restore, & Remove

Unstage a file

git reset <file>

Undo last commit that hasn't been pushed

git reset HEAD^

Discard all branch changes and refresh from remote

git reset --hard origin/master

Unstaging a file, but leaving its actual changes untouched

git restore --staged myFile.txt

Discard local changes in a certain file

git restore myFile.txt

Undo all local changes in the working copy

git restore .

Restore any previous version of a specific file

git restore --source master index.html
git restore --source 6bcf266b index.html

Remove a staged file

git rm <file>

git showing unstaged changes

git rm --cached -r .
git reset --hard

Miscellaneous

Using git bisect to find bad commits

  1. Start the bisect and provide both the 'good' and 'bad' commit hashes.

    $ git bisect start
    status: waiting for both good and bad commits
    $ git bisect good 72f09f
    status: waiting for bad commit, 1 good commit known
    $ git bisect bad fd1bbb5
    Bisecting: 11 revisions left to test after this (roughly 4 steps)
    [adf2e0caec46fa82eea3ae4754fd0bea8d137e3d] fixed shellcheck SC2015 violation
    
  2. Run your tests, marking each failed test as 'bad'.

    $ git bisect bad
    Bisecting: 2 revisions left to test after this (roughly 2 steps)
    [de1031a7d43aeb355482890159f53437094bf7a9] make sure to use /usr/bin/infocmp to probe if tmux-256color is available system wide (3), fixes #618
    $ git bisect bad
    Bisecting: 0 revisions left to test after this (roughly 1 step)
    [044d6336e84034c14760a2fe178f604a89626bfb] make sure to use /usr/bin/infocmp to probe if tmux-256color is available system wide (2), fixes #617
    
  3. When your test passes, mark the commit as 'good'

    $ git bisect good
    044d6336e84034c14760a2fe178f604a89626bfb is the first bad commit
    commit 044d6336e84034c14760a2fe178f604a89626bfb
    Author: Gregory Pakosz <[email protected]>
    Date:   Sat Jan 21 21:57:51 2023 +0100
    
        make sure to use /usr/bin/infocmp to probe if tmux-256color is available system wide (2), fixes #617
    
        some operating systems like NixOS don't have /usr/bin/infocmp
    
    .tmux.conf | 15 ++++++++++++++-
    1 file changed, 14 insertions(+), 1 deletion(-)
    

    The highlighted commit above should be where the bug/issue was introduced.

  4. Once complete, clean up the bisection state and return to the original HEAD.

    $ git bisect reset
    Previous HEAD position was 2cf4d9a make sure to use /usr/bin/infocmp to probe if tmux-256color is available system wide
    Switched to branch 'master'
    Your branch is up to date with 'origin/master'.
    

List of files/blobs sorted by size

$ git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
  sed -n 's/^blob //p' |
  sort --numeric-sort --key=2 |
  cut -c 1-12,41- |
  $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
...
...
...
83367b100bdf   50KiB docs/aix.md
e0f87ab30a21   50KiB docs/aix.md
815a3edec4d5   50KiB docs/aix.md
a11c5026a642   53KiB docs/aix.md
bd015cca4288   53KiB docs/aix.md
9c8f5774ab55   56KiB git/index.html
6c8a85661a40   58KiB powerha/index.html
11c2602bcedb   60KiB gpfs/index.html
3b7b4ecfc742   66KiB hmc/index.html