Вы можете просмотреть различия с:
git log HEAD..origin/master
до вытягивание (выборка + слияние) (см. Также «Как вы получаете git, всегда вытягивающий из определенной ветви?» )
Когда у вас есть сообщение вроде:
«Ваша ветка и« origin / master »разошлись, # и имеют 1 и 1 разные коммиты соответственно».
, проверьте, нужно ли обновить origin
. Если origin
обновлен, то некоторые коммиты были перенесены в origin
из другого репо, пока вы делали свои коммиты локально.
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
Вы основали коммит C на коммите A, потому что это была последняя работа, которую вы получили из апстрима в то время.
Однако, прежде чем вы попытались вернуться к источнику, кто-то еще нажал коммит B.
История развития разошлась по отдельным путям.
Затем вы можете объединить или перебазировать. Подробнее см. Pro Git: Git Branching - Rebasing .
Слияние
Используйте команду git merge:
$ git merge origin/master
Это указывает Git интегрировать изменения из origin/master
в вашу работу и создать коммит слияния.
Граф истории теперь выглядит так:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
У нового слияния, commit M, есть два родителя, каждый из которых представляет один путь развития, который привел к содержанию, сохраненному в этом коммите.
Обратите внимание, что история M теперь нелинейна.
Rebase
Используйте команду git rebase:
$ git rebase origin/master
Это говорит Git, что нужно воспроизвести коммит C (ваша работа), как если бы вы основали его на коммите B вместо A.
Пользователи CVS и Subversion регулярно обновляют свои локальные изменения в верхней части исходной работы, когда они обновляются перед фиксацией.
Git просто добавляет явное разделение между шагами commit и rebase.
График истории теперь выглядит так:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
Commit C '- это новый коммит, созданный командой git rebase.
Он отличается от C двумя способами:
- У него другая история: B вместо A.
- Его содержание учитывает изменения как в B, так и в C; это то же самое, что и M из примера слияния.
Обратите внимание, что история C 'все еще линейна.
Мы решили (на данный момент) разрешить только линейную историю в cmake.org/cmake.git
.
Этот подход сохраняет рабочий процесс на основе CVS, который использовался ранее, и может облегчить переход.
Попытка вставить C 'в наш репозиторий сработает (при условии, что у вас есть разрешения, и никто не выдвинул их во время перебазировки).
Команда git pull обеспечивает сокращенный способ извлечения из источника и перебазирования локальной работы на нем:
$ git pull --rebase
Это объединяет вышеупомянутые шаги извлечения и перебазирования в одну команду.