Вы хотите, чтобы ваш центральный репозиторий был пустым. Скажем, машина, на которой она живет, называется static
:
$ ssh static git init --bare /git/myproject.git
Этот голый репозиторий является центральной точкой встречи: он предназначен для того, чтобы подталкивать, а не развивать.
Делайте ваши разработки на клонах центрального хранилища:
$ cd ~/src
$ git clone static:/git/myproject.git
Даже если вы находитесь на static
, работайте в клоне:
$ git clone /git/myproject.git
Хотя вы единственный работаете с этим хранилищем, привыкните выполнять свою работу над тем, что в документации git называется ветками тем. Непосредственным преимуществом этого является то, что он сохраняет чистый мастер, то есть вы всегда можете вытащить из своей центральной главной ветки в мастер вашего текущего локального репозитория без слияния.
Например:
$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."
Это может показаться не таким уж большим делом, но дает вам свободу оставить проект, представленный на этой ветке, в частично приготовленном состоянии, или, если ваша крутая идея окажется провалом, вы можете легко выбросить эту ветку без нарушая все остальное в вашем проекте, которое уже работает в других ветках. Бесконечные бесплатные муллиганы!
Может быть, вы идете домой в ту ночь и добавили новую функцию. На следующее утро ты
$ git checkout master
$ git pull
обновить ваш локальный мастер, чтобы отразить, что находится в центральном хранилище.
Но теперь скажите, что вы исправили ошибку foo и готовы включить ее в основную ветку. Сначала вы хотите интегрировать его с изменениями прошлой ночи:
$ git checkout fix-bug-in-foo
$ git rebase master
Команда rebase
заставляет ваш репозиторий выглядеть так, как будто вы исправили ошибку foo поверх новой функции прошлой ночи. (Это похоже на svn update
, но более гибкое и мощное.)
Теперь, чтобы получить это в вашем центральном мастере:
$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master
Мы относились к мастеру как к особенному, но это только условно. Вы можете так же легко делиться работой над различными ветками разных репозиториев через репозиторий git на static
.