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

terminology

Slide 4

Slide 4 text

repository A set of commit objects stored next to the project files in a .git subdirectory.

Slide 5

Slide 5 text

Remote A copy of a repository stored in a separate location. Typically this will be on the Internet or over the network somewhere.

Slide 6

Slide 6 text

push The act of updating a remote repository with commit objects from a local repository.

Slide 7

Slide 7 text

merge The act of bringing commit objects from one branch to another. This can be local or remote.

Slide 8

Slide 8 text

pull request Proposed changes to a repository submitted by a user and either accepted or rejected by a project member.

Slide 9

Slide 9 text

Commands

Slide 10

Slide 10 text

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.

Slide 11

Slide 11 text

git push git push! git push origin master! git push

Slide 12

Slide 12 text

git fetch Download commit objects from a remote into the local repository. This does not apply any changes to your workspace.

Slide 13

Slide 13 text

git fetch git fetch! git fetch origin master! git fetch ! git fetch

Slide 14

Slide 14 text

git merge Apply a set of change objects to your workspace. This can reference a local branch or a remote branch.

Slide 15

Slide 15 text

git merge git merge my-branch! git merge origin/master

Slide 16

Slide 16 text

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.

Slide 17

Slide 17 text

git pull git pull! git pull origin master

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

git rebase git rebase --interactive HEAD~3

Slide 21

Slide 21 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 22

Slide 22 text

! git rebase --interactive HEAD~4

Slide 23

Slide 23 text

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

Slide 24

Slide 24 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 25

Slide 25 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 26

Slide 26 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 27

Slide 27 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 28

Slide 28 text

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.

Slide 29

Slide 29 text

git commit git commit -m “Summary”! git commit --amend! git commit --fixup=HEAD

Slide 30

Slide 30 text

workflows

Slide 31

Slide 31 text

centralized

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

master

Slide 35

Slide 35 text

Feature Branch

Slide 36

Slide 36 text

master feature

Slide 37

Slide 37 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 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

Slide 38

Slide 38 text

master feature-a feature-b

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

master feature-a

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

master

Slide 43

Slide 43 text

Git Flow

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

code reviews and conversations

Slide 46

Slide 46 text

pull requests for code review

Slide 47

Slide 47 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 48

Slide 48 text

No content

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

Pull Requests: Open Early; Update often.

Slide 51

Slide 51 text

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

Slide 52

Slide 52 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 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 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 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 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 61

Slide 61 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 62

Slide 62 text

No content

Slide 63

Slide 63 text

Experimental code Branching off Branches

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 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 66

Slide 66 text

No content

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

Working on a feature

Slide 69

Slide 69 text

Branch off a branch • Start work by creating a branch off of master

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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.

Slide 76

Slide 76 text

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)

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

Profit.

Slide 84

Slide 84 text

Push your code regularly. Takeaways

Slide 85

Slide 85 text

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

Slide 86

Slide 86 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