У меня есть ветка с именем dmgr2 (разработка), и я хочу извлечь из основной ветки (живой сайт) и включить все изменения в мою ветку разработки. Есть лучший способ сделать это? вот что я планировал сделать после внесения изменений:
git checkout dmgr2
git pull origin master
это должно потянуть живые изменения в мою ветку разработки, или я ошибаюсь?
dev
ветку с помощьюgit checkout dev
. Потомgit pull --rebase origin master
. Если вам повезет, конфликтов не будет, и у dev будут последние изменения от master.Ответы:
Шаги, которые вы перечислили, будут работать, но есть более длинный путь, который дает вам больше возможностей:
fetch
Команда может быть сделано в любой момент до того , какmerge
, например, вы можете поменять порядок выборки и контроль, потому чтоfetch
просто переходит к имени удаленного (origin
) и говорит ему: «Дай мне все , что вы есть , что я не ", т. е. все коммиты на всех ветках. Они копируются в ваш репозиторий, но именуютсяorigin/branch
для любой ветви, названнойbranch
на удаленном компьютере.На этом этапе вы можете использовать любого зрителя (
git log
,gitk
и т. Д.), Чтобы увидеть «что у них есть», чего нет у вас, и наоборот. Иногда это полезно только для Warm Fuzzy Feelings («ах, да, это на самом деле то, что я хочу»), а иногда это полезно для полного изменения стратегии («ааа, я пока не хочу ЭТОГО»).Наконец,
merge
команда берет данный коммит, который вы можете назвать какorigin/master
, и делает все возможное, чтобы ввести этот коммит и его предков, в любую ветвь, в которой вы находитесь, когда вы запускаетеmerge
. Вы можете вставить--no-ff
или--ff-only
предотвратить ускоренную перемотку вперед или объединить, только если результат ускоренной перемотки вперед, если хотите.Когда вы используете последовательность:
то
pull
команда инструктирует мерзавец для запускаgit fetch
, а затем моральный эквивалентgit merge origin/master
. Так что это почти то же самое, что делать два шага вручную, но есть некоторые тонкие различия, которые, вероятно, не слишком касаются вас. (В частности,fetch
шаг, выполняемый by,pull
переносит толькоorigin/master
, и он не обновляет ссылку в вашем репо: 1 любые новые коммиты заканчиваютсяFETCH_HEAD
ссылками только по специальной ссылке.)Если вы используете более явный
git fetch origin
(затем, при желании, посмотрите вокруг), а затемgit merge origin/master
последовательность, вы также можете обновить свою локальнуюmaster
версию с помощью удаленного устройства, выполнив только одинfetch
запуск по сети:например.
1 Эта вторая часть была изменена - я говорю «исправлено» - в git 1.8.4, который теперь обновляет ссылки на «удаленные ветви» оппортунистически. (Как было отмечено в примечаниях к выпуску, это было обдуманное решение о дизайне, чтобы пропустить обновление, но оказалось, что все больше людей предпочитают его обновлять. Если вы хотите использовать старую удаленную ветвь SHA-1, по умолчанию она сохраняется в и, таким образом, могут быть восстановлены из журнала reflog. Это также позволяет использовать новую функцию git 1.9 / 2.0 для поиска исходных версий.)
источник
git checkout
обычно не является деструктивным и обычно нет причин для отмены agit fetch
, поэтому звучит так, будто вы спрашиваете, как отменить коммит слияния. Ответ такой же, как и для других коммитов: либоgit reset
или, либоgit revert
. Для неопубликованных измененийgit reset
обычно лучший метод; для изменения других уже есть,git revert
может быть лучше, но увидеть советы Торвальдса о возвращаясь слиянием: kernel.org/pub/software/scm/git/docs/howto/...gitk
,git log --graph
с или без--oneline
, и так далее) , и вы можетеgit show
илиgit show -m
слияние совершить, или использованиеgit diff
. Во всех этих случаях вы указываете программу при вводе команды в командной строке.Ситуация : Работа в моем местном филиале, но я люблю постоянно обновлять в ветке разработки с именем
dev
.Решение : Обычно я предпочитаю делать:
источник
Это сработало для меня. Для получения последнего кода от мастера в мою ветку
git rebase origin/master
источник
git fetch origin
сначала.Сценарий :
У меня есть обновление master и обновление моей ветки, я хочу, чтобы моя ветка отслеживала master с перебазированием, чтобы правильно отслеживать всю историю, давайте назовем мою ветку Mybranch
Решение :
(исправление к последнему этапу, любезно предоставленное Цаи Коэном, с помощью «-f» заставляет git «обновлять историю» на сервере)
теперь ветвь должна быть выровнена с master и перебазирована, также с удаленным обновлением, поэтому в git log нет «позади» или «forward», просто нужно удалить все локальные конфликтные файлы * .orig, чтобы папка была «чистой»
источник