Создается новая ветка из master
, мы называем это test
.
Есть несколько разработчиков, которые либо фиксируют, master
либо создают другие ветви, а затем объединяются master
.
Допустим, работа над этим test
занимает несколько дней, и вы хотите постоянно получать test
обновления с коммитами внутри master
.
Я бы сделал git pull origin master
из test
.
Вопрос 1: это правильный подход? Другие разработчики могли бы легко работать с теми же файлами, что и я.
Моя работа test
завершена, и я готов объединить ее с master
. Вот два способа, о которых я могу думать:
A:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
Я не использую, --rebase
потому что, насколько я понимаю, rebase получит изменения master
и поставит мои поверх этого, следовательно, может перезаписать изменения, сделанные другими людьми.
Вопрос 2: Какой из этих двух методов является правильным? Какая там разница?
Цель всего этого состоит в том, чтобы держать мою test
ветку в курсе происходящих событий, master
и позже я смогу объединить их в master
надежде сохранить временную шкалу как можно более линейной.
Ответы:
Как бы я это сделал
Если у меня есть локальная ветвь с удаленной, я не чувствую себя комфортно, объединяя другие ветви, кроме этой, с удаленной. Кроме того, я не буду продвигать свои изменения, пока я не буду доволен тем, что я хочу подтолкнуть, а также я вообще не буду продвигать вещи, которые предназначены только для меня и моего локального хранилища. По твоему описанию кажется, что
test
это только для тебя? Так что нет причин публиковать его.git всегда старается уважать ваши и чужие изменения, и так будет
--rebase
. Я не думаю, что могу объяснить это должным образом, поэтому взгляните на книгу по Git - Rebasing или git-ready: введение в ребазинг для небольшого описания. Это довольно крутая особенностьисточник
git merge test
дает мнеfatal: 'test' does not point to a commit
. Я должен искатьgit log
точку фиксации в тестовой ветке, переключиться обратно в главную ветвь и затем сделатьgit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
должна существовать. Конечно, вы можете использовать хеш коммита, но обычно проще использовать имя ветки. Внутренне он просто получает хешHEAD
ветки.Это очень практичный вопрос, но все ответы выше не практичны.
подобно
Этот подход имеет две проблемы :
Это небезопасно, потому что мы не знаем, есть ли какие-либо конфликты между тестовой ветвью и главной ветвью.
Это "сжало бы" все тестовые коммиты в один коммит слияния на master; то есть в основной ветке, мы не можем видеть все журналы изменений тестовой ветви.
Поэтому, когда мы подозреваем, что возникнут некоторые конфликты, мы можем выполнить следующие операции git:
Тестируйте
merge
раньшеcommit
, избегайте ускоренной фиксации--no-ff
,Если возникает конфликт, мы можем запустить,
git status
чтобы проверить детали о конфликтах и попытаться решитьРаз мы решаем конфликты или, если нет конфликта, мы
commit
иpush
ониНо этот путь утратит историю изменений, записанную в тестовой ветке, и это затруднит понимание главной веткой главной ветки для других разработчиков.
Поэтому лучший метод - использовать
rebase
вместоmerge
(предположим, когда за это время мы разрешили конфликты ветвей).Ниже приведен один простой пример, для продвинутых операций, пожалуйста, обратитесь к http://git-scm.com/book/en/v2/Git-Branching-Rebasing.
Да, когда вы сделали верх, все коммиты ветки Test будут перенесены на верх ветки Master. Основным преимуществом перебазирования является то, что вы получаете линейную и намного более чистую историю проекта.
Единственное, чего вам следует избегать: никогда не используйте
rebase
в публичной ветке, как master ветка.Никогда не выполняйте операции, подобные следующим:
Подробности для https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing.
приложение:
источник
Ни перебазирование, ни слияние не должны перезаписывать чьи-либо изменения (если вы не решите сделать это при разрешении конфликта).
Обычный подход при разработке
Когда вы будете готовы вернуться к мастеру,
Если вы беспокоитесь о том, чтобы что-то сломать в процессе слияния,
git merge --abort
это для вас.Использовать толчок, а затем тянуть как средство слияния глупо. Я также не уверен, почему вы продвигаете тест на происхождение.
источник
git stash
для.Сначала я бы сделал ветвь, которая должна быть объединена, максимально чистой. Запустите свои тесты, убедитесь, что состояние соответствует желаемому. Убери новых коммитов с помощью git squash .
Помимо ответа KingCrunches , я предлагаю использовать
Вы могли сделать много коммитов в другой ветке, которая должна быть только одна коммит в основной ветке. Чтобы сохранить историю коммитов настолько чистой, насколько это возможно, вы можете сжать все свои коммиты из тестовой ветки в один коммит в основной ветке (см. Также: Git: сквошить или не сквошить? ). Затем вы также можете переписать сообщение коммита в нечто очень выразительное. Что-то, что легко читать и понимать, не копаясь в коде.
редактировать: вы можете быть заинтересованы в
Так что на GitHub, я в конечном итоге сделать следующее для функциональной ветви
mybranch
:Получить последнюю версию от происхождения
Найдите базовый хеш слияния:
Теперь убедитесь, что только первое
pick
, остальноеs
:Затем выберите очень хорошее сообщение коммита и нажмите на GitHub. Сделайте запрос на извлечение.
После объединения запроса на удаление вы можете удалить его локально:
и на GitHub
источник
Старый поток, но я не нашел свой способ сделать это. Это может быть полезно для тех, кто работает с rebase и хочет объединить все коммиты из ветви (feature) поверх master. Если на пути возникнет конфликт, вы можете разрешить его для каждого коммита. Вы сохраняете полный контроль над процессом и можете прервать его в любое время.
Получить Мастер и Филиал в актуальном состоянии:
Слияние веток поверх мастера:
Необязательно: Если вы столкнетесь с конфликтами во время перебазирования:
Сначала разрешите конфликт в файле. Затем:
Нажмите на ваш перебазированный филиал
Теперь у вас есть два варианта:
Выполнено.
источник
Это рабочий процесс, который я использую на работе в команде. Сценарий такой, как вы описали. Во-первых, когда я
test
заканчиваю работу, я делаю ребаз с мастером, чтобы добавить все, что было добавлено к мастеру за время работы надtest
веткой.git pull -r upstream master
Это подтянет изменения к мастеру, так как вы разветвили
test
ветвь и применили их, а затем примените сделанные вами изменения, чтобы проверить «поверх» текущего состояния мастера. Здесь могут возникнуть конфликты, если другие люди внесли изменения в те же файлы, которые вы редактировали в тесте. Если они есть, вам придется исправить их вручную и зафиксировать. Как только вы это сделаете, вам будет удобно переключиться на основную ветку и объединитьсяtest
без проблем.источник
Если после слияния файл был изменен, то при слиянии произойдет ошибка «Разрешить конфликт».
Итак, вам нужно сначала разрешить все ваши конфликты, затем вы должны снова зафиксировать все ваши изменения и затем нажать
Это лучше делать тем, кто внес изменения в тестовую ветку, потому что он знал, какие изменения он сделал.
источник
Я бы использовал метод rebase. Главным образом потому, что он идеально отражает ваш случай семантически, т.е. то, что вы хотите сделать, это обновить состояние вашей текущей ветви и «притвориться», как будто оно основано на последней версии.
Итак, даже не проверяя
master
, я бы:Конечно, просто выборка из источника не обновляет ваше локальное состояние
master
(поскольку оно не выполняет слияние), но это совершенно нормально для нашей цели - мы хотим избежать переключения, ради экономии времени.источник
Ответ @ KingCrunch должен работать во многих случаях. Одна из проблем, которая может возникнуть, это то, что вы находитесь на другой машине, которой необходимо извлечь последние данные из теста. Итак, я рекомендую сначала потянуть тест. Редакция выглядит так:
источник
Вы должны проверить ветку, чтобы вытащить, так как вытащить означает слияние с мастером, и вам нужно рабочее дерево для слияния.
Нет необходимости проверять сначала; rebase правильно делает с двумя аргументами
git push по умолчанию выталкивает все ветки, которые существуют здесь и на удаленном
источник
Поскольку заголовок гласит «Лучший способ», я думаю, что это хорошая идея, чтобы рассмотреть стратегию слияния терпения .
От: https://git-scm.com/docs/merge-strategies
Применение:
Git Alias
Для этого я всегда использую псевдоним, например, запускаю один раз:
Теперь вы можете сделать:
источник
Это от GitLab: просто следуйте инструкциям:
источник
Я отвечу в соответствии с разработкой и особенностями веток,
если вы находитесь в функциональной ветке и вам нужно обновить ее с помощью команд разработки, используйте следующие команды: git checkoutvelop git pull git checkout feature / xyz git merge development
Теперь ваша функция обновляется с разработкой, вы можете нажать ваши изменения.
источник