Разве git's -X "их" не обрабатывает конфликты новых / удаленных файлов? - PullRequest
11 голосов
/ 08 февраля 2011

Следуя сценарию из этого вопроса, я выполняю git rebase -s recursive -X theirs etc... и с удивлением останавливаюсь со следующими типами конфликтов:

  • добавлено ими
  • удалено ими
  • удалено нами

Есть ли какая-то причина, по которой стратегия не справляется с этим?

(я не знаю, значимо ли это, но git не сообщает конфликтует в выводе, он просто говорит When you have resolved this problem run "git rebase --continue")

ОБНОВЛЕНИЕ Вот сценарий, который воспроизводит не совсем, но почти:

git init
git symbolic-ref HEAD refs/heads/Branch1  #just to get the 'right' branch name
echo Added in A > DeletedByThem.txt
git add -A
git commit -m A

echo Modified in B >> DeletedByThem.txt
git add -A
git commit -m B

echo Modified in C >> DeletedByThem.txt
echo Added in C > DeletedByUs.txt
git add -A
git commit -m C

git checkout -b Branch2
echo Modified in D >> DeletedByUs.txt
git rm DeletedByThem.txt
git add -A
git commit -m D

echo Modified in E >> DeletedByUs.txt
git add -A
git commit -m E

На данный момент, вы должны иметь это:

Branch1:    A - B - C
                     \
Branch2:              D - E

То, что мы хотим, это:

Branch1:    A - B - C
                 \
Branch2:          D - E

Итак:

git rebase -s recursive -X theirs --onto [SHA of B] Branch1 Branch2

Это воспроизводит проблемы «удалено ими» и «удалено нами», но не воспроизводит «добавленные ими» и отсутствие какого-либо сообщения о конфликте.

Из того, что я могу собрать, в этом контексте «удалено ими» означает «изменено после B, затем удалено» (поэтому мы делаем хотим удалить его в Branch2) и «удалено нами» "означает" созданный после B "(поэтому мы хотим сохранить его в Branch2)

Из того, что я могу судить по истории моего реального (и огромного) репо, «добавленные ими» связаны с неправильно обнаруженными переименованиями (то есть идентичные файлы в совершенно разных папках, идентифицируемых как переименования).

1 Ответ

2 голосов
/ 21 апреля 2011

Причина возникновения конфликта заключается в том, что rebase пытается применить патч, который невозможно применить.

Файл, который исправление указывает нам на удаление, не может быть найден.

Такое поведение задуманно.

...