Practical Git - Philly.NET Code Camp

Preview:

Citation preview

Practical Gitat work and open source

Chris Gomez@SpaceShot

www.chrisgomez.com

Slide deck: http://bit.ly/phlcc16_git

Chris Gomez• Microsoft MVP in Visual Studio Tools and Technologies• Co-host of the Static Void Podcast www.staticvoidpodcast.com• Philly Game Works - www.phillygameworks.org - @phillygameworks

Git• Created by Linus Torvalds

https://www.youtube.com/watch?v=4XpnKHJAok8

Goals• Suitable for Open Source collaboration• No central server, lack of connectivity to contributors• Don’t want to have to know and trust all the contributors• Intended for Linus to have a “web of trust” in dealing with Linux

• Something that is not CVS or SVN• Intense dislike of CVS and SVN• Top complaint seems to be “intelligent merging”• Also complaint that merge pain often fell on a victim rather than perpetrator

It’s just a Directed Acyclic Graph!• A very complicated way of saying something very simple:

http://xkcd.com/1597/

Exploring the git filesystem• Content-Addressable filesystem• Objects are stored as blobs and identified by a hash of the content (plus a tiny

amount of header data)• Labels are placed somewhere else to link up our filenames

Git repositories

SpaceShot/SignalR-BoardGame(on GitHub)*

* This could also be Visual Studio Team Services, BitBucket, your company’s git server, or any git repo on another server you have access to.

Git clone

SpaceShot/SignalR-BoardGame(on GitHub)

C:\Source\SignalR-BoardGame(my computer)

Copy

Git clone

SpaceShot/SignalR-BoardGame

C:\Source\SignalR-BoardGame

Each is a fully independent repository

“Fork”

SpaceShot/SignalR-BoardGame

Copies in the cloud (or your server)

phlgameworks/SignalR-BoardGame

Each is a fully independent repository

“Fork”• Is Fork a Git concept?• GitHub / Bitbucket / Gitlab concept (and others)• Not in Visual Studio Team Services• Can be simulated with git commands, if necessary.

•Why fork?• Isolation of work• Freedom to experiment and commit• Not just with source control

Git remotes

SpaceShot/SignalR-BoardGame

C:\Source\SignalR-BoardGame

Lightweight link to source

feature

Remotes

git merge – putting two branches together

C1 C2

C3

C5C4

C6

C7

master

feature

Merge commit with two parents

master

git rebase (onto a branch) – when the world moved on…

C1 C2

C3

C5C4

C6

C7

master

feature

git rebase (onto a branch) – time travel your work

C1 C2 C3C5C4 C6C7

master

feature

git rebase interactive – Why?

C1 C2

C3 C5C4 C6 C7

master

feature

git rebase interactive – rewrite history

C1 C2

C3/C4 squashedC6 better commit

message C7

master

feature

C5 was dumped.Can rewrite commitsSquash commitsPick commits

Other commands• Remove commits: git reset --hard HEAD~X• Change last commit message: git commit --amend• Track a branch: git remote add --track <branch> <remote

nickname> <remote address>• Git branch from a commit: git checkout –b <newbranch>

<commit>• Git cherry pick: git cherry-pick <commit>

So advanced!• git filter-branch:

example:git filter-branch --tree-filter 'rm filename' HEAD

https://git-scm.com/docs/git-filter-branch

But how are you really going to use Git?• You are probably going to use… a central server!

• You might use GitHub, BitBucket, Visual Studio Team Services in the cloud (among others)• You might use TFS on premises, GitLab, GitHub Enterprise,

BitBucket Enterprise

Wait, doesn’t this just make it SVN, CVS, TFS, VSS all over again?!?!

To the Cloud!...

libgit2• A reimplementation of Git in C with many bindings:• C#, Python, Ruby, Java• “re-entrant linkable library with a solid API”

• This means it’s okay to use it in your application. It is respectful of system resources and tries to keep from bringing down your application

https://libgit2.github.com/

Some great resources

https://www.youtube.com/watch?v=SiokK8Q1wo0

https://www.youtube.com/watch?v=dBSHLb1B8sw

https://www.youtube.com/watch?v=duqBHik7nRo

Git Man Page Generator (Fun)• https://git-man-page-generator.lokaltog.net/

• Please note this is not real git documentation, but a joke about Git documentation.

Recommended