Конфликт Git rebase: многие файлы удалены локально и изменены на удаленном компьютере. Как "все"?

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

git rebase -Xtheirs master

Он принимает все изменения, которые я сделал в компоненте, но все еще оставляет конфликты для модифицированных файлов из master, которые были удалены в компоненте, сообщая:

CONFLICT (modify/delete): some/file1 deleted in HEAD~3 and modified in master. Version master of some/file1 left in tree.

А также

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

        deleted by them: some/path/file1
        deleted by them: other/path/file2
        deleted by them: another/path/file3
        ...

И есть их миллион. я должен бежать git rm some/path/file1 для каждого из них. Есть ли простой способ перечислить все удаленные ими файлы и передать их git rm автомагически?

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

git clone https://github.com/chhh/git-rebase-conflict-resolution
git checkout feature
git rebase -Xtheirs master

1 ответ

TL;DR; один лайнер:

git ls-files --stage | awk -v stage=3 -v path=4 '$stage == 2 {print $path}' | xargs git rm


Отвечая на мой собственный вопрос, спасибо за комментарий к исходному вопросу от @torek.

git ls-files --stage выведет список удаленных ими файлов как имеющий этап == 2.
Таким образом, используя awk а также xargsПолностью один лайнер для вызова git rm на всех них есть:

git ls-files --stage | awk -v stage=3 -v path=4 '$stage == 2 {print $path}' | xargs git rm

Запустите его без финального xargs, чтобы проверить, какие файлы будут удалены.

Попробуй сам

Вот очень маленький пример репозитория GitHub с такой ситуацией. Функция клонирования и оформления заказа, затем попытайтесь выполнить ребазинг на мастер.

git clone https://github.com/chhh/git-rebase-conflict-resolution
git checkout feature
git rebase -Xtheirs master

Если единственные конфликты, которые у вас есть, - это не объединенные пути, "удаленные ими", я думаю, что просто git add -u решит ситуацию.

Другие вопросы по тегам