Terminology
Fork - a clone of a repository hosted on a Git server. We use the GitHub server. You only need to fork a repo once in your GitHub account.
Origin - an alias for your fork on GitHub
Upstream - an alias you create for the source of your fork (the original Microsoft repository)
Clone - a copy of a repository on your local machine. This should be a copy of your Fork. You only need to clone your fork once per PC you use it on.
Branch (Working Branch) - a logical workspace for changing content within your local clone
Working directory - a physical workspace on disk containing your content files and folders
Pull - the operation to update your local repository with latest version from a remote repository (fetch & merge). In our case, the remote repository will always be the upstream repository.
Push - the operation to write the changes you made back into a remote repository. In our case, the remote repository will always be the origin repository (your fork).
Fetch - gets the latest version of the files and changes that you don’t have locally
Merge - merges the current changes into your local repository
Index - Git metadata used to track files and the git objects that represent the changes. The Add command adds files to the index so that changes can be tracked.
Object store - Git metadata containing the four git objects (blob, tree, commit, and tag)
GitHub hierarchy
- Organization/Account (examples: Azure, Microsoft, MicrosoftDocs, PowerShell, sdwheeler)
- Repository (example: PowerShell-Docs, SystemCenterDocs-pr, )
- Branch (example: main)
- Fork - a clone of a repository in your GitHub account
- Branch (example: main)
- Branch (example: workingbranch)
- Repository (example: PowerShell-Docs, SystemCenterDocs-pr, )
Forks and why you need one
- A Fork is a clone of a repository hosted on GitHub in your personal account.
- Your fork is also, yet another backup of the main repository. This is a key feature of a distributed version control system.
- If your local disk crashed causing you to lose your local repo, you can always clone your fork to another computer and work from there.
- You don’t have rights to write (push) to the official repository. You must send a Pull Request.
Then the admins of the official repository will fetch the branch from your fork and merge it into
the
main
branch of the official repository. This protects the official repository as the source of truth for all content. - You aren’t running a git service. GitHub can’t pull from the clone on your local machine. You must push your changed into your remote fork on GitHub.
Branches and why you need them
Git stores data as a collection of snapshots that contain the changes you made. A Branch is a named label for that snapshot collection.
- When you commit your changes, Git stores a commit object that contains a pointer to the snapshot of the staged content, the author, and the description of the commit.
- Creating a new branch gives you a new working context within Git to make your changes without
affecting the
main
branch. - Later, your working branch can be merged back into
main
, deleted, or kept indefinitely as a separate release path.
A branch is NOT a folder on your local file system.
- When you check out a branch, Git changes the files in the file system to match the versions in that branch’s snapshot.
- Git allows you to switch branches, safely, without losing any of the work you had done.
- If you switch branches, the current state of the branch is stashed in the Git object store and the files on disk are changed to match the state of the new branch you switched to. As a result, if you check out different branches, you can literally watch the file system change as Git changes it to match the state of the branch.
What’s a tracking branch?
The
main
branch is created as a tracking branch fororigin/main
when you clone a repo.You can create a tracking branch using the following command:
git checkout -b <branch> -t <remotename/branch>
When you have a tracking branch set up, git pull will look up what server and branch your current branch is tracking, fetch from that server and then try to merge that into your local branch.
Git Object Model
A git repository is defined by the data stored in the hidden .git
folder on the local file system
in the root folder of the repository. Git tracks the state of the repository in a database called
index
and collection of files and folders known as the git object store.