Git triks
| gitIn this article I list some of git comands that I use time to time, but not enought to put them in my .gitconfig.
Rename branch
To change the name locally go into the branch you want to rename, and rename it
git switch <branch_name>
git branch -m <new_branch_name>
Or you can do it without changing branch
git branch -m <old_name> <new_name>
To change the name remotely you have to delete the old name and push the new branch
git push origin --delete <old_name>
git push origin -u <new_name>
Selective adding changes to staging area
git add -p <filename>
Git will break down your file into what it thinks are sensible “hunks” (portions of the file). It will then prompt you with this question: Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Here is a description of each option:
- y stage this hunk for the next commit
- n do not stage this hunk for the next commit
- q quit; do not stage this hunk or any of the remaining hunks
- a stage this hunk and all later hunks in the file
- d do not stage this hunk or any of the later hunks in the file
- g select a hunk to go to
- / search for a hunk matching the given regex
- j leave this hunk undecided, see next undecided hunk
- J leave this hunk undecided, see next hunk
- k leave this hunk undecided, see previous undecided hunk
- K leave this hunk undecided, see previous hunk
- s split the current hunk into smaller hunks
- e manually edit the current hunk
- You can then edit the hunk manually by replacing +/- by #
- ? print hunk help
If the file is not in the repository yet, you can first do git add -N <filename>
. Afterwards you can go on with git add -p <filename>
.
You can use:
git reset -p
to unstage mistakenly added hunks
Stash single files
When you don’t want to stash all the edited files, but only a subset, you can use this command
git stash push <file1> <file2> .. <fileN>
To make the stash retrieval easier, add a message with -m <message>
Diff staged changes
git diff --staged
Remove files that have not been added to the staging area
git clean -df
Revert changes that have been pushed on remote
git diff master > branch.diff
git apply --reverse branch.diff
git rm branch.diff
Move last commit to another branch
git reset --mixed HEAD~1 # remove last commit and put your files outside the staging area
git stash
git switch <working_branch>
git stash apply
git commit
The use of stash make this method not prefered.
It might be a good chase to use cherry-pick
to the <working_branch> of the
wanted commit and then remove, undo, the commit to the unwanted branch.
Check if a folder changed
git diff --quiet HEAD <commit_to_compare> -- <dir_to_check> || echo changed
Note that git diff --quiet
will exit 1 when there are changes.
For example if you want to check if your current branch has canges in the directory
dir1
when compared to the previous commit:
git diff --quiet HEAD HEAD~1 -- dir1 || echo changed
You can do this even with the previous tag
git diff --quiet HEAD "$(git describe --tags --abbrev=0 HEAD)" -- dir1 || echo changed
I have used this command to help me automate my website release, How to deploy automatically a Hugo website.
Count commit messages that contains a string
git shortlog -sne --grep="a string" --grep="a second string"
To list only commits that contain all the strings given, all the --grep
flags, you must add --all-match
.
For example if you want to list all the commit messages that contains ‘WIP’ you have to write:
git shortlog -sne --grep="wip" --grep="WIP"