Slide 1

Slide 1 text

git and github working effectively on a team PRESENTED BY JEFF CAROUTH @jcarouth

Slide 2

Slide 2 text

Do You use git? How long?

Slide 3

Slide 3 text

Effectively working on a team requires communication

Slide 4

Slide 4 text

Email is not effective communication

Slide 5

Slide 5 text

Opportunities for Communication

Slide 6

Slide 6 text

Opportunities for Communication 1. Commit messages

Slide 7

Slide 7 text

Opportunities for Communication 1. Commit messages 2. Pull request comments

Slide 8

Slide 8 text

Opportunities for Communication 1. Commit messages 2. Pull request comments 3. Commit comments

Slide 9

Slide 9 text

Opportunities for Communication 1. Commit messages 2. Pull request comments 3. Commit comments 4. Issue tracker

Slide 10

Slide 10 text

Opportunities for Communication 1. Commit messages 2. Pull request comments 3. Commit comments 4. Issue tracker 5.

Slide 11

Slide 11 text

Commands

Slide 12

Slide 12 text

git rebase Apply changes to the current branch on top of the specified branch’s history.

Slide 13

Slide 13 text

git rebase git rebase origin/master! git rebase master! git rebase

Slide 14

Slide 14 text

git rebase git rebase --interactive HEAD~3

Slide 15

Slide 15 text

! 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

Slide 16

Slide 16 text

! git rebase --interactive HEAD~4

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

! 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.

Slide 20

Slide 20 text

! 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

Slide 21

Slide 21 text

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”.

Slide 22

Slide 22 text

workflows

Slide 23

Slide 23 text

centralized

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Developer 1 (John) git clone org/repo.git! vim file.md! git pull! git add file.md! git commit -m “Add file”! git push origin master

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

master

Slide 28

Slide 28 text

Feature Branch

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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 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 push origin feature-b

Slide 32

Slide 32 text

master feature-a feature-b

Slide 33

Slide 33 text

Developer 1 (John) git fetch! git checkout master! git merge origin/feature-b! git push origin :feature-b! git push origin master

Slide 34

Slide 34 text

master feature-a

Slide 35

Slide 35 text

Developer 1 (John) git checkout feature-a! git fetch! git checkout master! git merge feature-a! git push origin master! git push origin :feature-a

Slide 36

Slide 36 text

master master

Slide 37

Slide 37 text

Git Flow

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

rebase vs. merge

Slide 40

Slide 40 text

Developer 1 (bar) ! vim bar.md! ! git add .! ! git commit -m "Add bar"! [master 3ab9ff9] Add bar! 1 file changed, 1 insertion(+)! create mode 100644 bar.md! ! vim bar.md! ! git add .! ! git commit -m "Add bar docs"! [master cef18d5] Add what is statement to bar docs! 1 file changed, 2 insertions(+)

Slide 41

Slide 41 text

Developer 1 (bar) ! vim bar.md! ! git add .! ! git commit -m "Add bar"! [master 3ab9ff9] Add bar! 1 file changed, 1 insertion(+)! create mode 100644 bar.md! ! vim bar.md! ! git add .! ! gc -m "Add what is statement to bar docs"! [master cef18d5] Add what is statement to bar docs! 1 file changed, 2 insertions(+) Developer 2 (baz) ! vim baz.md! ! git add .! ! git commit -m "Add baz"! [feature-b 57b25fb] Add baz! 1 file changed, 1 insertion(+)! create mode 100644 baz.md!

Slide 42

Slide 42 text

Developer 1 (bar) Developer 2 (baz) ! git fetch origin! From origin! 0066729..cef18d5 master -> origin/master! ! git pull origin master! From origin! * branch master -> FETCH_HEAD! Merge made by the 'recursive' strategy.! bar.md | 3 +++! file.md | 1 +! 2 files changed, 4 insertions(+)! create mode 100644 bar.md! create mode 100644 file.md

Slide 43

Slide 43 text

Developer 1 (bar) Developer 2 (baz) ! vim baz.md! ! git add .! ! git commit -m "Clarify baz's coolness"! [feature-b c7c084f] Clarify baz's coolness! 1 file changed, 2 insertions(+)!

Slide 44

Slide 44 text

Developer 1 (bar) Developer 2 (baz) ! git push origin feature-c! Total 8 (delta 3), reused 0 (delta 0)! To origin! * [new branch] feature-c -> feature-c

Slide 45

Slide 45 text

Developer 1 (bar) Developer 2 (baz) ! git checkout master! ! git merge feature-c! Updating cef18d5..c7c084f! Fast-forward! baz.md | 3 +++! 1 file changed, 3 insertions(+)! create mode 100644 baz.md! ! git push origin master

Slide 46

Slide 46 text

master master

Slide 47

Slide 47 text

master master

Slide 48

Slide 48 text

master master Merge branch 'master' of origin into feature-b

Slide 49

Slide 49 text

Developer 1 (bar) Developer 2 (baz) ! git fetch origin! From origin! 0066729..cef18d5 master -> origin/master! ! git pull origin master! From origin! * branch master -> FETCH_HEAD! Merge made by the 'recursive' strategy.! bar.md | 3 +++! file.md | 1 +! 2 files changed, 4 insertions(+)! create mode 100644 bar.md! create mode 100644 file.md

Slide 50

Slide 50 text

Developer 1 (bar) Developer 2 (baz) ! git fetch origin! From origin! 0066729..cef18d5 master -> origin/master! ! git pull origin master! From origin! * branch master -> FETCH_HEAD! Merge made by the 'recursive' strategy.! bar.md | 3 +++! file.md | 1 +! 2 files changed, 4 insertions(+)! create mode 100644 bar.md! create mode 100644 file.md! ! vim baz.md! ! git add .! ! git commit -m "Clarify baz's coolness"! [feature-b c7c084f] Clarify baz's coolness! 1 file changed, 2 insertions(+)

Slide 51

Slide 51 text

Developer 1 (bar) Developer 2 (baz) ! git fetch origin! From origin! 0066729..cef18d5 master -> origin/master! ! git rebase origin/master! First, rewinding head to replay your work on top of it...! Applying: Add buzz! Applying: Add buzz lightyear definition

Slide 52

Slide 52 text

Developer 1 (bar) Developer 2 (baz) ! git push origin feature-d

Slide 53

Slide 53 text

Developer 1 (bar) Developer 2 (baz) ! git checkout master! ! git merge feature-c! Updating cef18d5..c7c084f! Fast-forward! baz.md | 3 +++! 1 file changed, 3 insertions(+)! create mode 100644 baz.md! ! git push origin master

Slide 54

Slide 54 text

master master

Slide 55

Slide 55 text

code reviews and conversations

Slide 56

Slide 56 text

pull requests for code review

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

Pull Requests: Open Early; Update often.

Slide 61

Slide 61 text

Tip When incorporating feedback in your Pull Request, use autosquash or rebase your commits before merging.

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

Incorporate feedback vim public/index.php! git add public/index.php! git commit --fixup=HEAD! git push origin base-controller

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

Rebase to clean up our commits git rebase --interactive origin/master

Slide 69

Slide 69 text

Rebase to clean up our commits 1 pick 6b322a2 Add base controller! 2 fixup 00340d4 fixup! Add base controller! 3! 4 # Rebase a8d7c57..00340d4 onto a8d7c57! 5 #! 6 # Commands:! 7 # p, pick = use commit! 8 # r, reword = use commit, but edit the commit message! 9 # e, edit = use commit, but stop for amending! 10 # s, squash = use commit, but meld into previous commit! 11 # f, fixup = like "squash", but discard this commit's log message! 12 # x, exec = run command (the rest of the line) using shell! 13 #! 14 # These lines can be re-ordered; they are executed from top to bottom.! 15 #! 16 # If you remove a line here THAT COMMIT WILL BE LOST.! 17 #! 18 # However, if you remove everything, the rebase will be aborted.! 19 #! 20 # Note that empty commits are commented out

Slide 70

Slide 70 text

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! …

Slide 71

Slide 71 text

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)

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

Experimental code Branching off Branches

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

Working on a feature

Slide 79

Slide 79 text

My general workflow • Start work by creating a branch off of master

Slide 80

Slide 80 text

My general workflow • Start work by creating a branch off of master! • Make a change

Slide 81

Slide 81 text

My general workflow • Start work by creating a branch off of master! • Make a change! • Commit it with a message for the whole feature

Slide 82

Slide 82 text

My general workflow • Start work by creating a branch off of master! • Make a change! • Commit it with a message for the whole feature! • Make more changes

Slide 83

Slide 83 text

My general workflow • 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

Slide 84

Slide 84 text

My general workflow • 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 work to the remote

Slide 85

Slide 85 text

My general workflow • 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.

Slide 86

Slide 86 text

My general workflow • 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)

Slide 87

Slide 87 text

My general workflow • 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 against master

Slide 88

Slide 88 text

My general workflow • 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 against master! • Force push the branch

Slide 89

Slide 89 text

My general workflow • 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 against master! • Force push the branch! • Update PR that it's ready for merge

Slide 90

Slide 90 text

My general workflow • 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 against master! • Force push the branch! • Update PR that it's ready for merge! • Following policy, merge the PR

Slide 91

Slide 91 text

My general workflow • 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 against master! • Force push! • Update PR that it's ready for merge! • Following policy, merge the PR

Slide 92

Slide 92 text

Profit.

Slide 93

Slide 93 text

resources

Slide 94

Slide 94 text

help.github.com

Slide 95

Slide 95 text

training.github.com

Slide 96

Slide 96 text

www.atlassian.com/git/workflows

Slide 97

Slide 97 text

Push your code regularly. Takeaways

Slide 98

Slide 98 text

Open Pull Requests early. Update them often.! They’re free, after all. Takeaways

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

Thank You joind.in/10636 @jcarouth