GIT - Ins/outs/etc
What is git?
- Distributed source control
- A "clone" is a full copy of the remote repository
- Branches and tags are lightweight
0
Advanced issue found▲
What is git?
Assumptions...
0
Advanced issue found▲
- You have a git client installed
- You know how to add files to the git index
- You know how to commit
0
Advanced issue found▲
The GIT model vs centralized source control
GIT/Hg
SVN/TFS/CVS
(distributed)
(centralized)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
Source control server-side
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
Local working copies are complete repositories
Tom
Dick
Harry
Local working copies are one or more complete branches
Tom
Dick
Harry
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7034207/PinClipart.com_tree-branch-clip-art_264.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7034207/PinClipart.com_tree-branch-clip-art_264.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7034207/PinClipart.com_tree-branch-clip-art_264.png)
Visual overview (clone)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
"Remote" is a remote version of the repository, eg. hosted on gitlab.gs.mil
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
Full local working copy
> git clone git@gitlab.gs.mil:GPM/dissemination/fgdrt.git
Syncing changes from remote
- Sitution: A newer version of the "develop" branch has been pushed to the remote
- Objective: I want to integrate these changes into an existing local story branch, story branch is named "iss53" and push to a branch on the remote
*Upon regular merge, branch differences are added
as a single merge commit into the destination branch. Rebase
is a cleaner, but more complex, alternative to work in a team environment.
~/myproject [develop] > git pull # does an automatic merge into local develop from remote
~/myproject [develop] > git checkout iss53
~/myproject [iss53] > git merge develop # local gpm-123 branch now has new code from develop
~/myproject [iss53] > git push -u origin iss53 # pushed to remote origin, ready for merge request
Visual overview (merge)
![](https://git-scm.com/book/en/v2/images/basic-merging-2.png)
![](https://git-scm.com/book/en/v2/images/basic-branching-6.png)
Before
After merge
~/myproject [master] > git merge iss53
Forks
- Nothing too special, just another remote of a repository with a common commit ancestor
- Still need to manage merges between remotes
- Traditionally referred to as "upstream" for the parent repository and "origin" for the fork
- Forks can be managed through UI of git hosting (eg. gitlab/github), but can also be managed independently (eg. a fork can live across different git providers!)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
Upstream
"Origin" or our "fork"
![](https://s3.amazonaws.com/media-p.slid.es/uploads/117442/images/7033524/icons8-repository-96.png)
Local
*Typical flow
![](https://media3.giphy.com/media/103R2H9RN2QZgc/giphy.gif)
Example: "forking" the nestjs-template
- Assumes you have already forked the repository (either manually or through gitlab.gs.mil's UI) and have cloned your fork locally as the "origin" remote
- Objective: Your local repository will have an upstream pointed at the original nestjs-template repository and an origin pointed at your fork. Additionally, we will sync the master branch between the upstream and your fork.
~/myproject [master] > git remote add upstream git@gitlab.gs.mil:GPM/templates/nestjs-template.git
~/myproject [master] > git fetch --all # This + last command is all we need to add the upstream reference and pull branch refs
#------------ SYNC UPSTREAM "MASTER" BRANCH TO YOUR FORK'S "MASTER" BRANCH ------------
~/myproject [master] > git checkout -b umaster -t upstream/master # checkout a local umaster branch, tracking to upstream/master, yes this step can be replaced by direct merge into origin/master if you're looking to do that
~/myproject [umaster] > git checkout master
~/myproject [master] > git merge umaster # "master" branch in fork now in sync
Example
Creating and syncing a fork across two disparate git providers
Upstream => https://github.com/meilinger/example-repo
- Along the way, we'll create and push a new branch
- Also, we'll cover some additional cli git commands
Resources/Exercises
Cheatsheets
GIT: Intro
By Joe Meilinger
GIT: Intro
- 223