Not so much a blog post as a notebook for useful git commands…
Export changes from a range of revisions
git archive --output=../my_archive.tar HEAD $(git diff-tree -r --no-commit-id --name-only --diff-filter=ACRMT revision_id_1..revision_id_2)
Keep your fork in sync with the main repo
Alias for deleting all branches whose commits have already been merged into the develop branch
# if the main branch is develop:
alias gitpruned='git fetch;git checkout develop;git pull upstream develop; git branch --merged develop | grep -v "\* develop" | xargs -n 1 git branch -d'
# if the main branch is master:
alias gitprunem='git fetch;git checkout master;git pull upstream master;git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d'
From a StackOverflow answer Need to be careful with this if you have a local checkout of master or release branches, and merges from them. git-fresh is similar, but more useful
Split a repo
git filter-branch --subdirectory-filter DIRECTORY_YOU_WANT_TO_KEEP/ -- master
From the Atlassian blog
Maintain mirrors of a remote
For example, this is useful if you are managing a module on drupal.org, but maintaining the code using GitHub pull requests. If you do this, make sure that you have the email address used on GitHub added as a secondary email address on drupal.org, and vice versa. It’s also a good idea to follow Drupal’s commit message standards
git clone -o github [email protected]:Capgemini/spalp.git
cd spalp
git remote add drupal [email protected]:project/spalp.git
# usually not necessary
git pull --rebase github 8.x-1.x
Get a file from another branch
git checkout otherbranch -- filename.ext
Compare commits between branches
git log --oneline master..otherbranch
List all remote branches and their latest commit date
git branch -r | grep -v '\->' | tr -d ' ' | tr "\n" "\0" | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "{}" "`git log {} -n 1 --format=%cr`"'