Git triks

| git

In 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:

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

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"