===== GIT =====
==== Overview ====
=== What is it? ===
* Distributed VCS
* Manages workflows of over [[https://www.linuxfoundation.org/wp-content/uploads/2020/08/2020_kernel_history_report_082620v2.pdf|10 commits per hour]]
* Works best with textual content or source code
* Ability to create/edit locally with tools you know
* Self contained history and configuration in ''%%.git%%'' folder
* Only up-/download need network
==== How does it work? ====
* Similar to ''%%diff%%'' and ''%%patch%%'' utilities
* Stores history in a compressed hash-based store
* Current checkout is the regular directory structure
* Saves meta information with every commit for traceability
===== GIT Commands =====
==== Get a repository ====
=== Create a new one ===
cd
git init
ls -alh
=== Clone an existing one ===
git clone https://github.com//
cd
ls -alh
==== Check the state it’s in ====
git status
git diff
git diff --cached
git log
Note: this may use the pager (''%%less%%''/''%%more%%'')
==== Get changes from others ====
Get changes from a specific remote, optionally integrating them into the current branch
git fetch
git pull
You can always fetch the changes but pulling requires the local and remote branches to be somewhat aligned.
* Pulling should be a ''%%fast-forward%%'' operation.
* The current branch is a direct ancestor of the remote branch.
* Ensures that pushing to the remote won’t introduce unrelated changes.
==== Push changes ====
git push
^Github/Gitlab ^Regular Git ^
|Changes are pushed to your account |changes are pushed to a throw-away branch|
|Merged by using a PR/MR on the website|Merged manually if no conflicts arise |
|Inspection by collaborators during MR |No inspection until deployed |
> Do **NOT** push directly to ''%%master%%''!
==== Mistakes and Corrections ====
From safe to loosing all local changes since last commit:
git stash
git reset
git reset --hard
git checkout && git checkout -B
**Read the [[git-scm.com|manual]] before loosing more of your changes than you wanted to reset!**
===== Workflow =====
==== Workflow 1 ====
Highly dependent on project/organization! But:
* use branches, don’t work directly on ''%%master%%''
* try to work on one topic at a time
* switch between branches when working on different parts of the project
* create ''%%merge request%%''s for every branch, that’s done or ready for review
* write consice ''%%commit message%%''s
==== Workflow 2 ====
Combined like this is a good way to start working:
* Start by syncing the progress of upstream
git checkout master
git pull origin
git checkout -b addGitTalk
* Work on your changes to the project
* Add new code followed by
git diff
git status
git add [PATH]
git diff --cached
* Repeat the two previous step or publish
git commit
git push