Подтвердить что ты не робот

Git Интерактивное слияние?

У меня есть две ветки с одним и тем же файлом (если вы хотите, чтобы это был файл .sql), и я хочу, чтобы интерактивно объединить его.

В значительной степени я хочу открыть программу diff, как я делаю, когда есть конфликт (или командная строка), и выберите, какие строки идут туда.

Есть ли способ сделать это?

4b9b3361

Ответ 1

Да, но в основном это будет сделано вручную. Вы скажете Git, что вы объединяете две соответствующие ветки, но не должны пытаться зафиксировать результат самостоятельно (отредактировано для добавления: или перемотка вперед, если он считает, что слияние тривиально):

git merge --no-commit --no-ff branch-to-merge

Затем вы спросите Git для файла, как он появился в двух ветвях:

git show HEAD:filename >filename.HEAD
git show branch-to-merge:filename >filename.branch

и их базы слияния,

git show `git merge-base HEAD branch-to-merge`:filename  >filename.base

Вы объедините их, используя любой инструмент, который вы хотите (например)

meld filename.{HEAD,branch,base}

вы выполните это (git add filename), а затем скопируйте слияние (git commit).

Ответ 2

Самый простой способ - сделать git merge <other_branch затем git mergetool для графического разрешения конфликтов. Смотрите # 10935226 как настроить mergetool.

Суть в том, что ваш измененный файл может быстро слиться с более старым. Тогда вы должны стать немного умнее.

Новелократ дает отличный способ копнуть немного глубже, но вам часто приходится менять начальную команду на git merge --no-commit --no-ff <other_branch> потому что --no-commit действительно означает "не фиксировать" слияние... если только это не быстрое слияние ". Это немного жалко для многих людей, пытающихся делать именно то, что вы хотите.

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

Ответ 3

Согласно этой сущности, где temp может быть существующей веткой.

https://gist.github.com/katylava/564416


По мастеру:

git checkout -b temp

По времени:

git merge --no-commit --no-ff refactor

... который все ставит, так что:

git reset HEAD

Затем начните добавлять нужные вам кусочки:

git add --interactive

Ответ 4

От ветки, к которой вы хотите объединиться:

git checkout -p branch_to_merge --

Это не будет проверять branch_to_merge, но позволит вам интерактивно добавлять ханки из патча (diff).

http://git-scm.com/docs/git-checkout

Ответ 5

Вы можете просто использовать WinMerge, DiffMerge или любой доступный инструмент разграничения/слияния для выполнения работы вручную. Если вы хотите подключить его к "git difftool", вы можете искать в Интернете, чтобы найти способы заставить эти инструменты работать с git.

Ответ 6

Лучший способ сделать это:

  1. Оформите ветку с вашими изменениями
  2. Создайте новую ветку с этой точки
  3. Сбросьте в вашей новой ветке коммит, с которым вы хотите сравнить и на чем основываться. Сброс будет "смешанным" сбросом по умолчанию, что означает, что он не изменит "рабочее дерево", то есть фактические файлы кода
  4. На этом этапе мой текстовый редактор (VSCode) показывает мне, что отличается между моими текущими файлами и коммитом, к которому я перезагружен. Я могу отредактировать код, чтобы выбрать, какие строки я хочу зафиксировать. Это позволяет мне видеть все изменения в моей ветке и подтверждать каждую строку кода, которую я буду фиксировать. Это полезно, например, до объединения моих изменений в производство.