Что произойдет, когда я 'git pull --rebase origin development' из ветви функций?
Допустим, у меня есть ветвь функции под названием FeatureA
и он не синхронизирован с (удаленным) development
на котором это основано. Обычно я бы перебазировал свою ветку, позвонив git rebase development
(после синхронизации моего локального развития с origin/development
естественно).
Сегодня я делаю это по-другому и звоню git pull --rebase origin development
вместо этого из моей ветки Теперь, в чем разница?
2 ответа
git pull --rebase origin development
это ярлык для этих команд:
git fetch origin development
git rebase origin/development
То есть выборка origin/development
а затем перебазировать текущую ветку поверх нее.
ОБНОВИТЬ
Как отметил torek:
Да, за исключением того, что версия fetch с двумя аргументами не обновляет источник / разработку в git 1.8.3 или более ранней версии. (Результат ребазирования тот же, но происхождение / развитие не движется.)
Короткая версия: если ребаз идет хорошо, работает нормально. Если нет, он все еще работает так, как должен, просто может быть немного запутанным в графическом средстве просмотра.
Как всегда, git pull
в основном git fetch
а затем... ну, в этом случае, git rebase
скорее, чем git merge
, Так:
- извлечь из
origin
- получить только
development
ветвь и положить это вFETCH_HEAD
- тогда вместо
git merge <commit-ID-from-FETCH_HEAD>
использоватьgit rebase
с этим идентификатором
Итак, предположим, что граф коммитов в вашем локальном дереве выглядит так (предположим, что вы запустили git fetch
в какой-то момент, который обновил origin/development
со своими коммитами E
а также F
):
C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
И давайте далее предположим, что на origin
есть еще один коммит теперь в их ветке с именем development
, fetch
- из исходного шага подберем и сделаем FETCH_HEAD
указать на это, так что давайте нарисуем его как узел G
:
C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
(Если ваш мерзавец достаточно новый, 1.8.4 или позже, origin/development
также будет обновлено в это время, чтобы указать на узел G
, Если нет, ваша локальная копия их development
хранится в вашем origin/development
отстает. Это не будет иметь большого значения для перебазирования, это просто изменит то, как вы увидите результаты в git log --graph
просмотр или графический просмотрщик дерева коммитов.)
Теперь rebase
скопирует ваш FeatureA
фиксирует в обычном методе для rebase, и сделать FeatureA
указать на копии, отказавшись от оригинальных коммитов. Мы позвоним перебазированным C'
а также D'
:
C - D [abandoned]
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
\
C' - D' <-- FeatureA
Если вы управляете равниной git fetch
в этот момент, или если у вас есть достаточно новый Git, чтобы origin/development
переехал; и если мы отбросим "заброшенные" части и упростим чертеж, он станет:
A - B <-- development
\
E - F - G <-- origin/development
\
C' - D' <-- FeatureA
Если вы переместитесь вперед, объедините ваш локальный ярлык development
соответствовать origin/development
, это еще проще нарисовать (сбросьте излом с B на E и поместите оба development
а также origin/development
справа от стрелки, указывающей на G
).