$ git clone https://host.com/user/project.git project
Exercise to practice collaborative centralized workflow. On the way to a pull request and code review we will meet and discuss a number of typical pitfalls.
$ git clone https://github.com/annefou/centralized-workflow-exercise.git centralized-workflow-exercise
Instead of using https you can also clone using ssh keys:
This is a representation of what happens when you clone:
remote:
local:
git clone
creates pointers origin/master
and origin/experiment
.origin
refers to where we cloned from, try: git remote -v
.origin
is a shortcut for the full URL.origin/master
and origin/experiment
are read-only pointers.git pull
or git fetch
or git push
.git pull
or git fetch
or git push
require network.$ cd centralized-workflow-exercise
yourusername.txt
In this file share your favourite cooking recipe or haiku or Git trick or whatever.
$ git add yourusername.txt
$ git commit
remote:
local:
$ git push origin master
By “upstream” we mean here the repository which we have cloned. Imagine “upstream” being closer to the main development and your local clone to be “downstream”.
You probably see something like this:
$ git push
To https://github.com/user/repo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/user/repo.git'
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.
It will work only for one participant. Why?
remote:
local:
The natural reflex is now to git pull
first but
what happens if we git pull origin master
?
$ git pull origin master
remote:
local:
Ideas? What happened under the hood? Discuss git fetch
as an alternative to git pull
.
Discuss git pull --rebase
as an alternative to avoid merge commits.
What is the difference between git fetch
and git pull
?
This is equivalent to:
$ git pull origin master
is equivalent to:
$ git fetch origin
$ git merge origin/master
git pull
consists of two operations: a git fetch
followed by a git merge
.git pull origin master
fetches master
from origin
and merges it.git merge
“hidden” in git pull
.git pull
, very careful people first git fetch
and inspect the commits before merging them.$ git pull --rebase origin master
would have produced:
remote:
local:
It will work for one more person.
yourname/somefeature
pointing at your commitFirst find out the hash of your commit, then create a branch “in the past” pointing to that hash:
$ git branch yourname/somefeature [hash]
$ git push origin -u yourname/somefeature
Can we leave out the -u
?
Submit a pull request from your branch towards the master
branch.
Do this through the web interface.
Finally also discuss https://github.com/annefou/centralized-workflow-exercise/network.
Create a local branch somefeature
tracking origin/somefeature
:
$ git checkout -b somefeature origin/somefeature
If there is no local branch somefeature
and there is a remote branch origin/somefeature
, then this is enough:
$ git checkout somefeature
Once we track a remote branch, we can pull from it and push to it:
$ git pull origin somefeature
$ git push origin somefeature
We can also delete remote branches:
$ git push origin --delete somefeature
master
) branch.git clone
copies everything and sets some pointers to remember where the clone came from.
You communicate commits with git fetch
/git pull
and git push
.
All other Git operations are offline - you can work on a plane while your coworker is on vacation in North Korea.
origin
refers to where you cloned from (but you can relocate it).
origin/foo
is a read-only pointer to branch foo
on origin.
origin
pointers only move when you git fetch
/git pull
or git push
.