Version control
Version control (also known as revision control, source control, or source code management) is a class of systems responsible for managing changes to computer programs, documents, large web sites, or other collections of information.
The concept of backing up your “data” iteratively, so you can roll-back to specific versions as needed is very old. At the most basic level, version control could be achieved by making a “.zip” file backup of your data every day.
Applications
- https://darcs.net
- https://fossil-scm.org
- https://git-scm.com
- https://mercurial-scm.org
- https://pijul.org
- https://radicle.xyz
Git
Git is by far the most popular version control app today. It’s not the only one.
Also, Git != Github. Git is the application. Github.com is a website that hosts code and allows developers to work together on code (and it happens to use Git). Github is NOT the only website that hosts Git code.
- https://about.gitlab.com/images/press/git-cheat-sheet.pdf
- https://atlassian.com/git/tutorials/atlassian-git-cheatsheet
- https://cheatsheet.wtf/git
- https://education.github.com/git-cheat-sheet-education.pdf
- https://github.com/git-tips/tips
- https://github.com/k88hudson/git-flight-rules
- https://git-tower.com/learn/cheat-sheets/git
- https://ohshitgit.com
Snippets that I keep forgetting how to do:
## To clone a massive repo:
git clone --no-tags --depth 1 <repoURI>
git fetch --unshallow
## Alternativ, just one folder/ file:
git clone --filter=tree:0 --depth 1 repoURI repoDIR
cd repoDIR
git sparse-checkout set --no-cone someFOLDER
git checkout
To convert a repo to shallow:
https://stackoverflow.com/questions/4698759/converting-git-repository-to-shallow
git pull --depth 1
git gc --prune=all
## Convert a repo to shallow since a specific date:
git pull --shallow-since=YYYY-mm-dd
git gc --prune=all
## To cancel a git merge:
git reset --merge && git merge --abort
## To reset a file to be identical to the master branch:
git checkout master -- some/path/file
## To view one commit, details + file names, no patch:
git show deadbeef… -format=fuller -name-only
## To view the diffs/changes of only 1 file:
git log -p some/path/file
## To filter changes of one file with pickaxe:
git log -S'Foo' --since=2020.1.1 --until=2024.1.1 -- some/path/file
## To filter changes of one file with -G search:
git log -G'Foo' --name-status -- some/folder/
## To change the author of ALL commits:
git filter-branch -f --env-filter "
GITAUTHORNAME='New name'
GITAUTHOREMAIL='new@email'
GITCOMMITTERNAME='New name'
GITCOMMITTEREMAIL='new@email'
" HEAD
To remove files from a commit:
https://stackoverflow.com/a/15321456/498361
> git reset --soft HEAD^
> git reset HEAD path/to/unwantedfile
> git commit …
## To undo a local commit (not pushed):
> git reset --soft HEAD~
## Undo a commit local & remote:
> git reset --hard HEAD~
To remove a commit:
https://itechcode.com/2020/09/22/how-to-remove-a-commit-in-git
git reset HEAD~1
git rebase --interactive origin somebranch
How to restore a deleted tag:
https://baptiste-wicht.com/posts/2011/06/git-tip-restore-a-deleted-tag.html
git fsck --unreachable | grep tag
git show ID
git update-ref refs/tags/TAGNAME ID
Cleaning up Git history:
https://blog.sulami.xyz/posts/cleaning-up-git-history
Conditional Git config:
https://utf9k.net/blog/conditional-gitconfig
Setup different authors per repo, setup multiple authors per commit:
https://advancedweb.hu/3-ways-to-set-up-author-information-in-git
Forking and maintaining a fork:
https://docs.github.com/en/get-started/quickstart/fork-a-repo
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork
## Hard reset, completely replace fork master with upstream master
git fetch upstream
git reset --hard upstream/master