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