Essential Git For Developers CORK ALT.NET DECEMBER 2013 What is Git? Distributed version control system Open source ,written in C Linus Torvalds 2005 to maintain the linux kernel Why Git? •Focuses on content not files •Opt in when it comes to commits •Open, not closed– open source model of working is baked into the software •Distributed - works almost entirely offline •It changes how you work – commit more often, making code reviews easier •Browsing history is lightening fast •Non-linear development Centralized vs. Distributed Centralised Distributed History only on the server Complete history of the repo locally Commit changes online only Nearly every operation is local (offline) you can commit locally & branch locally Down tools if server is down No hassle if server is down, redundant by default Branching is difficult Branching is really easy & lightweight Branching is no longer a dirty word Everyone commits to main repo ,typically you check More flexible workflows, you commit changes more in when your work is complete regularly Demo – create a repo and add some files Commands • $git init • $git add <fileName> • $git commit –m <commit message> • $git status • $git log • $git command --help Staging Working Directory git add Staging Area git commit Repository File Status stackoverflow.com/questions/15653066/how-to-track-but-not-stage-and-how-to-unstage-but-not-untrack Git stores snapshots, not differences git-scm.com/book/en/Getting-Started-Git-Basics Demo – working with remotes Commands • $git remote add <name> <url> • $git push <remote name> <local branch name> • $git clone <path to repo> Git on the Server Protocols –SSH , HTTP ◦ HTTP - slower but allows anonymous access to the files ◦ SSH - faster but everyone needs a unique SSH key Hosting Options ◦ Self Hosted (GitLab CE) ◦ GitHub, BitBucket & many more … Demo – web hook integration $git pull command $git fetch + $git merge = $git pull .gitignore file Tells git to ignore specific files / folders https://github.com/github/gitignore/blob/master/VisualStudio.gitignore Branching • Think of a branch as simply a movable pointer to one of the commits in your repository • $git branch < new branchname > • $git checkout <branchname> • $git merge <branchname> Fast forward merge Before merging After merge 3 way merge Before merging After merge Demo – branching and merging Git-Flow •Vincent Driessen's branching model •Defines a branching model designed around the project release, suitable for managing larger projects / large teams TIME Rebasing “Take my commits and replay them after the HEAD of another branch.” • take all the changes that were committed on one branch and replay them on another one. • Moves a branch to a new base commit • Completely rewrites history! • Don’t do this on a shared branch MERGE RESULT REBASE RESULT Forking & Pull Requests Demo – exploring the repo history Debugging git blame $git blame [-L ine1,line2]] <file> • Lets you see when each line of a method was edited and by whom Debugging git bisect $ git bisect start $ git bisect bad HEAD $ git bisect good 1b6d Cherry Picking If you want to get one single commit out of a branch $git cherry-pick <sha-1_commit> Git on Windows GUI Clients Shells SourceTree (free) Bash GitHub for Windows Posh-git Git GUI for Windows Powershell TortoiseGit Cmd Advice for getting started •Learning curve •Start with the command line, not the GUI • Agree a good branch strategy with your team up front • (Almost) every should be short lived, and kept up to date with master •Commit often, perfect later & user meaningful commit messages Thanks for listening! twitter : @AIDANJCASEY