Git tips

Git general use cases

# remove commit from git
git revert --strategy resolve <commit>

# set upstream
git branch --set-upstream dev origin/remoteBranchName

# Merging
git merge -X theirs branchName
git merge -X yours branchName

# Stashing
git stash
git stash list
git stash pop
git stash apply stash@{0}

# Tagging
git tag nameTag <SHA-1>
git tag nameTag branchName
git tag nameTag other tag
git tag nameTag HEAD^

# Patchs
git diff > thediff.patch
git apply -v thediff.patch

# Git diff clean
 git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)' | sed -r "s/^([^-+ ]*)[-+ ]/\\1/"

# Logs and diff
git log --pretty="%h on %ad by %ae => %s" --date=short origin/master
git log --author=darvein@gmail.com --pretty=format:"%h%x09%an%x09%ad%x09%s"
git log --pretty=format:"%h%x09%an%x09%ad%x09%s" --author="Dennis Ruiz"
git-log --graph --online
git log --name-status
git log --name-only
git log --stat
git log <nombre_de_un_branch>..<otro_branch>
git show --pretty="format:" --name-only [aqui el id de un commit]
git log --online --decorate --graph

# Using git subtree
git remote add -f -t master --no-tags gitgit  [https://github.com/git/git.git](https://github.com/git/git.git) 
git subtree add --squash --prefix=third_party/git gitgit/master
git subtree pull --squash --prefix=third_party/git gitgit/master
git subtree push --squash --prefix=third_party/git gitgit/master

# Search a text in all the branches
git log -Stext_to_search --source --all
git config core.filemode false

# Remove a directoryfrom the whole repo
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch NOMBRE_DE_LA_CARPETA_O_ARCHIVO" HEAD
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune
git push -f origin master

Setting up a git repo

sudo adduser git
sudo passwd git

sudo mkdir /srv/git
sudo chown git:git -R /srv/git

su git
ssh-keygen -t rsa
touch ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys

cd /srv/git
mkdir properties
cd properties; git init --bare

Got a problem?

  • People were using git merge and rebase to get changes from the parent branch into their feature/hotfix branches. Somehow commits can be lost because of this.
git checkout my-broken-branch
git restore --source=origin/master --staged --worktree -- FileThatIdidntTouch.java DirectoryIDidntTouch .fileIdidntTouch
git add -A .
git commit -m "Sync with origin/master remote branch"; git push origin my-broken-branch
  • How to split up a repository?
 git filter-branch --prune-empty --subdirectory-filter here/this-directory-on-a-new-repo -- --all
  • Can’t push my commit. It was in github before but it somehow got removed/overwritten, the history is broken idk 😢
cp -rf $PWD ../copy-backup
diff -Naur . ../copy-backup > diff.patch
patch -p2 < diff.patch
git status # confirm changes and commit

Github cli

gh auth login
export GITHUB_TOKEN=ghp_b000000000h

# Clone all git repos
gh repo list gh-org-screening --limit 9999 --json sshUrl | jq '.[]|.sshUrl' | xargs -n1 git clone

# List pull requests
gh pr list --state closed --limit 45 --repo acmeorg-admarket/acmeorg