git вишня странная проблема, иногда конфликтует, но иногда нет - PullRequest
0 голосов
/ 25 марта 2020

Допустим, у нас есть история ниже:

     master->m2   s2<-second
             |     |
             m1   s1
               \ /
                a0

, поэтому a0 - это начальный коммит, в котором есть текстовый файл с именем letter.txt, который содержит букву a, каждый коммит в основной ветви добавьте следующий алфавит, так что letter.txt в m1 содержит ab и m2 содержит abc, затем я извлекаю вторую ветку и добавляю новый файл, скажем bugfixcode.cs, поэтому s1 и s2 все в отношении добавления / изменения bugfixcode.cs, затем я переключаюсь обратно на master и нахожу, что я хочу выбрать некоторые коммиты из второй ветви, вот что-то странное:

Q1. если я выберу вишню s2, то это будет конфликт, но если я выберу вишню s1, то никакого конфликта нет. Для конфликта при выборе вишни s2, я думаю, это потому, что содержание letter.txt во второй ветви все еще равно a, но файл в m2 имеет abc, но это не так тот же факт на s1? почему нет конфликта на s1

Q2. Для конфликта при сборке вишен s2, почему нет маркера конфликта, например <<<<<<< HEAD в letter.txt? если нет маркера конфликта, то нет конфликта, не так ли?

1 Ответ

2 голосов
/ 25 марта 2020

Это не имеет ничего общего с letter.txt . Это о bugfixcode.cs .

Что за вишня? Это слияние выполняется так, как если бы родительский целевого коммита (коммит, названный в конце команды cherry-pick) был предком обоих коммитов (целевой коммит и коммит, которым мы являемся HEAD).

Другими словами, это воспроизведение (на HEAD) diff (патча), которое доставит вас от родителя целевого коммита к целевому коммиту. .

Итак, у вас есть это:

--- A has no file x
\
 \--- B creates file x --- C modifies file x

Итак, теперь вы пытаетесь выбрать вишню C на A. Это означает: переиграть B-to- C diff на вершине A. Вы говорите: «Пожалуйста, сделайте со мной, A, что вы сделали с B, чтобы получить C.»

Хорошо, что сделал вы делаете с Б, чтобы получить C? В чем есть разница между B и C? Это модификация файла x . Но в A нет файла x вообще! Так что же значит , что означает? Как мы можем, начиная с А, изменить файл, которого даже нет? Git понятия не имеет, поэтому он вскидывает руки.

(Та же проблема не существует, если вы выберете B на A, потому что очевидно, что это за разница: создайте файл.)

Чтобы увидеть это в контролируемом Кстати, просто разыграть сценарий. Следите за файлом, который я называю file2 :

git init
echo "howdy" > file
git add .
git commit -m "start"

git branch mybranch
git checkout mybranch
echo "test" > file2
git add .
git commit -m "created file2"
echo "test" >> file2
git add .
git commit -m "modified file2"

git checkout master
git cherry-pick a5d16cb4

Что мы получаем? Конфликт. И сообщение об ошибке ясно говорит нам, что это такое:

error: could not apply a5d16cb... modified file2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

Прочитайте слова. Проблема в том, что C "модифицированный файл2". И предлагаемое решение состоит в том, чтобы add или rm проблемный файл c, file2 .

Другой способ понять, в чем заключается проблема, - это сделать на этом этапе git status. Вот что мы получаем:

On branch master
You are currently cherry-picking commit a5d16cb.
  (fix conflicts and run "git cherry-pick --continue")
  (use "git cherry-pick --abort" to cancel the cherry-pick operation)

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

    deleted by us:   file2

Опять же, нам говорят, что проблема в file2 , и что решение - это add или rm. Фраза «удалено нами» на самом деле весьма полезна, и вы можете использовать ее, чтобы express решить проблему, возможно, лучшим способом. Помните, мы пытаемся объединить diff B-to-A с diff B-to- C. Таким образом, относительно B, который уже имеет файл, A удаляет файл, а C изменяет файл. Вы не можете сделать и то и другое - это конфликт.

Так что проблема заключается в файле, созданном и измененном в вашей ветке second. И именно поэтому вы не видите конфликта в файле, созданном и измененном в master; это не конфликт.

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