diff --git a/doc/clang-format.md b/doc/clang-format.md
new file mode 100644
index 0000000000000000000000000000000000000000..fa751b303dcbf14ecc3152a905e557c57d626002
--- /dev/null
+++ b/doc/clang-format.md
@@ -0,0 +1,66 @@
+We use [clang-format](https://clang.llvm.org/docs/ClangFormat.html) to format our code.
+
+# Integration into editors
+
+Integration into various editors (`vim`, `emacs`, `VSCode`, `CLion`) is on the
+[clang-format project page](https://clang.llvm.org/docs/ClangFormat.html).
+
+There is also an [eclipse plugin](https://github.com/wangzw/CppStyle).
+
+# Integration into git
+
+## Short version
+
+See below for a more detailed explanation. In short: Add this to `~/.gitconfig`:
+```
+[clangFormat]
+	binary = clang-format-12
+	style = file
+```
+Now stage files for reformatting, then run `git clang-format`. It will reformat
+only the code that is staged, and you can view reformatted code with `git
+diff`. To add modified lines to your commit, stage them as well, then commit.
+
+There is also a pre-commit hook that you can install.  To install it, copy it
+`pre-commit-clang` to `.git/hooks/pre-commit`, and make it executable.
+
+## Long version
+
+In order to integrate `clang-format` into `git`, follow these steps:
+
+1) Copy `pre-commit-clang` to `.git/hooks/pre-commit` and make it executable.
+
+2) Install clang-format-12 (needs at least Ubuntu 20, remove anything else)
+   ```bash
+   $ sudo apt-get remove clang-format*
+   $ sudo apt-get install clang-format-12
+   ```
+
+3) Configure `git` (set correct executable, set mode, provide more convenient alias)
+   ```bash
+   $ git config --global clangFormat.binary clang-format-12
+   $ git config --global clangFormat.style file
+   $ git config --global alias.clang-format clang-format-12
+   ```
+
+When this is done, you are set up. How to use:
+
+4) When committing new code, add the code to commit into the staging (`git add
+   -p` or `git add <file>`) _and stash the rest_ (e.g., `git stash -p`, this is
+   quite important or reformatting might not work properly, or you don't know
+   what has been reformatted)
+
+5) Run git clang-format. The staged code will be reformatted. After this, you
+   still have your changes in the staging area, and the formatted code appears
+   as additional modification. Thus, your changes can be seen with
+   ```bash
+   $ git diff --staged
+   ```
+   while the modifications of clang-format with
+   ```bash
+   $ git diff
+   ```
+   So now, you can add all or parts of reformatted code to the staging area
+
+6) Commit. It won't work if code is not properly formatted due to the
+   pre-commit hook. Force committing with `git commit --no-verify`