Since it is quite pain to search and copy-paste commands from Google / Duck all the time I’ll write some useful commands down in here.

This post will be updated from time to time, so everything is in one place


Change remote URL

Good when remote has moved, renamed or just want to replace https with ssh

To see current remote URL:


git remote set-url REMOTE_NAME REMOTE_PATH


git remote set-url origin

Change (current) branch base branch


Good in cases where you created new branch based on wrong branch.

For example wanted to create new branch based on master but accidentally made it based on demo and ended up with history like this:

(commit 1) -> master
                \__ (commit 2) -> demo
                                   \__ (commit 3) -> new_branch

But that’s the history you are after:

(commit 1) -> master
                |__ (commit 2) -> (commit 3) -> demo
                \__ (commit 4) -> (commit 5) -> new_branch

Use rebase –onto for that


git rebase --onto newBase oldBase feature/branch

Usage for current example:

git rebase --onto master demo new_branch

Basically, you take all the commits from after demo up to new_branch, and rebase them onto the master commit.

Reset only file permission changes


Good to revert all file permission changes that have been accidentally done.

Most common use case is when sharing codebase between Windows and Linux. After editing files on Windows file permissions tend to be changed in Linux

Only works from project root

Git keeps track of file permission and exposes permission changes when creating patches using git diff -p.

So all we need is:

  1. Create a reverse patch
  2. Include only the permission changes
  3. Apply the patch to our working copy

As a one-liner:

git diff -p -R --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

You can also add it as an alias to your git config…

git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

…and you can invoke it via:

git permission-reset

Note, if your shell is bash, make sure to use ' instead of " quotes around the !git, otherwise it gets substituted with the last git command you ran.

Git make local branch exactly same as remote


Good to clean up some mess that you have accidentally caused on your local branch

I most cases first command is enough

First, reset to the previously fetched HEAD of the corresponding upstream branch:

git reset --hard @{u}

The advantage of specifying @{u} or its verbose form @{upstream} is that the name of the remote repo and branch don’t have to be explicitly specified.

Next, as needed, remove untracked files, optionally also with -x:

git clean -df

Finally, as needed, get the latest changes:

git pull

All in one in single line

git reset --hard @{u} && git clean -df && git pull

Git change author history

Cant remember source

Good in cases, when you accidentally set up wrong email / name in Git config, do some commits with wrong data and then want to fix it.

Note! You have to force push after running it. git push -f may result broken history and loss of code, so be careful

git filter-branch --env-filter '
NEW_NAME="New Name Value"

' --tag-name-filter cat -- --branches --tags


Run executable files directly from node_modules

It is always better to have dependencies as dev dependencies than install them globally.

There are two ways to execute project dependencies like Mocha, Nyc, ESLint etc.

Let’s use nyc + mocha test running for example

In package.json script it would be like this:

  "scripts": {
    "test": "nyc mocha ./test.js"

First option - use full paths:

./node_modules/.bin/nyc ./node_modules/.bin/mocha ./test.js

Second option - use npx

npx nyc mocha ./test.js


Tunnel port from remote to local

Good way to get port from remote server to local. Especially handy when accessing databases on remote that are limited to be accessed from localhost only



Getting MySQL port 3306 from remote to local:

ssh -L 3306:localhost:3306

Getting RethinkDB management UI from remote server port 8080 to local port 8085 with ssh alias

ssh -L 8085:localhost:8080 rethinkdb_server

Copy key to remote (ssh-copy-id)

It’s safer and more convenient to use ssh key to log into server compared to password


ssh-copy-id USER@SERVER

To copy default ~/.ssh/ to remote server:


To copy some other keyfile to remote server:

ssh-copy-id -i ~/.ssh/