Git
Decentralized version control system.
Searching for when a given string was introduced
When you want to find out which commit first referenced a given string:
git log -S <string to search for> --source --all
See this stackoverflow answer.
Reverting commits without creating a new one
This is useful when you want to revert a set of commits, but also when you want to change them before committing again.
git revert -n <commit hashes to revert>
Deleting multiple local branches
git branch -d $BRANCH_NAME
will delete a local branch IFF it’s been merged with the upstream branch (or remote). If you pass in --force
, then it’ll delete it regardless. git branch -D $BRANCH_NAME
is a shorthand for git branch -d --force $BRANCH_NAME
.
git branch -D prefix*
doesn’t work (git won’t do the name completion for you). Instead, something like this will work:
git branch | grep "$PREFIX_STRING" | xargs git branch -D
Rebasing a branch onto another one.
Say you branch off my_work
from develop
. But you later find out you need to merge it into master
. How do you merge only the commits from my_work
into master
without including other commits from develop
?
As with most things in software, stackoverflow has the answer.
git checkout my_work
git rebase --onto master develop my_work
That is, you rebase onto the target branch, from the original branch point, with the branch you want to move.
Submodules
Submodule are a neat, basic way to manage dependencies.
Adding one is easy
git submodule add SUBMODULE_URL
When you’re not the one who added it, the command to pull down the submodules is less obvious.
git submodule update --init --recursive
Removing a submodule
Removing a submodule is less obvious, and, as of git 1.8.5, involves a 3-part process:
git submodule deinit -f -- $MODULE
rm -rf .git/modules/$MODULE
git rm -f $MODULE
Thanks to this stackoverflow answer
Generating and Applying Patches
Patch files are files (duh) describing changes between one version to another. They can be easily created by piping git diff $SOURCE_COMMIT $TARGET_COMMIT
to a file. Or, for changes from HEAD to whatever’s being worked on, a simple git diff
.
Once you have the patch, you can then apply it with git apply $PATH_TO_FILE
, so, for example:
git diff > change.patch
git co .
git apply change.patch
Which is a less elegant version of git stash
.
Stop tracking changes to a file
Use git rm --cached
on the file(s), and add them to the ignore patterns.
Last updated: 2021-11-15 20:11:54 -0800