Do not lie yourself.
You do not deal with labels.
You deal with snapshots.
Slide 64
Slide 64 text
GIT vs ClearCase
●
'Baseline' means 'snapshot' in GIT terms.
●
But to deliver you correct snapshots there is
the team of masterminds Tieto SWDI who
supports label system and makes centralized
system redundant.
●
Each config spec includes over 9000 different
labels to create 1 snapshot.
Slide 65
Slide 65 text
Over 9000 labels
to create 1 snapshot
Slide 66
Slide 66 text
GIT vs ClearCase
●
And if you want to extend your snapshot, you need to add much more
additional rules prettifying Frankensteinish settings.
●
Each rule defines how your local copy of ClearCase will have to request
information about certain file or diff by network.
●
Each operation is performed over the network which causes mortal delays.
Everything is very slow.
●
Without network you cannot even open file or build something.
●
You need to explain your ClearCase by unreadable labels and awkward
rules time after time which snapshot you need instead of straight using it.
Slide 67
Slide 67 text
GIT vs ClearCase
GIT have no such restrictions by design
●
GIT initialy operates snapshots, there is no need in any explicit
determining which set of labels you need.
●
Everything is local. You may pull changes from master repository and
continue your work even in aircraft, with branches and whole
development story. You may check earliest version even you lost in
Tundra without any internet signs.
●
Your repository is your own game. You can develop in any way you
want. Just send your changes into central repository at time.
●
Operations are really rapid and easy. If you want to select LSV or
branch, you do not need to ask central repository for proper set of
rules. Just use it!
Slide 68
Slide 68 text
Examples
Slide 69
Slide 69 text
GIT vs ClearCase
Choosing baseline
ClearCase way Git way
$ git checkout BASELINE
work
$ select_config CPP_DESIGN
wait for 2 minutes
select latest baseline
have a cup of tea
exclude components
push 'Set' button
wait for 2 minutes
close application
wait for 1 minute
work
Slide 70
Slide 70 text
GIT vs ClearCase
Branching
ClearCase way Git way
$ git checkout -b hardcore_branch
work
$ ct mkbrtype hardcore_branch
$ ctedcs
Type something like
element * CHECKEDOUT
element …/hardcore_branch/LATEST
element /main/cppdev/LATEST
-mkbranch hardcore_branch
$ ct co -nc /
Work if noone checkedout a file
Slide 71
Slide 71 text
GIT vs ClearCase
Building your software
ClearCase GIT
$ cat ./git_build.sh
git checkout BASELINE
cd
$ cat ./cc_build.sh
ct_set_needed_cs -version
-baseline
cd
Slide 72
Slide 72 text
GIT vs ClearCase
Building your software
ClearCase GIT
$ time -p ./git_build.sh >
/dev/null
real 58.28
user 21.20
sys 35.14
$ time -p ./cc_build.sh >
/dev/null
real 1053
user 266
sys 78.72
Slide 73
Slide 73 text
GIT vs ClearCase
Building your software
ClearCase GIT
$ time -p ./git_build.sh >
/dev/null
real 58.28
user 21.20
sys 35.14
$ time -p ./cc_build.sh >
/dev/null
real 1053
user 266
sys 78.72
17.5 minutes vs 1 minute!
Slide 74
Slide 74 text
Do you really like ClearCase?
Slide 75
Slide 75 text
Or you just have not used
something completely different
before?
Slide 76
Slide 76 text
GIT vs ClearCase
●
GIT support your actual way of developing software by design. You do not
need to juggle tons of labels being in a jail of ClearCase ancient restrictions.
●
ClearCase does not allow to use modern convenient ways of developing 'out of
box'. It provides you with hardcore methods for hacking it only.
●
Everytime you need something from ClearCase, you need to modify your config
spec which already contains text with size around a two volumes of 'War and
Peace' book instead of telling it what you really want to get.
You do not use ClearCase to simplify your job,
everytime you appeal to it to get anything.
Slide 77
Slide 77 text
Switcher vocabulary
Slide 78
Slide 78 text
Switcher vocabulary
●
Repository — the copy of project
●
Commit — fixed snapshot of code base in repository
●
Checking out — about populating working tree with
the content of a commit:
●
Fetch info from repository what files that should be checked out
●
Populating working tree with those files
●
There is no locking going on anywhere
●
git checkout file does not imply any locking
●
Checking in – in git you do two things instead:
●
Create commit of your change set, store in local repository (git commit)
●
Pushing from your local repository to remote repository (git push)
Slide 79
Slide 79 text
Fully distrubuted
Slide 80
Slide 80 text
What is GIT?
Git is an open source,
distributed version control
system designed for speed
and efficiency.
Slide 81
Slide 81 text
Fully distributed
(almost) everything is local
which means
―
everything is fast;
―
every clone is backup;
―
work offline;
―
every known remote repo is branch;
Fully distributed
Network down
Ivan's
repository
Nikolay's
repository
Natasha's
repository
master master master
feature_x feature_x
test_z
BUG!!! I take it.
GIT workflow
●
Create your branch
●
Edit files
●
Stage your changes
●
Commit the changes
●
Rebase your branch from master
●
Merge to master
●
Push to central repository
Slide 118
Slide 118 text
Branches
Slide 119
Slide 119 text
GIT workflow
Branching in details
A1
master
HEAD
Slide 120
Slide 120 text
GIT workflow
Branching in details
A1 A2
master
HEAD
Slide 121
Slide 121 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
git branch newbranch
Slide 122
Slide 122 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
newbranch
Slide 123
Slide 123 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
git checkout newbranch
newbranch
Slide 124
Slide 124 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
newbranch
Slide 125
Slide 125 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
A4
newbranch
Slide 126
Slide 126 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
A4 A5
newbranch
Slide 127
Slide 127 text
GIT workflow
Branching in details
A1 A2 A3
master
A4 A5
git checkout master
HEAD
newbranch
Slide 128
Slide 128 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
A4 A5
newbranch
Slide 129
Slide 129 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
A4 A5
newbranch
Slide 130
Slide 130 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
A4 A5
A6
newbranch
Slide 131
Slide 131 text
GIT workflow
Branching in details
A1 A2 A3
master
HEAD
A4 A5
A6 A7
newbranch
Slide 132
Slide 132 text
What's up, folks?
This presentation
contains 262
slides and looks
like that you have
reached the
midway.
Congrats!
Slide 133
Slide 133 text
GIT workflow
Branching in details
●
Branch pointer always points on the head of a
branch;
●
Creating branch = creating pointer to commit. 41
bytes on your disk;
●
Removing branch is removing pointer.
●
Obsolete commits is removed by GIT's GC;
●
HEAD meta-tag points to a current active branch;
●
One task = one branch.
Slide 134
Slide 134 text
GIT workflow
Branching in details
●
Branch pointer always points on the head of a
branch;
●
Creating branch = creating pointer to commit. 41
bytes on your disk;
●
Removing branch is removing pointer.
●
Obsolete commits is removed by GIT's GC;
●
HEAD meta-tag points to a current active branch;
●
One task = one branch.
Slide 135
Slide 135 text
GIT workflow
●
Create your branch
●
Edit files
●
Stage your changes
●
Commit the changes
●
Rebase your branch from master
●
Merge to master
●
Push to central repository
Slide 136
Slide 136 text
Staging and commiting
Slide 137
Slide 137 text
GIT workflow
Staging and commiting
Working directory
Index
Repository
Slide 138
Slide 138 text
GIT workflow
Staging and commiting
A working copy
of your project
Working directory
Index
Repository
Slide 139
Slide 139 text
GIT workflow
Staging and commiting
Staging area
Working directory
Index
Repository
Slide 140
Slide 140 text
GIT workflow
Staging and commiting
Object database
Working directory
Index
Repository
Slide 141
Slide 141 text
GIT workflow
Staging and commiting
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to
track)
Slide 142
Slide 142 text
GIT workflow
Staging and commiting
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to
track)
Slide 143
Slide 143 text
GIT workflow
Staging and commiting
$ emacs helloworld.c
$ cat helloworld.c
/* This is a classic 'hello world' app */
int
main (int argc, char** argv) {
puts("Hello, brave new world!");
return 0;
}
Slide 144
Slide 144 text
GIT workflow
Staging and commiting
$ emacs helloworld.c
$ cat helloworld.c
/* This is a classic 'hello world' app */
int
main (int argc, char** argv) {
puts("Hello, brave new world!");
return 0;
}
Slide 145
Slide 145 text
GIT workflow
Staging and commiting
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# helloworld.c
nothing added to commit but untracked files present (use "git add"
to track)
Slide 146
Slide 146 text
GIT workflow
Staging and commiting
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# helloworld.c
nothing added to commit but untracked files present (use "git add"
to track)
Slide 147
Slide 147 text
GIT workflow
Staging and commiting
$ git add helloworld.c
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
#
# new file: helloworld.c
#
Slide 148
Slide 148 text
GIT workflow
Staging and commiting
$ git add helloworld.c
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
#
# new file: helloworld.c
#
GIT workflow
Staging and commiting
$ emacs helloworld.c
$ cat helloworld.c
/* This is a classic 'hello world' app */
#include
int
main (int argc, char** argv) {
puts("Hello, brave new world!");
return 0;
}
Slide 151
Slide 151 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working
directory)
#
# modified: helloworld.c
#
no changes added to commit (use "git add" and/or "git commit -a")
Slide 152
Slide 152 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working
directory)
#
# modified: helloworld.c
#
no changes added to commit (use "git add" and/or "git commit -a")
Slide 153
Slide 153 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working
directory)
#
# modified: helloworld.c
#
no changes added to commit (use "git add" and/or "git commit -a")
Slide 154
Slide 154 text
GIT workflow
Staging and commiting
$ git diff
--- a/helloworld.c
+++ b/helloworld.c
@@ -1,5 +1,7 @@
/* This is a classic 'hello world' app */
+#include
+
int
main (int argc, char** argv) {
puts("Hello, brave new world!");
Slide 155
Slide 155 text
GIT workflow
Staging and commiting
$ git diff
--- a/helloworld.c
+++ b/helloworld.c
@@ -1,5 +1,7 @@
/* This is a classic 'hello world' app */
+#include
+
int
main (int argc, char** argv) {
puts("Hello, brave new world!");
Slide 156
Slide 156 text
GIT workflow
Staging and commiting
$ git add helloworld.c
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
Slide 157
Slide 157 text
GIT workflow
Staging and commiting
$ emacs helloworld.c
$ cat helloworld.c
/* This is a classic 'hello world' app */
#include
int
main (int argc, char** argv) {
printf("Hello, brave new world!\n");
return 0;
}
Slide 158
Slide 158 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: helloworld.c
#
Slide 159
Slide 159 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: helloworld.c
#
Slide 160
Slide 160 text
GIT workflow
Staging and commiting
$ git diff
--- a/helloworld.c
+++ b/helloworld.c
@@ -4,6 +4,6 @@
int
main (int argc, char** argv) {
- puts("Hello, brave new world!");
+ printf("Hello, brave new world!\n");
return 0;
}
Slide 161
Slide 161 text
GIT workflow
Staging and commiting
$ git diff
--- a/helloworld.c
+++ b/helloworld.c
@@ -4,6 +4,6 @@
int
main (int argc, char** argv) {
- puts("Hello, brave new world!");
+ printf("Hello, brave new world!\n");
return 0;
}
Slide 162
Slide 162 text
WTF?
Slide 163
Slide 163 text
GIT workflow
Staging and commiting
Working directory
Index
Repository
Slide 164
Slide 164 text
GIT workflow
Staging and commiting
Working directory
Index
Repository
git add
Slide 165
Slide 165 text
GIT workflow
Staging and commiting
Working directory
Index
Repository
git add
git commit
Slide 166
Slide 166 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: helloworld.c
#
Slide 167
Slide 167 text
GIT workflow
Staging and commiting
$ git status
# On branch master
# Changes that are staged:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
# Changes that are not staged:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: helloworld.c
#
Slide 168
Slide 168 text
GIT workflow
Staging and commiting
Staged
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: helloworld.c
#
Slide 169
Slide 169 text
GIT workflow
Staging and commiting
Not staged
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: helloworld.c
#
Slide 170
Slide 170 text
GIT workflow
Staging and commiting
Please use
git diff --cached
to get expected
output here.
Slide 171
Slide 171 text
GIT workflow
Staging and commiting
You have to stage a file
after you edit it
Slide 172
Slide 172 text
GIT workflow
Staging and commiting
You have to stage a file
after you edit it
Slide 173
Slide 173 text
GIT workflow
Staging and commiting
You have to stage a file
after you edit it
Slide 174
Slide 174 text
GIT workflow
Staging and commiting
$ git commit -a
Hello world of a new generation.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: helloworld.c
#
Slide 175
Slide 175 text
GIT workflow
Staging and commiting
[master 4bbbef9] Hello world of a new generation.
1 files changed, 3 insertions(+), 1 deletions(-)
Slide 176
Slide 176 text
GIT workflow
Staging and commiting
[master 4bbbef9] Hello world of a new generation.
1 files changed, 3 insertions(+), 1 deletions(-)
Slide 177
Slide 177 text
GIT workflow
Staging and commiting
4bbbef9
Slide 178
Slide 178 text
GIT workflow
Staging and commiting
4bbbef94bbbef9b703c8197ec34cb90382c7b8fd5046a9a
GIT workflow
Staging and commiting
4bbbef94bbbef9b703c8197ec34cb90382c7b8fd5046a9a
commit Size
Tree
Parent
Author
Commiter
c4ec5
d8a16
Ivan
Petr
Hello world of a new
generation.
Slide 181
Slide 181 text
GIT workflow
Staging and commiting
4bbbef94bbbef9b703c8197ec34cb90382c7b8fd5046a9a
commit Size
Tree
Parent
Author
Commiter
c4ec5
d8a16
Ivan
Petr
Hello world of a new
generation.
./ c4ec5
helloworld.c c4ec5
Slide 182
Slide 182 text
GIT workflow
Staging and commiting
4bbbef94bbbef9b703c8197ec34cb90382c7b8fd5046a9a
commit Size
Tree
Parent
Author
Commiter
cfbb1
cae87
Ivan
Petr
Initial commit.
commit Size
Tree
Parent
Author
Commiter
c4ec5
d8a16
Ivan
Petr
Hello world of a new
generation.
GIT workflow
Staging and commiting
Repository Index
./
helloworld.c
farewell.c
ccc
cfe
aba
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 188
Slide 188 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 189
Slide 189 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 190
Slide 190 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 191
Slide 191 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
git add
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 192
Slide 192 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 193
Slide 193 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
afa
13a
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 194
Slide 194 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
afa
13a
git commit
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 813
Slide 195
Slide 195 text
GIT workflow
Staging and commiting
Repository Index Working directory
./
helloworld.c
farewell.c
ccc
cfe
aba
./
helloworld.c
farewell.c
afa
13a
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 13a
813 afa ae7
Slide 196
Slide 196 text
GIT workflow
Staging and commiting
Repository Index Working directory
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 13a
813 afa ae7
./
helloworld.c
farewell.c
13a
afa
aba
./
helloworld.c
farewell.c
Slide 197
Slide 197 text
GIT workflow
Staging and commiting
Repository Index Working directory
c1e fa8 135
47b aba a5b
ccc cfe c0d
0aa 17f ffe
9b4 400 13a
813 afa ae7
./
helloworld.c
farewell.c
13a
afa
aba
./
helloworld.c
farewell.c
Slide 198
Slide 198 text
GIT workflow
●
Create your branch
●
Edit files
●
Stage your changes
●
Commit the changes
●
Rebase your branch from master
●
Merge to master
●
Push to central repository
GIT workflow
Rebasing
A1 A2 A3
master
HEAD
branch
A4 A5
A6 A7
A8
Now A6 and A7
commits will be
deleted. Forever.
A9
Slide 223
Slide 223 text
GIT workflow
Rebasing
A1 A2 A3
master
HEAD
branch
A4 A5 A8
You have broken common branch. If you
push it somewhere, it will break other's
ones.
A9
Slide 224
Slide 224 text
GIT workflow
Rebasing
Never rebase
a shared branch,
you idiot!
Slide 225
Slide 225 text
GIT workflow
●
Create your branch
●
Edit files
●
Stage your changes
●
Commit the changes
●
Rebase your branch from master
●
Merge to master
●
Push to central repository
Have you really thought
that GIT have
complicated merges?
Slide 231
Slide 231 text
GIT workflow
●
Create your branch
●
Edit files
●
Stage your changes
●
Commit the changes
●
Rebase your branch from master
●
Merge to master
●
Push to central repository
Slide 232
Slide 232 text
Push and pull
Slide 233
Slide 233 text
GIT workflow
Push and pull
Remote repository
Local repository
A1 A2 A3 A4 A5 A6
A7 A8 A9 A10
A1 A2 A3 A4
A11 A13
master
master
hotfix
feature
HEAD
GIT workflow
Push and pull
Remote repository
Local repository
A1 A2 A3 A4 A5 A6
A7 A8 A9 A10
A1 A2 A3 A4
A11 A13
master
master
hotfix
feature
HEAD
A11 A13
feature
To
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ''
To prevent you from losing history,
Non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull')
before pushing again. See the 'Note about
fast-forwards' section of 'git push —help'
for details.
Slide 249
Slide 249 text
GIT workflow
Push and pull
Remote repository
Local repository
A1 A2 A3 A4 A5 A6
A7 A8 A9 A10
A1 A2 A3 A4
A11 A13
master
master
hotfix
feature
HEAD
A11 A13
feature
To
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ''
To prevent you from losing history,
Non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull')
before pushing again. See the 'Note about
fast-forwards' section of 'git push —help'
for details.
Slide 250
Slide 250 text
GIT workflow
Push and pull
git push is about
fast-forward merges
Slide 251
Slide 251 text
GIT workflow
Push and pull
Always pull before push!
Slide 252
Slide 252 text
GIT workflow
Push and pull
Always pull before
push!
Slide 253
Slide 253 text
GIT workflow
●
Create your branch
●
Edit files
●
Stage your changes
●
Commit the changes
●
Rebase your branch from master
●
Merge to master
●
Push to central repository