$git push origin master
...
To john@githost:simplegit.git
fbff5bc..72bbc59 master -> master
В результате история коммитов у Джона выглядит так:

Рисунок 7. История коммитов у Джона после отправки на origin сервер.
Тем временем Джессика продолжала работать в тематической ветке под названием issue54 и сделала три коммита в ней. Она ещё не получила изменения Джона, поэтому история коммитов у неё выглядит следующим образом:

Рисунок 8. Тематическая ветка Джессики.
Для синхронизации с Джоном Джессика получает изменения:
#Компьютер Джессики
$git fetch origin
...
From jessica@githost:simplegit
fbff5bc..72bbc59 master -> origin/master
Это приводит к получению изменений, отправленных Джоном в репозиторий. Теперь, история коммитов у Джессики выглядит так:

Рисунок 9. История коммитов Джессики после получения изменений Джона.
Джессика считает, что её тематическая ветка готова, но так же хочет знать какие изменения следует слить со своей работой перед отправкой на сервер. Для прояснения ситуации он выполняет команду git log:
$git log --no-merges issue54..origin/master
commit 738ee872852dfaa9d6634e0dea7a324040193016
Author: John Smith
Date: Fri May 29 16:01:27 2009 -0700
removed invalid default value
issue54..origin/master - это синтаксис фильтра, который указывает Git отображать только список коммитов, которые существуют в последней ветке (в данном случае origin/master), но отсутствуют в первой (в данном случае issue54). Более детально этот синтаксис рассматривается в главе Диапазоны коммитов.
В данном случае, в выводе команды мы видим только один коммит, сделанный Джоном и ещё не слитый Джессикой. Если она сольёт origin/master, то это будет единственный коммит, который изменит локальное состояние.
Теперь, Джессика может слить изменения тематической ветки и изменения Джона (origin/master) в свою локальную ветку master, а затем отправить её на сервер. Для начала, следует переключиться на ветку master и слить изменения тематической ветки:
$git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
Обе ветки origin/master и issue54 являются отслеживаемыми, поэтому порядок слияния не важен. Конечный результат будет идентичным вне зависимости от порядка слияния, однако история коммитов будет немного отличаться. Джессика решает слить ветку issue54 первой:
$git merge issue54
Updating fbff5bc..4af4298
Fast forward
README | 1 +
lib/simplegit.rb | 6 +++++-
2 files changed, 6 insertions(+), 1 deletions(-)
Проблем не возникает; как можно заметить, это простое перемещение вперед. Теперь Джессика сливает изменения Джона (origin/master):
$git merge origin/master
Auto-merging lib/simplegit.rb
Merge made by recursive.
lib/simplegit.rb | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Слияние прошло чисто и теперь история коммитов у Джессики выглядит следующим образом:

Рисунок 10. История коммитов Джессики после слияния изменений Джона.
Теперь Джессика может отправить свою ветку master в origin/master, при условии что Джон больше не отправлял изменений:
$git push origin master
...
To jessica@githost:simplegit.git
72bbc59..8059c15 master -> master
Каждый разработчик сделал коммиты несколько раз и успешно слил изменения другого.

Рисунок 11. История коммитов Джессики после отправки на сервер.
Это один из самых простых рабочих процессов. В течение некоторого времени вы работаете в тематической ветке, а затем сливаете изменения в ветку master когда всё готово. Чтобы поделиться проделанной работой, вы сливаете её в вашу ветку master, затем получаете и сливаете изменения из ветки origin/master если таковые имеются, и наконец, отправляете все изменения в ветку master на сервере. В общем виде последовательность выглядит так:

Рисунок 12. Общий вид последовательности событий в рабочем процессе для нескольких разработчиков.
Частная управляемая команда
Читать дальше