Git говорит мне, что я слияние конфликта, но также говорит мне, что никакие файлы не нуждаются в слиянии

Я совершил некоторые изменения в ветке new.

Я выхожу на master.

Когда я попытался слить:

$ git merge new
Auto-merging js/site.js
CONFLICT (content): Merge conflict in js/site.js
Automatic merge failed; fix conflicts and then commit the result.

Итак, я установил kdiff3 и настроил свои файлы конфигурации, и когда я попытался использовать mergetools, я получил:

$ git mergetool kdiff3
No files need merging

Я запускал diff, и он выводил это:

diff --cc js/site.js
index 8c17d62,7955b13..0000000
--- a/js/site.js
+++ b/js/site.js
@@@ -72,4 -81,18 +81,22 @@@ function doSmallScreen()

  $(document).ready(function () {
      calculateScreen();
- });
++<<<<<<< HEAD
++});
++=======
+     $(window).resize(function () {
+         delay(function () {
+             calculateScreen();
+         }, 500);
+     });
+ });
+
+
+ var delay = (function () {
+     var timer = 0;
+     return function (callback, ms) {
+         clearTimeout(timer);
+         timer = setTimeout(callback, ms);
+     };
 -})();
++})();
++>>>>>>> new

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

Мне просто кажется странным, что у меня конфликт слияния, но файлы не нужно объединять.

Ответ 1

Я думаю, что ваша команда mergetool неверна. Должно быть

$ git mergetool

или

$ git mergetool --tool=kdiff3

Если вы застряли в команде git, вы всегда можете проверить руководство (git mergetool --help).

Дополнительная информация: https://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Ответ 2

Я пробовал

git mergetool .

Казалось, что он работает.

Ответ 3

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

$ git mergetool

Это может быть связано с включением функции rerere (см. Эту ссылку [Ред.: ссылка больше не работает])

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

Добавьте это к вашему .gitconfig

# List conflicted files
list-conflicts = !git ls-files -u | cut -f 2 | sort -u

# Force mergetool to recognize conflicts
force-mergetool = !git list-conflicts | xargs git mergetool

ТЛ; др По желанию, здесь краткое объяснение того, что это делает:

  • git ls-files -u: после попытки слияния с конфликтами в нем перечисляются все не слитые файлы, а также некоторая посторонняя информация и повторы; если запустить сразу после слияния, это по сути все файлы с конфликтами
  • | cut -f 2 | cut -f 2 вырезает | cut -f 2 -е поле этого вывода, которое по сути является путем к файлу
  • | sort -u | sort -u устраняет дубликаты
  • | xargs git mergetool | xargs git mergetool этот список файлов в команду mergetool, которая запускает инструмент слияния GUI (при условии, что он у вас есть)

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

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

git ls-files -u | cut -f 2 | sort -u

git ls-files -u | cut -f 2 | sort -u | xargs git mergetool