Git is a persistent map, the keys are SHA1s and the values are pieces of content
To view blobs use git cat-file -p KEY
A blob is a piece of content stored in git in a compressed format, it has a SHA1 key, it stores them in the objects directory Commits are files of text stored compressed in the objects directory (similar to blob) with a SHA1 key. It contains a tree, a parent, an author, a committer and a message A tree is a root, it points to blobs and other trees Tags are labels pointing at an object
When a new commit is created, previous blobs and trees are reused if their content hasn't changed
Master key is stored at .git/refs/heads/master
HEAD file points to the current branch
Checkout moves HEAD to point at a different branch and updates the working area
Merge creates a new commit that has a tree that points at both the current branch and the one we're merging in
Rebasing makes a branch the parent of another branch so they share the same log, it is an alternative to a merge
Rebasing creates a nice neat log, vs the messy log you get using merging. Can create unwanted side effects
A remote is a clone of the current repo
Origin is the default remote
A fork is a clone of a GitHub repo that is also stored in the cloud. We can then clone that to our local machine
An upstream is a connection to the original forked repo so we can pull any changes to that into the local copy of the code
A pull request is a message to the owner of the original repo, asking them to pull your changes from the forked repo
Three areas: Working area Index Repository
For each command think about- "How does this command move information across the four areas?" "How does this command change the repository?"
In the clean status the working area and the repository are aligned
The index is a launchpad or staging area, it's a binary file within the .git folder
Alternatively the index can be thought of as containing everything in the repository
HEAD points to the current working branch
Commands: git status | gives you the current status of the project, shows modified files in working area
git diff | compares the working are with the Index
git diff --cached | compares the Index with the Repository
git diff mybranch master | compare two branches
git add filename.txt | Moves changes from Working Area to Index, "git status" will now show the file as modified and staged
git add. | Add files in a local directory or below
git add --all | Add everything
git commit -m "My comment" | Moves modified files from Index to the Repository
git checkout mybranch | Move HEAD to point at mybranch, copy files from that branch to Working Area and Index
git checkout { CommitID } | Checkout a commit
git branch | show the branches
git branch mybranch | Create new branch
git branch --all | Also show remote branches
git rm --cached filename.txt | Remove file from Index but keep in working area (Unstaged the file)
git rm --force filename.txt | Remove file Working area and Index
git mv | rename file in the working area and in the index
git init | create a new repo
git log | Look at comments
git tag -a mytag | Create a tag
git cat-file -p KEY | View compressed data
git show | show changes for a commit
git merge mybranch | merge the current branch with the branch passed in
git rebase mybranch | rebase the branch passed in
git clone | create a clone of a repo on the current machine
git push git push origin master | add objects from master to the origin remote repo
git fetch | get latest changes from origin so they can be merged
git pull | fetch and merge in changes from origin
git reset moves the head to point somewhere else and copies files over the Index and optionally the working area git reset { CommitID } --hard | Move head to commit ID passed in and copies files to Index and Working area git reset HEAD | Move current head to Index only, this uses mixed mode git reset --hard HEAD | Copy current head to Index and Working area git reset HEAD file.txt | Reset a particular file To reset a specific file in the work area as well as index then use git checkout HEAD file.txt
git stash --include-untracked | Move files to the stash area
git stash list | See files in the stash
git stash apply | move latest stash item back into the working area
To Rename a file: Use mv command to rename in working area Use add to move renamed file to Index Use add on original filename to remove original file from index, file will be renamed on index Use commit to add to Repository