Как предотвратить автоматическое слияние с помощью Git? - PullRequest
55 голосов
/ 08 марта 2011

Я пытаюсь объединить локальную ветку с главной веткой, не имея Git для автоматического слияния.Я хотел бы «выбрать вручную» то, что я хотел бы объединить с мастером.

Когда я использую команду diff в Git, я могу различать и выбирать то, что я хочу добавить в ветку master.Но затем, когда я сделаю слияние, я потеряю то, что выбрал ранее, потому что Git выполнит автоматическое слияние.Я могу зафиксировать изменения в master до слияния, но это кажется неестественным.

И mergetool Git доступен только при наличии конфликтов слияния.Но если Git выполняет автоматическое слияние, то обычно нет конфликтов, поэтому я не могу запустить команду mergetool.

Обновление:

Я начинаю думать,Я пытаюсь выполнить это плохая практика или просто невозможно.То есть, чтобы объединить ветку темы и сделать так, чтобы она объединяла то, что мне нужно от различий.И, кроме того, чтобы это отразилось на истории.Во всяком случае, вопрос, который я разместил, всплыл при экспериментировании с Git.

Ответы [ 4 ]

74 голосов
/ 28 ноября 2013

Вы пытаетесь обойти Git от участия в процессе слияния и вручную выбирать каждую строку каждого измененного файла, который должен быть объединен.Это не то же самое, что git cherry-pick.git merge --no-commit и т. Д. Тоже не помогут.Вам нужно будет сделать:

$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD

В окне KDiff3 слева (A) находится ваша локальная ветвь иправая часть (B) - ваша текущая ветвь (master) .

Выберите Merge | Merge Current File из меню (или нажмите красочный значок в форме ромба с тем же названием).

Затем вам будут показаны различия и конфликты (если таковые имеются) для каждого файла.И у вас будет возможность выбрать левую или правую сторону (A или B) или оба, и / или вручную настроить объединенный файл.

В другой заметке что-то говорит мне, что у вас естьнекоторые большие проблемы с вашим рабочим процессом.

17 голосов
/ 08 марта 2011
git merge --no-commit --no-ff <local-branch>

делает это.

Когда вы его выполнили, изменения из local-branch применяются, но еще не подготовлены.

Затем вы можете посмотреть изменения, которые нужно применить, и & ndash; в случае, если вы хотите взять их все & ndash; примените их с

git commit -a 

В противном случае выберите файлы, которые нужно взять, поставьте их на git add и, наконец, зафиксируйте их на git commit Восстановите ненужные файлы затем с помощью git checkout -- filename.

5 голосов
/ 08 октября 2015

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

Возможно, вы захотите посмотреть, используя собственный драйвер слияния. Эта страница описывает, как это сделать.

Git - как вызвать конфликт слияния и слияние вручную для выбранного файла

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

git diff --name-only <branch1> <branch2> 
git checkout <branch1> -- <paths>
0 голосов
/ 08 марта 2011

Я думаю, что вы хотите вишня отдельные изменения:

git checkout master
git log --reverse --oneline topic ^master

и затем вызывайте git cherry-pick для каждого коммита, который вы хотите иметь в основной ветке.

Если оставшиеся изменения в ветке темы должны быть сохранены, вы также можете перебазировать эту ветку поверх нового мастера:

git rebase master topic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...