Cheat Sheet on Git

Add a remote

git remote add <remote_name> <url_repo.git>

Example:

git remote add upstream_dmlc https://github.com/dmlc/xgboost.git

Add a submodule

git submodule add -b <branch> https://<repo>.git <local path>

Example:

git submodule add -b branchpy https://github.com/sdpython/machinelearning.git cscode/machinelearning

Checkout a specific file from a remote

git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...

Example:

git checkout origin/main -- include/xgboost/predictor.h

Create a new local branch

git checkout -b <new_branch>

Example:

git checkout -b modif

Create a new remote branch

git push -u <remote> <new_branch>

Example:

git push -u upstream modif

Push modification to remote repository

git push

Example:

git push

Remove a submodule

git rm <localpath>

The corresponding folder in .git/modules/<localpath> must be removed too.

Example:

git rm cscode/machinelearning -f

Reset a branch

Reset to local branch

git reset --hard <branch>

Reset to a remote branch

git reset --hard <remote>/<branch>

Example:

git reset --hard upstream/master

Reset a submodule

git submodule foreach git reset --hard

The option --recursive does it for submodules included in submodules. Another to do it is to remove the submodule folder and to type git reset --hard which removes every modification made since the last pull.

Update a branch

git pull <remote> <branch>

Example:

git pull origin master

You can also rebase the repository:

git fetch <remote>
git rebase <remote>/<banch>

Example:

git fetch upstream
git rebase upstream/master

Update a submodule

git submodule update --remote --merge

Example:

git submodule update --remote --merge

Update a submodule to the remote branch

git submodule update --init

Example:

git submodule update --init

Option --recursive can be added to fetch submodules inside submodules.

Fix submodules

git submodule sync

Example:

git submodule sync

Move multiple files

Assuming the reposity has no ongoing modification You can move files and then type right away:

git add -A

Rebase a branch to upsteam branch

This instruction retains some part of the logs.

git pull --rebase upstream main
git push --force origin

As it may seem that github renamed the default branch from master to main (see Renaming the default branch from master).

Rebase a branch to upsteam branch and erase history

git rebase upstream/main
git push -f origin main

If there are some commit of your own, they will be moved to the top of history. The following command deletes the last commit in the history.

git reset --hard HEAD~1

The remote repository needs to be updated.

Clone a part of a repository, not all

The following instructions clone some folder from the specific tagged version.

# Create a local repository and declare a remote repository
git init
git remote add -f origin https://github.com/sdpython/onnx-extended.git
git config core.sparsecheckout true

# paths to clone
echo _unittests/ >> .git/info/sparse-checkout
echo _doc/examples/ >> .git/info/sparse-checkout
echo pyproject.toml >> .git/info/sparse-checkout
echo requirements-dev.txt >> .git/info/sparse-checkout

# The branch it is cominf from
git pull origin main

# Stores the version in environment variable VERSION
VERSION=$(python -c "import onnx_extended;print(onnx_extended.__version__)")

# checks out the tag into a new branch.
git checkout tags/${VERSION} -b thistag