Git объединить мастер в ветке функций

Допустим, у нас есть следующая ситуация в git:

  1. Созданный репозиторий:

    mkdir GitTest2
    cd GitTest2
    git init
    
  2. Некоторые изменения в мастере происходят и совершаются.

    echo "On Master" > file
    git commit -a -m "Initial commit"
    
  3. Feature1 разветвлен от мастера, и некоторая работа сделана:

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
    
  4. Тем временем в мастер-коде обнаружена ошибка и установлена ​​ветка хотфикса

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
  5. Ошибка исправлена ​​в ветке исправлений и объединена с мастером (возможно, после запроса на просмотр / проверки кода):

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
  6. Разработка на 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"

Другие вопросы по тегам