[2019-09-12 Thu 13:04]
This was originally posted as a twitter thread.
NOTE: if you are looking for a very basic intro to git, I recommend reading this guide by Atlassian first.
Do you use git but still don’t really understand it?
Here’s a git crash course to fix that.
- Git gives you a FULLY FEATURED repository on your local computer.
- This is different than other version control systems
- Once you embrace that, you can start demystifying some of the git ‘magic’
- Think of files (and changes) as being in 5 different places, or “states”:
- Working directory
- Staging (Index)
- Commit tree (local repo or
HEAD
) - Stash
- Remote repo (github, Bitbucket, gitlab, etc)
- Think of moving files (or changes) between those places:
git add
working dir => staginggit commit
staging> =HEAD
git push
HEAD
=> remote repogit stash
working dir <=> stashgit reset
andgit checkout
to pull from upstream
- Why have a dedicated staging area?
So that you can choose and review which files and changes to commit before committing.
git status
andgit log
git status
shows changes in both your working directory and staging, but
think of them as separate things.
git log
shows the history of commits your local repository.
- Learn to love
git log
.It’s a snapshot of repo state: shows past commits as well as local
HEAD
, local branch, remoteHEAD
and remote branch.git log --oneline
is compact way to view commit history. - A branch is a reference to the tip of a line of commits.
- It automatically updates when new commits are added to that line
- Making a new branch will diverge the tree at that point
- A merge takes two branches and makes a new commit which combines them.
If there are conflicts, you have to manually resolve them (no shortcuts!)
git rebase
lets you rewrite commit history.- Applies your current commits directly to branch
HEAD
- Can squash all your commits into one to clean up history
- Don’t do this to public (remote) commits!
- Applies your current commits directly to branch
- Merge vs. Rebase
- Some people say you should only ever merge to keep your entire history
- Some people say you should always rebase before merging into
master
to keep a clean history tree - I say: do whatever works for you and your team.
HEAD
HEAD
can point to a branch or a specific commit- If it points to an old commit, that’s called a “detached
HEAD
” - Editing in a detached
HEAD
state is dangerous (can lose work or cause problems combining work)
- Care about types.
- Many git commands can operate on either: individual files, commits, or branches
- This can cause a lot of confusion - so make sure you know what type of object you’re operating on
- Undo in Git
There are many ways to undo unwanted actions in git.
Here are the most common:
- unstage a file:
git reset [file]
- change last local commit:
git commit --amend
- undo local commit:
git reset [commit BEFORE the one to undo]
- undo remote commit:
git revert [commit to undo]
- unstage a file:
- Author & Attribution
Twitter: @chrisachard
Or you can join the newsletter: https://chrisachard.com/newsletter
Thanks for reading!