it-swarm.com.ru

git pull от мастера в ветку разработки

У меня есть ветка с именем dmgr2 (разработка), и я хочу извлечь из основной ветки (живой сайт) и включить все изменения в мою ветку разработки. Есть лучший способ сделать это? Вот что я планировал сделать после внесения изменений:

git checkout dmgr2
git pull Origin master

это должно потянуть живые изменения в мою ветку разработки, или я ошибаюсь?

352
Matthew Colley

Шаги, которые вы перечислили, будут работать, но есть более длинный путь, который дает вам больше возможностей:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch Origin        # gets you up to date with Origin
git merge Origin/master

Команда fetch может быть выполнена в любой момент до merge, то есть вы можете поменять местами порядок извлечения и извлечения, потому что fetch просто переходит к указанному удаленному (Origin) и говорит ему: «дай мне все, что у тебя есть, что Я не ", т. Е. Все фиксирует на всех ветвях. Они копируются в ваш репозиторий, но с именем Origin/branch для любой ветви с именем branch на удаленном компьютере.

На этом этапе вы можете использовать любое средство просмотра (git log, gitk и т.д.), Чтобы увидеть «что у них есть», чего нет у вас, и наоборот. Иногда это полезно только для Warm Fuzzy Feelings («ах, да, это на самом деле то, что я хочу»), а иногда это полезно для полного изменения стратегии («ааа, я пока не хочу ЭТОГО»).

Наконец, команда merge берет данный коммит, который вы можете назвать как Origin/master, и делает все возможное, чтобы внести этот коммит и его предков в любую ветвь, в которой вы находитесь, когда запускаете merge. Вы можете вставить --no-ff или --ff-only, чтобы предотвратить ускоренную перемотку вперед, или объединить, только если результат - ускоренная перемотка вперед, если хотите.

Когда вы используете последовательность:

git checkout dmgr2
git pull Origin master

команда pull указывает git запустить git fetch, а затем моральный эквивалент git merge Origin/master. Так что это почти то же самое, что делать два шага вручную, но есть некоторые тонкие различия, которые, вероятно, не слишком касаются вас. (В частности, шаг fetch, выполняемый pull, переносит only Origin/master и не обновляет ссылку в вашем репо:1 любые новые коммиты упоминаются только по специальной ссылке FETCH_HEAD.)

Если вы используете более явный git fetch Origin (затем опционально просматриваете), а затем git merge Origin/master последовательность, вы также можете привести свою локальную master в актуальное состояние с удаленным устройством, при этом только одна fetch запускается по сети:

git fetch Origin
git checkout master
git merge --ff-only Origin/master
git checkout dmgr2
git merge --no-ff Origin/master

например.


1Эта вторая часть была изменена - я говорю «исправлено» - в git 1.8.4, который теперь обновляет ссылки на «удаленные ветви» оппортунистически. (Как было сказано в примечаниях к выпуску, это было обдуманное решение о дизайне, чтобы пропустить обновление, но оказалось, что все больше людей предпочитают его обновлять git. Если вы хотите использовать старую удаленную ветвь SHA-1, по умолчанию она сохраняется в и, таким образом, могут быть восстановлены из reflog. Это также позволяет использовать новую функцию git 1.9/2.0 для поиска исходных версий.)

518
torek

Ситуация : Работаю в моей локальной ветке, но я люблю постоянно обновлять ветку разработки с именем dev.

Решение : Обычно я предпочитаю делать:

git fetch
git rebase Origin/dev
6
greenridinghood

Сценарий

У меня есть обновление master и обновление моей ветки, я хочу, чтобы моя ветка отслеживала master с перебазированием, чтобы правильно отслеживать всю историю, давайте назовем мою ветку Mybranch

Решение

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git Push -f Origin Mybranch
  • необходимо разрешить все конфликты с помощью git mergetool &, git rebase --continue, git rebase --skip, git add -u, в зависимости от ситуации и подсказок git, пока все не будет решено

(исправление до последней стадии, любезно предоставленное Цаи Коэном, с помощью «-f» заставляет git «обновлять историю» на сервере)

теперь ветвь должна быть выровнена с master и перебазирована, также с удаленным обновлением, поэтому в git log нет «позади» или «forward», просто нужно удалить все локальные конфликтные файлы * .orig, чтобы папка была «чистой»

0
user10556443