INTRODUCTION TO GIT DAVID PARSONS 1 Source Code Management Tools - - PowerPoint PPT Presentation

introduction to git
SMART_READER_LITE
LIVE PREVIEW

INTRODUCTION TO GIT DAVID PARSONS 1 Source Code Management Tools - - PowerPoint PPT Presentation

INTRODUCTION TO GIT DAVID PARSONS 1 Source Code Management Tools DAVID PARSONS - INTRODUCTION TO GIT DAVID PARSONS - INTRODUCTION TO GIT 2 Source code managers (scm) a.k.a. version control systems (vcs) Allow for the complete


slide-1
SLIDE 1

INTRODUCTION TO GIT

DAVID PARSONS

slide-2
SLIDE 2

DAVID PARSONS - INTRODUCTION TO GIT 2 DAVID PARSONS - INTRODUCTION TO GIT

Source Code Management Tools

1

slide-3
SLIDE 3

DAVID PARSONS - INTRODUCTION TO GIT 3

  • Source code managers (scm) a.k.a.

version control systems (vcs)

  • Allow for the complete tracking and archiving
  • f the modifica=ons made to a set of files
  • Make collabora=ve development easier
  • Usually exist on all plaBorms using the

command line or a graphical user interface

  • Are primarily meant to manage text files but

can also handle binary files (e.g. images). However: do not track any generated files

  • Are not adapted for managing backups !
slide-4
SLIDE 4

DAVID PARSONS - INTRODUCTION TO GIT 4

The « DropBox » case

slide-5
SLIDE 5

DAVID PARSONS - INTRODUCTION TO GIT 5

Resolu=on using an SCM

slide-6
SLIDE 6

DAVID PARSONS - INTRODUCTION TO GIT 6

Resolu=on using an SCM

slide-7
SLIDE 7

DAVID PARSONS - INTRODUCTION TO GIT 7

Repositories and Revisions

  • A Repository
  • Contains the complete history of the

project (i.e. all the revisions)

  • A revision (a.k.a. commit or version)
  • Is a snapshot of all the tracked files
  • Is usually based upon one other revision
  • Corresponds to an iden=fied author
  • Contains a message that explains the

ra=onale for the modifica=ons introduced by the revision and any other info the author considers relevant

A1 B C A2 B1 C A B C Rev 1 Rev 2 Rev 3

slide-8
SLIDE 8

DAVID PARSONS - INTRODUCTION TO GIT 8

Two fundamental rules !

  • Commit oRen
  • Keep commits small and commit together only related

changes

  • Write clear and informa=ve logs
  • A log should enable its reader to:

1. Iden=fy at a glance the ra=onale behind the commit 2. Have detailed explana=on if needed

  • Template for logs (from hUp://git-scm.com/book/ch5-2.html)

Short (50 chars or less) summary of changes More detailed explanatory text, if necessary. Wrap it to about 72 characters or so. In some contexts, the first line is treated as the subject of an email and the rest of the text as the body. The blank line separa=ng the summary from the body is cri=cal (unless you omit the body en=rely).

slide-9
SLIDE 9

DAVID PARSONS - INTRODUCTION TO GIT 9 DAVID PARSONS - INTRODUCTION TO GIT

Git – Overview

2

slide-10
SLIDE 10

DAVID PARSONS - INTRODUCTION TO GIT 10

  • Git is a distributed version control system
  • Original author: Linus Torvalds
  • First version developed in ~1 week aRer some

trouble with BitKeeper (proprietary solu=on)

  • The reference : hUp://git-scm.com/
  • Notorious compe=tors: svn, mercurial

Context

slide-11
SLIDE 11

DAVID PARSONS - INTRODUCTION TO GIT 11

Working copy + Local repo

Each user has (on his own computer):

  • His own local repository (stored in

the .git repository)

  • A working copy (a.k.a. checkout) of

the tracked files. You may checkout any revision (commit)

  • f the project using the command:

git checkout <commit> This will populate your working copy with the content of the specified commit

slide-12
SLIDE 12

DAVID PARSONS - INTRODUCTION TO GIT 12

The Staging Area (a.k.a Index)

  • “Pay a0en1on now” (git book – Git basics)
  • In addi=on to the repository itself and the working

copy, there is a third sec=on in git called the staging area.

  • The staging area is an intermediate space between

the working copy and the repository where one can prepare what’s to be included in the next commit.

  • In short, it is a commit-prepara1on-area
slide-13
SLIDE 13

DAVID PARSONS - INTRODUCTION TO GIT 13

The Staging Area (a.k.a. Index)

slide-14
SLIDE 14

DAVID PARSONS - INTRODUCTION TO GIT 14

Remote repositories

Repositories can be synchronized with one another. In the centralized workflow, each user synchronises his repository with a central repo (the remote) located on a server.

slide-15
SLIDE 15

DAVID PARSONS - INTRODUCTION TO GIT 15

Local Repo

« Integrated » view

Working Copy Staging Area CommiUed Revisions Remote Repo CommiUed Revisions

Remote Local

slide-16
SLIDE 16

DAVID PARSONS - INTRODUCTION TO GIT 16

File Status Lifecycle

slide-17
SLIDE 17

DAVID PARSONS - INTRODUCTION TO GIT 17

The corresponding commands…

  • Add a file
  • Edit a file
  • Stage a file
  • Remove a file
  • Commit a file

git add git stage (or git add) git rm git commit

… are quite straighBorward: NB : git rm actually deletes the file from your working copy. If you want to keep it as an untracked file, use the --cached

  • p=on
slide-18
SLIDE 18

DAVID PARSONS - INTRODUCTION TO GIT 18 DAVID PARSONS - INTRODUCTION TO GIT

Graphical User Interfaces

3

slide-19
SLIDE 19

DAVID PARSONS - INTRODUCTION TO GIT 19

gitk

slide-20
SLIDE 20

DAVID PARSONS - INTRODUCTION TO GIT 20

git-gui

slide-21
SLIDE 21

DAVID PARSONS - INTRODUCTION TO GIT 21 DAVID PARSONS - INTRODUCTION TO GIT

Illustration of the Main Commands

4

slide-22
SLIDE 22

DAVID PARSONS - INTRODUCTION TO GIT 22

Illustra=ons : status

$ ls foo bar $ git status On branch master nothing to commit, working directory clean $ Log rev 1 Log rev 2 Log rev 3 master

slide-23
SLIDE 23

DAVID PARSONS - INTRODUCTION TO GIT 23

Illustra=ons : untracked file

$ ls foo bar $ git status On branch master nothing to commit, working directory clean $ $ # Create a new file baz $ echo "A new file…" > baz $ $ git status On branch master Untracked files: (use "git add <file>…" to include in what will be committed baz nothing added to commit but untracked files present (use "git add" to track) $ Log rev 1 Log rev 2 Log rev 3 master

slide-24
SLIDE 24

DAVID PARSONS - INTRODUCTION TO GIT 24

Illustra=ons : add

$ git add baz Log rev 1 Log rev 2 Log rev 3 master

slide-25
SLIDE 25

DAVID PARSONS - INTRODUCTION TO GIT 25

Illustra=ons : add

$ git add baz $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: baz $ Log rev 1 Log rev 2 Log rev 3 Modifs in index master

slide-26
SLIDE 26

DAVID PARSONS - INTRODUCTION TO GIT 26

Illustra=ons : commit

$ git add baz $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: baz $ git commit Log rev 1 Log rev 2 Log rev 3 Modifs in index master

slide-27
SLIDE 27

DAVID PARSONS - INTRODUCTION TO GIT 27

Illustra=ons : commit

$ git add baz $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: baz $ git commit [master 98aa7ff] Add file baz 1 file changed, 1 insertion(+) create mode 100644 baz $ git status On branch master nothing to commit, working directory clean $ Log rev 1 Log rev 2 Log rev 3 Add file baz master

slide-28
SLIDE 28

DAVID PARSONS - INTRODUCTION TO GIT 28

Illustra=ons : log

$ git log commit 579001a8a6f83cb6547440ba319f7210916ece6b Author: David Parsons <david.parsons@inria.fr> Date: Sat Jan 9 17:53:11 2016 +0100 Add file baz commit e82a7786b5ebfc1d0e62eb00ae2101a328d3f0e4 Author: David Parsons <david.parsons@inria.fr> Date: Sat Jan 9 17:44:29 2016 +0100 Log rev3 commit f6813a3b9f081bb486975dfe5b6a426effabf61c Author: David Parsons <david.parsons@inria.fr> Date: Sat Jan 9 17:43:39 2016 +0100 Log rev2 commit f667b6e8847d20c67968c2b2d8a85fac7076251f : Log rev 1 Log rev 2 Log rev 3 Add file baz master

slide-29
SLIDE 29

DAVID PARSONS - INTRODUCTION TO GIT 29

Illustra=ons : log

$ git log --pretty=oneline 579001a8a6f83cb6547440ba319f7[…] Add file baz e82a7786b5ebfc1d0e62eb00ae210[…] Log rev3 f6813a3b9f081bb486975dfe5b6a4[…] Log rev2 f667b6e8847d20c67968c2b2d8a85[…] Log rev1 $ $ git log --pretty=format:"%h - %an : %s" 579001a - David Parsons : Add file baz e82a778 - David Parsons : Log rev3 f6813a3 - David Parsons : Log rev2 f667b6e - David Parsons : Log rev1 $ Log rev 1 Log rev 2 Log rev 3 Add file baz master

slide-30
SLIDE 30

DAVID PARSONS - INTRODUCTION TO GIT 30

$ # Add content to foo $ echo "Added content" >> foo Log rev 1 Log rev 2 Log rev 3 Add file baz master

Illustra=ons : edit tracked file

slide-31
SLIDE 31

DAVID PARSONS - INTRODUCTION TO GIT 31

Illustra=ons : edit tracked file

$ # Add content to foo $ echo "Added content" >> foo $ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs not in index master

slide-32
SLIDE 32

DAVID PARSONS - INTRODUCTION TO GIT 32

Illustra=ons : edit tracked file

$ # Add content to foo $ echo "Added content" >> foo $ $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: foo no changes added to commit (use "git add" and/

  • r "git commit -a")

$ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs not in index master

slide-33
SLIDE 33

DAVID PARSONS - INTRODUCTION TO GIT 33

Illustra=ons : stage

$ # Mark changes in foo as ‘to be committed’ $ git stage foo Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs not in index master

slide-34
SLIDE 34

DAVID PARSONS - INTRODUCTION TO GIT 34

Illustra=ons : stage

$ # Mark changes in foo as ‘to be committed’ $ git stage foo $ $ # The exact same thing could have been done with git add foo $ $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: foo $ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index master

slide-35
SLIDE 35

DAVID PARSONS - INTRODUCTION TO GIT 35

Index and Working Copy

$ # Add content to bar $ echo "Content added to bar" >> bar Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index master

slide-36
SLIDE 36

DAVID PARSONS - INTRODUCTION TO GIT 36

$ # Add content to bar $ echo "Content added to bar" >> bar $ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index master

Index and Working Copy

slide-37
SLIDE 37

DAVID PARSONS - INTRODUCTION TO GIT 37

$ # Add content to bar $ echo "Content added to bar" >> bar $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: foo Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: bar $ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index master

Index and Working Copy

slide-38
SLIDE 38

DAVID PARSONS - INTRODUCTION TO GIT 38

Illustra=ons : diff

Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index

git diff git diff --staged git diff HEAD

master

slide-39
SLIDE 39

DAVID PARSONS - INTRODUCTION TO GIT 39

$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: foo Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: bar $ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index master

Index and Working Copy

slide-40
SLIDE 40

DAVID PARSONS - INTRODUCTION TO GIT 40

$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: foo Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: bar $ # Add more content to foo $ echo “more content” >> foo Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index master

Index and Working Copy

slide-41
SLIDE 41

DAVID PARSONS - INTRODUCTION TO GIT 41

$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: foo Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: bar modified: foo $ Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index master

Index and Working Copy

slide-42
SLIDE 42

DAVID PARSONS - INTRODUCTION TO GIT 42

Bypassing the index

$ # Commit working copy state of foo $ git commit foo Log rev 1 Log rev 2 Log rev 3 Add file baz Modifs in index Modifs not in index master

slide-43
SLIDE 43

DAVID PARSONS - INTRODUCTION TO GIT 43

$ # Commit working copy state of foo $ git commit foo [master 5e60acc] Add content to foo 1 file changed, 2 insertions(+) $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Modifs not in index Add file baz master

Bypassing the index

slide-44
SLIDE 44

DAVID PARSONS - INTRODUCTION TO GIT 44

$ # Commit working copy state of foo $ git commit foo [master 5e60acc] Add content to foo 1 file changed, 2 insertions(+) $ $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: bar $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Modifs not in index Add file baz master

Bypassing the index

slide-45
SLIDE 45

DAVID PARSONS - INTRODUCTION TO GIT 45

$ # Commit working copy state of all tracked files $ git commit -a -m "Add content to bar” Log rev 1 Log rev 2 Log rev 3 Add content to foo Modifs not in index Add file baz master

Bypassing the index

slide-46
SLIDE 46

DAVID PARSONS - INTRODUCTION TO GIT 46

$ # Commit working copy state of all tracked files $ git commit -a -m "Add content to bar" [master 119dfba] Add content to bar 1 file changed, 1 insertion(+) $ git status On branch master nothing to commit, working directory clean $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar master

Bypassing the index

slide-47
SLIDE 47

DAVID PARSONS - INTRODUCTION TO GIT 47

Configuring git

# Configure your name and e-mail address (almost mandatory) # If you don’t, you’ll get: $ git commit *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. # Configure your name and e-mail address $ git config --global user.name "David Parsons" $ git config --global user.email david.parsons@inria.fr

slide-48
SLIDE 48

DAVID PARSONS - INTRODUCTION TO GIT 48

Configuring git

$ # Configure the editor git will open when needed $ git config --global core.editor nano $ $ # Setup a few aliases, either simple shorthands... $ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.s status $ $ # ... or including options $ git config --global alias.lg "log --pretty=format:\"%h - %an : %s\"" $ $ # You can even create new commands $ git config --global alias.unstage "reset HEAD”

slide-49
SLIDE 49

DAVID PARSONS - INTRODUCTION TO GIT 49 DAVID PARSONS - INTRODUCTION TO GIT

INTERACTING WITH A REMOTE Scenario

5

slide-50
SLIDE 50

DAVID PARSONS - INTRODUCTION TO GIT 50

Working in parallel

clone clone

master

Central repo

slide-51
SLIDE 51

DAVID PARSONS - INTRODUCTION TO GIT 51

master r/o/master

Working in parallel

master master r/o/master

Central repo

slide-52
SLIDE 52

DAVID PARSONS - INTRODUCTION TO GIT 52

Working in parallel

master master master r/o/master r/o/master

Central repo

slide-53
SLIDE 53

DAVID PARSONS - INTRODUCTION TO GIT 53

Working in parallel

master master master

push

r/o/master

Central repo

r/o/master

slide-54
SLIDE 54

DAVID PARSONS - INTRODUCTION TO GIT 54

Working in parallel

master master master r/o/master r/o/master

Central repo

slide-55
SLIDE 55

DAVID PARSONS - INTRODUCTION TO GIT 55

Working in parallel

master master master r/o/master

push

r/o/master

Central repo

slide-56
SLIDE 56

DAVID PARSONS - INTRODUCTION TO GIT 56

Working in parallel

master master master r/o/master

push

r/o/master

Central repo

slide-57
SLIDE 57

DAVID PARSONS - INTRODUCTION TO GIT 57

Working in parallel

master master master r/o/master

fetch

r/o/master

Central repo

slide-58
SLIDE 58

DAVID PARSONS - INTRODUCTION TO GIT 58

Working in parallel

master master master r/o/master r/o/master

Central repo

slide-59
SLIDE 59

DAVID PARSONS - INTRODUCTION TO GIT 59

Working in parallel

master master r/o/master master r/o/master

Central repo

slide-60
SLIDE 60

DAVID PARSONS - INTRODUCTION TO GIT 60

Working in parallel

master master r/o/master master

push

r/o/master

Central repo

slide-61
SLIDE 61

DAVID PARSONS - INTRODUCTION TO GIT 61

Working in parallel

master r/o/master master master r/o/master

Central repo

slide-62
SLIDE 62

DAVID PARSONS - INTRODUCTION TO GIT 62

Working in parallel

master r/o/master master master

pull

r/o/master

Central repo

slide-63
SLIDE 63

DAVID PARSONS - INTRODUCTION TO GIT 63

Working in parallel

master master r/o/master master r/o/master

Central repo

slide-64
SLIDE 64

DAVID PARSONS - INTRODUCTION TO GIT 64 DAVID PARSONS - INTRODUCTION TO GIT

INTERACTING WITH A REMOTE Corresponding Commands

6

slide-65
SLIDE 65

DAVID PARSONS - INTRODUCTION TO GIT 65

Cloning a repository

$ # Clone a remote repository $ # git clone <remote-repo-url> [local-name] $

slide-66
SLIDE 66

DAVID PARSONS - INTRODUCTION TO GIT 66

Cloning a repository

$ # Clone a remote repository $ # git clone <remote-repo-url> [local-name] $ git clone […]/collab.git Cloning into ‘collab'... done. $

slide-67
SLIDE 67

DAVID PARSONS - INTRODUCTION TO GIT 67

Cloning a repository

$ # Clone a remote repository $ # git clone <remote-repo-url> [local-name] $ git clone […]/collab.git Cloning into ‘collab'... done. $ cd collab # Don’t forget to cd into the local repo dir $ Add content to foo Add file baz master Add content to bar v0.1 remotes/origin/master

slide-68
SLIDE 68

DAVID PARSONS - INTRODUCTION TO GIT 68

$ git clone […]/collab.git Cloning into ‘collab'... done. $ cd collab # Don’t forget to cd into the local repo dir $

Other user’s viewpoint

Add content to foo Add file baz master Add content to bar v0.1 remotes/origin/master

slide-69
SLIDE 69

DAVID PARSONS - INTRODUCTION TO GIT 69

Remotes

$ # Clone a remote repository $ # git clone <remote-repo-url> [local-name] $ git clone […]/collab.git Cloning into ‘collab'... done. $ cd collab # Don’t forget to cd into the local repo dir $ git remote

  • rigin

$ git remote –v

  • rigin

[…]/collab.git (fetch)

  • rigin

[…]/collab.git (push) $ Add content to foo Add file baz master Add content to bar v0.1 remotes/origin/master

slide-70
SLIDE 70

DAVID PARSONS - INTRODUCTION TO GIT 70

Remote tracking branch

Add content to foo Add file baz master Add content to bar v0.1 remotes/origin/master $ # Commit stuff $ echo "This is the content of bar" > bar $ Modifs not in index

slide-71
SLIDE 71

DAVID PARSONS - INTRODUCTION TO GIT 71

Remote tracking branch

$ # Commit stuff $ echo "This is the content of bar" > bar $ git commit bar -m "Modify bar" $ Add content to bar remotes/origin/master master Modify bar Add content to foo Add file baz v0.1

slide-72
SLIDE 72

DAVID PARSONS - INTRODUCTION TO GIT 72

Push

$ # Push your commits onto the remote repository $ git push Add content to bar remotes/origin/master master Modify bar Add content to foo Add file baz v0.1

slide-73
SLIDE 73

DAVID PARSONS - INTRODUCTION TO GIT 73

Push

$ # Push your commits onto the remote repository $ git push Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 318 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To […]/collab.git 119dfba..a8f9783 master -> master $ Add content to bar master Modify bar remotes/origin/master Add content to foo Add file baz v0.1

slide-74
SLIDE 74

DAVID PARSONS - INTRODUCTION TO GIT 74

$

Other user’s viewpoint

Add content to foo Add file baz master Add content to bar v0.1 remotes/origin/master

slide-75
SLIDE 75

DAVID PARSONS - INTRODUCTION TO GIT 75

$ # Commit stuff $ echo "This is foo’s new content" > foo $ git commit foo -m "Change foo" $ Add content to bar remotes/origin/master master Change foo

Other user’s viewpoint

Add content to foo Add file baz v0.1

slide-76
SLIDE 76

DAVID PARSONS - INTRODUCTION TO GIT 76

$ git push To […]/collab.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to ‘[…]/collab.git’ hint: Updates were rejected because the remote contains work that you hint: do not have locally. This is usually caused by another hint: repository pushing to the same ref. You may want to first hint: integrate the remote changes (e.g., 'git pull ...') before hint: pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. $

Failed push

Add content to bar remotes/origin/master master Change foo Add content to foo Add file baz v0.1

slide-77
SLIDE 77

DAVID PARSONS - INTRODUCTION TO GIT 77

$ git fetch

Fetch

Add content to bar remotes/origin/master master Change foo Add content to foo Add file baz v0.1

slide-78
SLIDE 78

DAVID PARSONS - INTRODUCTION TO GIT 78

$ git fetch From […]/collab.git 119dfba..a8f9783 master -> origin/master $ Add content to bar v0.1 Modify bar Change foo master remotes/origin/master

Fetch

Add content to foo Add file baz

slide-79
SLIDE 79

DAVID PARSONS - INTRODUCTION TO GIT 79

$ git merge

Merge

Add content to bar v0.1 Modify bar Change foo master remotes/origin/master Add content to foo Add file baz

Merging consists in injec=ng the accumulated changeset of r/o/master into master A merge is embodied by a merge commit that has two parents and that includes the changes from both sides The branch being merged is untouched

slide-80
SLIDE 80

DAVID PARSONS - INTRODUCTION TO GIT 80

$ git merge Merge made by the 'recursive' strategy. bar | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 bar $ Change foo Modify bar Merge remote-tracking branch 'origin/master' master remotes/origin/master

Merge without conflicts

Add content to bar v0.1 Add content to foo Add file baz

When there are no conflicts between the two changesets, git merge automa=cally triggers the crea=on of the merge commit. It will open your core editor with a predefined log msg

slide-81
SLIDE 81

DAVID PARSONS - INTRODUCTION TO GIT 81

$ git push $ Merge remote-tracking branch 'origin/master' master remotes/origin/master

Push

Change foo Modify bar Add content to bar v0.1 Add content to foo Add file baz

slide-82
SLIDE 82

DAVID PARSONS - INTRODUCTION TO GIT 82

Pull

$ git pull Add content to bar remotes/origin/master master Modify bar Add content to foo Add file baz v0.1

slide-83
SLIDE 83

DAVID PARSONS - INTRODUCTION TO GIT 83

Pull

$ git pull […] $ Merge remote-tracking branch 'origin/master' master remotes/origin/master Change foo Modify bar Add content to bar v0.1 Add content to foo Add file baz

slide-84
SLIDE 84

DAVID PARSONS - INTRODUCTION TO GIT 84

Git push configura=on

$ # When pushing for the first time, you might get a warning message such as this one: warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use: git config --global push.default matching To squelch this message and adopt the new behavior now, use: git config --global push.default simple $ # If you do, choose the new behaviour, which is safest: $ git config --global push.default simple

slide-85
SLIDE 85

DAVID PARSONS - INTRODUCTION TO GIT 85 DAVID PARSONS - INTRODUCTION TO GIT

MANAGING CONFLICTS

7

slide-86
SLIDE 86

DAVID PARSONS - INTRODUCTION TO GIT 86

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify bar Change bar $ git merge master

Managing conflicts

r/o/master

slide-87
SLIDE 87

DAVID PARSONS - INTRODUCTION TO GIT 87

$ git merge Auto-merging bar CONFLICT (content): Merge conflict in bar Automatic merge failed; fix conflicts and then commit the result. $

Managing conflicts

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify bar Change bar master r/o/master

slide-88
SLIDE 88

DAVID PARSONS - INTRODUCTION TO GIT 88

$ git merge Auto-merging bar CONFLICT (content): Merge conflict in bar Automatic merge failed; fix conflicts and then commit the result. $ $ cat bar This is line 1 This is line 2 This is line 3 <<<<<<< HEAD This is the fourth line ======= This is line number 4 >>>>>>> featureA This is line 5 This is line 6 This is line 7 This is line 8 $

Managing conflicts

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify bar Change bar master r/o/master

slide-89
SLIDE 89

DAVID PARSONS - INTRODUCTION TO GIT 89

$ # You can edit the conflicting files directly and then stage them and commit, or you can use a merge tool $ $ git mergetool

Managing conflicts

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify bar Change bar master r/o/master

slide-90
SLIDE 90

DAVID PARSONS - INTRODUCTION TO GIT 90

mergetool – p4merge

slide-91
SLIDE 91

DAVID PARSONS - INTRODUCTION TO GIT 91

$ git config --global merge.tool meld $ git config --global mergetool.meld.cmd 'meld $LOCAL $MERGED $REMOTE' $ git config --global mergetool.meld.trustExitCode false $

Configuring a mergetool

slide-92
SLIDE 92

DAVID PARSONS - INTRODUCTION TO GIT 92 DAVID PARSONS - INTRODUCTION TO GIT

Branches

8

slide-93
SLIDE 93

DAVID PARSONS - INTRODUCTION TO GIT 93

What is a branch ?

branch

Each branch contains an alterna=ve version of the same set of files Git is meant for an extensive use of branches « master » is the main branch, i.e. that which is checked out by default

master

slide-94
SLIDE 94

DAVID PARSONS - INTRODUCTION TO GIT 94

Branch types

branch

Git does not know about branch types, it is the usage you make of a branch that determines its “type” A branch may remain local to a user’s repo or be published (pushed) to the central repo Common use cases for branches include:

  • Feature
  • Bugfix
  • LTS

master

slide-95
SLIDE 95

DAVID PARSONS - INTRODUCTION TO GIT 95

Feature and Bugfix branches

featureA

These branches are useful for developing a feature or a patch without messing with the master They are usually meant to be merged back into the master when the feature or patch is ready The workflow is yours (your team’s) to define

master

slide-96
SLIDE 96

DAVID PARSONS - INTRODUCTION TO GIT 96

Merging branches

featureA

Here we have merged branch featureA into branch master. This means we have injected the accumulated changeset of featureA into master Merging a local branch is just the same as merging a remote- tracking branch This merge is embodied by a commit (unless it is a fast- forward) that has two parents and that include the changes made to both branches (here 5 changesets) Branch featureA is untouched

master

slide-97
SLIDE 97

DAVID PARSONS - INTRODUCTION TO GIT 97

Maintenance branches

v1.1.2

Branches can be used for integra=ng bugfixes in earlier maintained releases (e.g. LTS) These branches are not meant to be merged into the master

v1.1.0 v1.1.1 master v1.2.0

slide-98
SLIDE 98

DAVID PARSONS - INTRODUCTION TO GIT 98

Warning for SVN users

  • At any =me, your working copy contains only the

content of one single branch

slide-99
SLIDE 99

DAVID PARSONS - INTRODUCTION TO GIT 99

Branches

$ git branch * master $ git branch featureA Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar master v0.1

slide-100
SLIDE 100

DAVID PARSONS - INTRODUCTION TO GIT 100

Branches

$ git branch * master $ git branch featureA $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz featureA Add content to bar v0.1 master

slide-101
SLIDE 101

DAVID PARSONS - INTRODUCTION TO GIT 101

Branches

$ git branch * master $ git branch featureA $ git branch featureA * master $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz featureA Add content to bar v0.1 master

slide-102
SLIDE 102

DAVID PARSONS - INTRODUCTION TO GIT 102

Branches

$ git branch * master $ git branch featureA $ git branch featureA * master $ git checkout featureA $ git branch * featureA master $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz featureA Add content to bar v0.1 master

You can also create and checkout a new branch at once with

git checkout –b newBranch

slide-103
SLIDE 103

DAVID PARSONS - INTRODUCTION TO GIT 103

Branches

$ # Commit stuff in branch featureA $ echo “Blabla” >> foo $ git commit foo -m “Modify foo” Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz featureA Add content to bar v0.1 master Modifs not in index

slide-104
SLIDE 104

DAVID PARSONS - INTRODUCTION TO GIT 104

Branches

$ # Commit stuff in branch featureA $ echo “Blabla” >> foo $ git commit foo -m “Modify foo” $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add […] bar v0.1 Modify foo featureA master

slide-105
SLIDE 105

DAVID PARSONS - INTRODUCTION TO GIT 105

Branches

$ # Checkout branch master and commit stuff in it $ git checkout master $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add […] bar v0.1 Modify foo featureA master

slide-106
SLIDE 106

DAVID PARSONS - INTRODUCTION TO GIT 106

Branches

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify foo featureA $ # Checkout branch master and commit stuff in it $ git checkout master $ echo “Blabla” >> bar $ git commit foo -m “Modify bar” $ Modify bar master

slide-107
SLIDE 107

DAVID PARSONS - INTRODUCTION TO GIT 107

Merging branches

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify foo featureA Modify bar master $ git merge featureA

slide-108
SLIDE 108

DAVID PARSONS - INTRODUCTION TO GIT 108

Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify bar Modify foo featureA Merge branch ‘featureA’ master

Merging a local branch is just the same as merging a remote-tracking branch

$ git merge featureA $

Merging branches

slide-109
SLIDE 109

DAVID PARSONS - INTRODUCTION TO GIT 109 DAVID PARSONS - INTRODUCTION TO GIT

Tags

9

slide-110
SLIDE 110

DAVID PARSONS - INTRODUCTION TO GIT 110

Tags

$ # Create an annotated tag named "v0.1" $ git tag –a v0.1 –m “version 0.1” $ # List tags $ git tag v0.1 $ Log rev 3 Add content to foo Add file baz Add content to bar v0.1 master

A tag is typically used to mark a release point. There are 2 types of tags:

  • Lightweight (just a reference to a specific commit)
  • Annotated (full object, contains addi=onal info, can be signed)
slide-111
SLIDE 111

DAVID PARSONS - INTRODUCTION TO GIT 111

Tags

Tags have to be pushed and fetched manually

git push origin <tagname> or git push origin –tags Git fetch origin --tags

slide-112
SLIDE 112

DAVID PARSONS - INTRODUCTION TO GIT 112 DAVID PARSONS - INTRODUCTION TO GIT

Tree-ish ?

10

slide-113
SLIDE 113

DAVID PARSONS - INTRODUCTION TO GIT 113

Tree-ish: a concept you should know of

A commit can be iden=fied in mul=ple ways, e.g. :

  • Its SHA1 (possibly abbreviated)
  • A branch name
  • A tag
  • A reference (e.g. HEAD, …)
  • An indirect reference : HEAD^, HEAD~, master~3, …
slide-114
SLIDE 114

DAVID PARSONS - INTRODUCTION TO GIT 114

Indirect references

A commit can be iden=fied indirectly using a base commit followed by any combina=on of the ^ and ~ operators:

  • C^n: breadth first operator – gets the nth parent of commit C
  • C~n: depth first operator – gets the ancestor of commit C, n

genera=ons back, always favouring the first parent

  • N == 1 by default
  • D == B^1 == B^ == B~1 == B~
  • D == A~2 == A~1~1 == A^^…
  • C == A^2

A B D C

slide-115
SLIDE 115

DAVID PARSONS - INTRODUCTION TO GIT 115 DAVID PARSONS - INTRODUCTION TO GIT

Merge or Rebase ?

11

slide-116
SLIDE 116

DAVID PARSONS - INTRODUCTION TO GIT 116

Rebase

$ git rebase Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Modify bar Change bar master remotes/origin/master

slide-117
SLIDE 117

DAVID PARSONS - INTRODUCTION TO GIT 117

Rebase

$ git rebase $ Log rev 1 Log rev 2 Log rev 3 Add content to foo Add file baz Add content to bar v0.1 Change bar Change bar master remotes/origin/master Modify bar

This was your HEAD just before the rebase This is a brand new commit

slide-118
SLIDE 118

DAVID PARSONS - INTRODUCTION TO GIT 118

  • Rebasing basically means re-wri=ng the history of

what happened. This is a very powerful feature, in par=cular in the interac=ve mode (rebase -i). But as always, great power comes with great responsibility DO NOT REBASE COMMITS THAT EXIST OUTSIDE YOUR REPOSITORY

Rebase only local commits

slide-119
SLIDE 119

DAVID PARSONS - INTRODUCTION TO GIT 119

Which one would you prefer ?

Merge Rebase

Merge or rebase ?

slide-120
SLIDE 120

DAVID PARSONS - INTRODUCTION TO GIT 120

Merge or rebase ?

Or maybe this mixed one ?

Merge Rebase Mixed

slide-121
SLIDE 121

DAVID PARSONS - INTRODUCTION TO GIT 121 DAVID PARSONS - INTRODUCTION TO GIT

To go further…

12

slide-122
SLIDE 122

DAVID PARSONS - INTRODUCTION TO GIT 122

  • Addi=onal commands or op=ons
  • commit --amend
  • stash / stash pop
  • rebase –i
  • add –p
  • cherry-pick
  • bisect
  • revert
  • And so many more…
  • git-awtude.fr

To go further…

slide-123
SLIDE 123

LIEU LOCALISATION

www.inria.fr

Antenne INRIA Lyon la Doua

www.inria.fr

Thank you