Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git and Github: Working effectively on a team

Jeff Carouth
March 15, 2014
580

Git and Github: Working effectively on a team

Git is great. Project hosting on Github is even better. But how does git fit into your team workflow? In this talk we will cover how to effectively use git as your source control management system from an individual developer's perspective and then from a team perspective. You will learn how to efficiently use git during feature implementation and experimentation including stashing, committing, rebasing, and code sharing techniques; how you can leverage Github to spur conversations about code and implementation; and a workflow incorporating code review using Github's pull requests. - See more at: http://midwestphp.org/sessions/#sthash.9ur0tXHt.dpuf

Jeff Carouth

March 15, 2014
Tweet

Transcript

  1. repository A set of commit objects stored next to the

    project files in a .git subdirectory.
  2. Remote A copy of a repository stored in a separate

    location. Typically this will be on the Internet or over the network somewhere.
  3. merge The act of bringing commit objects from one branch

    to another. This can be local or remote.
  4. pull request Proposed changes to a repository submitted by a

    user and either accepted or rejected by a project member.
  5. git push Publish a set of commit objects to the

    remote. If you want to be explicit you can specify the remote and branch to which you wish to push.
  6. git fetch Download commit objects from a remote into the

    local repository. This does not apply any changes to your workspace.
  7. git fetch git fetch! git fetch origin master! git fetch

    <remote> <branch>! git fetch <group>
  8. git merge Apply a set of change objects to your

    workspace. This can reference a local branch or a remote branch.
  9. git pull Incorporate changes from a remote repository and branch

    into the workspace. This operation is effectively a git fetch followed by a git merge.
  10. git rebase Apply changes to the current branch on top

    of the specified branch’s history.
  11. ! git log --graph --pretty=oneline --abbrev-commit! * 9f65212 Fix typos!

    * ec08733 Expand idea of foo with speakers! * 991241d Update foo! * 0c9a579 Add Foo documentation! * 9a42a76 Combine sentences into paragraph! * 63d250a Add more detail to the README! * a14a778 Update summary to be more descriptive! * 0722e78 Initial commit
  12. pick 0c9a579 Add Foo documentation! pick 991241d Update foo! pick

    ec08733 Expand idea of foo with speakers! pick 9f65212 Fix typos! ! # Rebase 9a42a76..9f65212 onto 9a42a76! #! # Commands:! # p, pick = use commit! # r, reword = use commit, but edit the commit message! # e, edit = use commit, but stop for amending! # s, squash = use commit, but meld into previous commit! # f, fixup = like "squash", but discard this commit's log message! # x, exec = run command (the rest of the line) using shell! #! # These lines can be re-ordered; they are executed from top to bottom.! #! # If you remove a line here THAT COMMIT WILL BE LOST.! #! # However, if you remove everything, the rebase will be aborted.! #! # Note that empty commits are commented out
  13. pick 0c9a579 Add Foo documentation! fixup 991241d Update foo! pick

    ec08733 Expand idea of foo with speakers! fixup 9f65212 Fix typos! ! # Rebase 9a42a76..9f65212 onto 9a42a76! #! # Commands:! # p, pick = use commit! # r, reword = use commit, but edit the commit message! # e, edit = use commit, but stop for amending! # s, squash = use commit, but meld into previous commit! # f, fixup = like "squash", but discard this commit's log message! # x, exec = run command (the rest of the line) using shell! #! # These lines can be re-ordered; they are executed from top to bottom.! #! # If you remove a line here THAT COMMIT WILL BE LOST.! #! # However, if you remove everything, the rebase will be aborted.! #! # Note that empty commits are commented out
  14. ! git rebase --interactive HEAD~4! [detached HEAD 9c02248] Add Foo

    documentation! 1 file changed, 3 insertions(+)! create mode 100644 foo.md! [detached HEAD 47613fd] Expand idea of foo with speakers! 1 file changed, 1 insertion(+), 1 deletion(-)! Successfully rebased and updated refs/heads/master.
  15. ! git log --graph --pretty=oneline --abbrev-commit! * 47613fd Expand idea

    of foo with speakers! * 9c02248 Add Foo documentation! * 9a42a76 Combine sentences into paragraph! * 63d250a Add more detail to the README! * a14a778 Update summary to be more descriptive! * 0722e78 Initial commit
  16. git pull --rebase The same as git pull, but instead

    of doing a merge operation after a fetch, it does a rebase. This is useful to keep your history clean of “merge commits”.
  17. git commit Record a change to the local repository. This

    change then shows up in the history and has a hash reference, a message, and a set of changes.
  18. Developer 1 (John) Developer 2 (Jane) git clone org/repo.git! vim

    file.md! git add file.md! git commit -m “Add file”! git fetch! git rebase origin/master! git push origin master git clone org/repo.git! vim foo.md! git add foo.md! git commit -m “Add foo”! git fetch! git rebase origin/master! git push origin master
  19. Developer 1 (John) Developer 2 (Jane) git clone org/repo.git! git

    checkout -b feature-a! vim file.md! git add file.md! git commit -m “Add file”! git fetch! git rebase origin/master! git push origin feature-a git clone org/repo.git! git checkout -b feature-b! vim foo.md! git add foo.md! git commit -m “Add foo”! git fetch! git rebase origin/master! git push origin feature-b
  20. Developer 1 (John) git fetch! git checkout master! git merge

    origin/feature-b! git push origin :feature-b! git push origin master
  21. Developer 1 (John) git checkout feature-a! git fetch! git rebase

    origin/master! git checkout master! git merge feature-a! git push origin master! git push origin :feature-a
  22. New Feature: Lorem Ipsum git checkout -b lorem-ipsum! vim lorem.md!

    git add lorem.md! git commit -m “Add Lorem Ipsum”! git push origin lorem-ipsum
  23. Add controller for Slim application git checkout -b base-controller! vim

    public/index.php! git add public/index.php! git commit -m “Add slim controller”! git push origin base-controller
  24. History ! git log --graph --pretty=oneline --abbrev-commit! * 00340d4 fixup!

    Add base controller! * 6b322a2 Add base controller! * a8d7c57 Merge pull request #1 from jcarouth/lorem! |\! | * ba68860 Add Lorem Ipsum! |/! * e81ce07 Add file! * 0a4cfa4 Add phone! * aa0f561 Add bar! * f387f9e Add new! * a770a30 More updates! * 6045962 Updates! * 56db6d5 fixup! Expand idea of foo with speakers! * 47613fd Expand idea of foo with speakers! * 9c02248 Add Foo documentation! * 9a42a76 Combine sentences into paragraph! * 63d250a Add more detail to the README! * a14a778 Update summary to be more descriptive! * 0722e78 Initial commit
  25. Rebase to clean up our commits pick 6b322a2 Add base

    controller! fixup 00340d4 fixup! Add base controller! ! # Rebase a8d7c57..00340d4 onto a8d7c57! #! # Commands:! # p, pick = use commit! # r, reword = use commit, but edit the commit message! # e, edit = use commit, but stop for amending! # s, squash = use commit, but meld into previous commit! # f, fixup = like "squash", but discard this commit's log message! # x, exec = run command (the rest of the line) using shell! #! # These lines can be re-ordered; they are executed from top to bottom.! #! # If you remove a line here THAT COMMIT WILL BE LOST.! #! # However, if you remove everything, the rebase will be aborted.! #! # Note that empty commits are commented out
  26. History ! git rebase --interactive origin/master! [detached HEAD 8adf92e] Add

    base controller! 1 file changed, 17 insertions(+)! create mode 100644 public/index.php! Successfully rebased and updated refs/heads/base-controller.! ! ! git log --graph --pretty=oneline --abbrev-commit! * 8adf92e Add base controller! * a8d7c57 Merge pull request #1 from jcarouth/lorem! |\! | * ba68860 Add Lorem Ipsum! |/! * e81ce07 Add file! * 0a4cfa4 Add phone! …
  27. Push to origin (requires force) ! git push -f origin

    base-controller! Counting objects: 1, done.! Writing objects: 100% (1/1), 195 bytes | 0 bytes/s, done.! Total 1 (delta 0), reused 0 (delta 0)! To [email protected]:jcarouth/git-sample-repo.git! + 00340d4...8adf92e base-controller -> base-controller (forced update)
  28. Branch off a branch git fetch! git checkout retrieve-user! git

    checkout -b use-doctrineserviceprovider! vim public/index.php! git add public/index.php! git commit -m “Use DoctringServiceProvider”! git push origin use-doctrineserviceprovider
  29. Branch off a branch • Start work by creating a

    branch off of master! • Make a change
  30. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature
  31. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes
  32. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup
  33. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote
  34. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.
  35. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)
  36. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)! • When all feedback is incorporated, rebase
  37. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)! • When all feedback is incorporated, rebase! • Rebase against master
  38. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)! • When all feedback is incorporated, rebase! • Rebase against master! • Force push
  39. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)! • When all feedback is incorporated, rebase! • Rebase against master! • Force push! • Update PR that it's ready for merge
  40. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)! • When all feedback is incorporated, rebase! • Rebase against master! • Force push! • Update PR that it's ready for merge! • Following policy, merge the PR
  41. Branch off a branch • Start work by creating a

    branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes! • Either commit --amend or commit using fixup! • Push your work to the remote! • Open PR for visibility. Tag people to notify them.! • Incorporate feedback as commits (fixup is nice here)! • When all feedback is incorporated, rebase! • Rebase against master! • Force push! • Update PR that it's ready for merge! • Following policy, merge the PR
  42. Rebase-ing is not scary. Rebasing shared branches can be problematic,

    but be aware of what you’re doing and you’ll be alright. (Or you might have a bad time.) Takeaways