Git объединить мастер в ветке функций
Допустим, у нас есть следующая ситуация в git:
Созданный репозиторий:
mkdir GitTest2 cd GitTest2 git init
Некоторые изменения в мастере происходят и совершаются.
echo "On Master" > file git commit -a -m "Initial commit"
Feature1 разветвлен от мастера, и некоторая работа сделана:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
Тем временем в мастер-коде обнаружена ошибка и установлена ветка хотфикса
git checkout master git branch hotfix1 git checkout hotfix1
Ошибка исправлена в ветке исправлений и объединена с мастером (возможно, после запроса на просмотр / проверки кода):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
Разработка на feature1 продолжается:
git checkout feature1
Теперь мой вопрос: скажем, мне нужно исправление в моей ветке функций, возможно, потому что там также происходит ошибка. Как я могу достичь этого, не дублируя коммиты в моей ветке функций? Я хочу запретить получение двух новых коммитов в моей ветви функций, которые не имеют отношения к реализации функции. Это особенно важно для меня, если я использую Pull Requests: все эти коммиты также будут включены в Pull Request и должны быть рассмотрены, хотя это уже было сделано (так как исправление уже есть в мастере).
Я не могу сделать git merge master --ff-only
: "fatal: Невозможно выполнить перемотку вперед, прерывание.", но я не уверен, помогло ли это мне.
12 ответов
Вы должны иметь возможность перебазировать свою ветку на master:
git checkout feature1
git rebase master
Управляйте всеми конфликтами, которые возникают. Когда вы доберетесь до коммитов с исправлениями ошибок (уже в master), git скажет, что изменений не было и, возможно, они уже были применены. Затем вы продолжаете ребаз (пропуская коммиты уже в мастере) с
git rebase --skip
Если вы выполняете git log
в вашей ветке функций вы увидите коммит с исправлением ошибок только один раз и в основной части.
Для более подробного обсуждения взгляните на документацию Git на git rebase
( https://git-scm.com/docs/git-rebase), которые охватывают этот конкретный случай использования.
Как объединить основную ветку с функциональной веткой? Легко:
git checkout feature1
git merge master
Здесь нет смысла форсировать слияние в прямом направлении, поскольку это невозможно сделать. Вы зафиксировали как в ветви функций, так и в основной ветви. Быстрая перемотка вперед невозможна.
Посмотрите на Gitflow. Это модель ветвления для git, которой можно следовать, и вы подсознательно уже это сделали. Это также расширение для git, которое добавляет некоторые команды для новых шагов рабочего процесса, которые выполняют действия автоматически, которые в противном случае вам пришлось бы делать вручную.
Итак, что вы сделали прямо в вашем рабочем процессе? У вас есть две ветки для работы, ваша ветка feature1 - это, по сути, ветвь "разработки" в модели gitflow.
Вы создали ветку исправлений из master и объединили ее обратно. И теперь вы застряли.
Модель gitflow просит вас объединить исправление также с веткой devel, которая в вашем случае является "feature1".
Таким образом, реальный ответ будет:
git checkout feature1
git merge --no-ff hotfix1
Это добавляет все изменения, которые были внесены внутри исправления в ветку функций, но ТОЛЬКО эти изменения. Они могут конфликтовать с другими изменениями разработки в ветви, но они не будут конфликтовать с основной веткой, если вы в конце концов вернете ветку функций обратно в главную.
Будьте очень осторожны с перебазированием. Перебазируйте, только если изменения, которые вы сделали, остались локальными для вашего хранилища, например, вы не выдвинули никаких веток в какое-либо другое хранилище. Перебазирование - это отличный инструмент для того, чтобы упорядочить ваши локальные коммиты до того, как вывести их в мир, но потом перебазировка может испортить вещи для начинающих git, таких как вы.
git merge
вы можете выполнить следующие шаги
1. объединить origin/master
ветвь к feature
филиал
# step1: change branch to master, and pull to update all commits
$ git checkout master
$ git pull
# step2: change branch to target, and pull to update commits
$ git checkout feature
$ git pull
# step3: merge master to feature(⚠️ current is feature branch)
$ git merge master
2. объединить feature
ветвь к origin/master
филиал
origin/master
это удаленная главная ветвь, аmaster
это локальная главная ветка
$ git checkout master
$ git pull origin/master
$ git merge feature
$ git push origin/master
Основываясь на этой статье, вы должны:
- создать новую ветку, основанную на новой версии мастера
- объединить вашу старую функциональную ветку в новую
- разрешить конфликт в новой ветви функций
Таким образом, ваша история остается ясной, потому что вам не нужны обратные слияния. И вам не нужно быть очень осторожным, потому что вам не нужен git rebase
Я добавляю свой ответ, похожий на другие, но, возможно, он будет самым быстрым для чтения и реализации.
ПРИМЕЧАНИЕ. В этом случае перебазирование не требуется.
Предположим, у меня есть repo1
и две ветви master
а также dev-user
.
dev-user
ветка сделана в определенном состоянии master
.
Теперь предположим, что оба dev-user
а также master
заранее.
В какой-то момент я хочу dev-user
чтобы получить все коммиты, сделанные в master
.
Как мне это сделать?
git checkout master
git pull
git checkout dev-user
git pull
git merge master
git push
Надеюсь, это поможет кому-то еще в такой же ситуации.
Ответ Зими описывает этот процесс в целом. Вот особенности:
1) Создать и переключиться на новую ветку. Убедитесь, что новая ветвь основана на master
поэтому он будет включать последние исправления.
git checkout master
git branch feature1_new
git checkout feature1_new
# Or, combined into one command:
git checkout -b feature1_new master
2) После переключения на новую ветку, объедините изменения с существующей веткой функций. Это добавит ваши коммиты без дублирования коммитов исправлений.
git merge feature1
3) В новой ветке разрешите все конфликты между вашей функцией и главной веткой.
Готово! Теперь используйте новую ветку, чтобы продолжить развивать свою функцию.
Вот скрипт, который вы можете использовать, чтобы объединить вашу основную ветку с вашей текущей веткой.
Сценарий выполняет следующие действия:
- Переключается на главную ветку
- Тянет мастер ветку
- Переключается обратно на вашу текущую ветку
- Объединяет основную ветку с вашей текущей веткой
Сохраните этот код в виде пакетного файла (.bat) и поместите скрипт в любое место вашего хранилища. Затем нажмите на него, чтобы запустить его, и все готово.
:: This batch file pulls current master and merges into current branch
@echo off
:: Option to use the batch file outside the repo and pass the repo path as an arg
set repoPath=%1
cd %repoPath%
FOR /F "tokens=*" %%g IN ('git rev-parse --abbrev-ref HEAD') do (SET currentBranch=%%g)
echo current branch is %currentBranch%
echo switching to master
git checkout master
echo.
echo pulling origin master
git pull origin master
echo.
echo switching back to %currentBranch%
git checkout %currentBranch%
echo.
echo attemting merge master into %currentBranch%
git merge master
echo.
echo script finished successfully
PAUSE
Возможно, вам удастся сделать "черри-пик", чтобы получить точные коммиты, которые вам нужны, в вашу ветку функций.
Сделать git checkout hotfix1
чтобы попасть на ветку hotfix1. Тогда сделай git log
получить хеш SHA1 (большая последовательность случайных букв и цифр, однозначно идентифицирующая коммит) рассматриваемого коммита. Скопируйте это (или первые 10 или около того символов).
Затем, git checkout feature1
чтобы вернуться в вашу ветку функций.
Затем, git cherry-pick <the SHA1 hash that you just copied>
Это перетянет этот коммит и только этот коммит в вашу ветку возможностей. Это изменение будет в ветке - вы просто "выберете" его. Затем возобновите работу, отредактируйте, зафиксируйте, нажмите и т. Д. До глубины души.
Когда, в конце концов, вы выполняете другое слияние из одной ветви в свою функциональную ветвь (или наоборот), git распознает, что вы уже слились в этом конкретном коммите, знает, что не нужно делать это снова, и просто "пропустить" это.
В дополнение к другим ответам, поскольку эти команды повторяются, мы можем сделать это подряд (учитывая, что мы находимся в ветке функций):
git checkout master && git pull && git checkout - && git merge -
Или добавьте их в псевдоним:
alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"
Я нахожусь в ветке функций и делал рефакторинг. Сейчас я хочу объединить основные изменения в свою ветку функций. Я сильно отстал. Обратите внимание: я не хочу переносить основные изменения в свой локальный сервер, потому что в моей функциональной ветке модули перемещены из одного места в другое. Я обнаружил, что просто выполнение без тяги ниже не работает. там написано: "Уже обновлено".
//below does not get the latest from remote master to my local feature branch without git pull
git checkout master
git fetch
git checkout my-feature-branch
git merge master
Это ниже работает, обратите внимание на использование git merge origin / master:
git checkout master
git fetch
git checkout my-feature-branch
git merge origin/master
In Eclipse -
1) Основная ветка кассы
Git Repositories ->Click on your repository -> click on Local ->double click master branch
->Click on yes for check out
2) Вытяните главную ветку
Right click on project ->click on Team -> Click on Pull
3) Оформить заказ на свою ветку функций (выполните те же шаги, что и в 1 пункте)
4) Слить мастер с функцией
Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on merge ->Click on Local ->Click on Master ->Click on Merge.
5) Теперь вы получите все изменения ветки Master в ветке функций. Удалите конфликт, если он есть.
For conflict if any exists ,follow this -
Changes mentioned as Head(<<<<<< HEAD) is your change, Changes mentioned in branch(>>>>>>> branch) is other person change, you can update file accordingly.
Примечание. Вам необходимо добавить в индекс файлы конфликтов.
6) зафиксируйте и отправьте свои изменения в функциональную ветку.
Right click on project ->click on Team -> Click on commit -> Commit and Push.
ИЛИ
Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on Push Branch ->Preview ->Push
Чтобы начать управление версиями больших файлов, вам нужно всего лишь выполнить следующие простые шаги: Загрузите и установите расширения командной строки Git LFS для вашей ОС. Настройте Git LFS для вашей учетной записи:git lfs install 3. Настройте Git LFS для отслеживания ваших больших файлов:git lfs track "*.xyz"