Как предотвратить использование автосекретаря с помощью git?

Я пытаюсь объединить локальную ветвь в ведущую ветвь, не имея Git для создания автосекретаря. Я хотел бы "вручную выбрать" то, что я хотел бы объединить в мастер.

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

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

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

Ответ 1

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

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

В окне KDiff3 левая сторона (A) - это ваша локальная ветвь, а правая сторона (B) - ваша текущая ветвь (мастер).
Выберите Merge | Merge Current File в меню (или нажмите яркую ромбовидную иконку с тем же названием).
Затем вам будет показан diff и конфликты (если есть) для каждого файла. И у вас будет возможность выбирать левую или правую сторону (A или B), или и то, и другое, и/или вручную настраивать объединенный файл.

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

Ответ 2

git merge --no-commit --no-ff <local-branch>

делает это.

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

Затем вы можете посмотреть изменения, которые нужно применить, и – в случае, если вы хотите взять их все – примените их с помощью

git commit -a 

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

Ответ 3

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

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

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

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

git diff --name-only <branch1> <branch2> 
git checkout <branch1> -- <paths>

Ответ 4

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

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

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

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

git rebase master topic