Почему git говорит "оба изменены" при выводе состояния git после конфликта?

При конфликте файла при попытке слияния в git, git говорит both modified в файле с конфликтом вроде этого:

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

      both modified: file1

no changes added to commit (use "git add" and/or "git commit -a")

Не знаю, почему именно " оба изменены". Кто-нибудь из вас знает?

Ответы

Ответ 1

Это возвращает нас к Git 1.6.5 (октябрь 2009 г.) и commit 4d4d572, которые представили это более подробное сообщение:

status: отдельно показывать состояние конфликтующих путей в рабочем дереве

Когда путь не включен в индекс, мы всегда говорили "unmerged" в разделе "Изменено, но не обновлено", даже если путь был удален в рабочем дереве.

Удалите необработанные записи из раздела "Обновленные" и создайте новый раздел "Неизведанные пути". Подробно опишите, как различные этапы конфликтуют в этом новом разделе.

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

case 1: how = "both deleted:"; break;
case 2: how = "added by us:"; break;
case 3: how = "deleted by them:"; break;
case 4: how = "added by them:"; break;
case 5: how = "deleted by us:"; break;
case 6: how = "both added:"; break;
case 7: how = "both modified:"; break;

Вы видите больше дел в коммите 173e6c8, с git status -s:

Для необработанных записей

  • X показывает состояние стадии # 2 (то есть ours) и
  • Y показывает состояние стадии # 3 (то есть theirs).
X          Y     Meaning
-------------------------------------------------
D           D    unmerged, both deleted
A           U    unmerged, added by us
U           D    unmerged, deleted by them
U           A    unmerged, added by them
D           U    unmerged, deleted by us
A           A    unmerged, both added
U           U    unmerged, both modified

Это иллюстрирует тот факт, что индекс в git содержит 3 этапа (см. "Как заставить git думать, что файл не объединен?")

В файле Git, в котором есть конфликты слияния (обычно) три версии в индексе и версия в рабочей области с маркерами конфликта diff3 -E/rcsmerge.

  • Версии в индексе - стадия 1 от общего предка,
  • этап 2 для "нашей" версии и
  • этап 3 для "их" версии.

Для необработанного файла на этапе 0 нет версии

Здесь "оба измененных" - это "измененных в" наших "и" их ".