Избегайте удаления файлов в конфликте git merge [duplicate]

Может быть полезно программировать интерфейсы, даже если мы не зависим от абстракций.

Программирование на интерфейсы заставляет нас использовать контекстно-зависимое подмножество объекта. Это помогает, потому что это:

  1. мешает нам делать контекстуально неприемлемые вещи, а
  2. позволяет нам безопасно изменить реализацию в будущем.

Например, рассмотрим класс Person, который реализует интерфейс Friend и Employee.

class Person implements AbstractEmployee, AbstractFriend {

}

В контексте дня рождения человека мы программируем интерфейс Friend , чтобы предотвратить обращение с человеком как Employee.

function party() {
    const friend: Friend = new Person("Kathryn");
    friend.HaveFun();
}

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

function workplace() {
    const employee: Employee = new Person("Kathryn");
    employee.DoWork();
}

Отлично. Мы ведем себя соответственно в разных контекстах, и наше программное обеспечение работает хорошо.

В будущем, если наш бизнес изменится для работы с собаками, мы сможем довольно легко изменить программное обеспечение. Сначала мы создаем класс Dog, который реализует как Friend, так и Employee. Затем мы благополучно меняем new Person() на new Dog(). Даже если обе функции имеют тысячи строк кода, это простое редактирование будет работать, потому что мы знаем следующее:

  1. Функция party использует только подмножество Friend в Person.
  2. Функция workplace использует только подмножество Employee в Person.
  3. Класс Dog реализует интерфейсы Friend и Employee.

С другой стороны, если либо party, либо workplace должны были запрограммироваться против Person, существует риск того, что оба имеют Person -специфический код. Переход от Person в Dog потребовал бы, чтобы мы расчесывали код, чтобы искоренить любой Person -специфический код, который Dog не поддерживает.

Мораль: программирование на интерфейсы помогает нашему коду вести себя надлежащим образом и быть готовыми к переменам. Он также подготавливает наш код к зависимости от абстракций, что приносит еще больше преимуществ.

124
задан BuZZ-dEE 5 October 2015 в 18:33
поделиться

3 ответа

Сообщение о конфликте:

CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD

означает, что res/layout/dialog_item.xml был удален в ветви диалога, который вы объединяете, но был изменен в HEAD (в ветке, в которую вы слияете).

Итак, вы должны решить, удалить ли

  • файл с помощью «git rm res/layout/dialog_item.xml»

или

  • принимает версию из HEAD (возможно, после ее редактирования) с помощью «git add res/layout/dialog_item.xml»

Затем вы завершаете слияние с «git commit».

Обратите внимание, что git предупредит вас, что вы создаете фиксацию слияния в (редком) случае, когда это то, чего вы не хотите. Вероятно, остается от дней, когда указанный случай был реже.

180
ответ дан Jakub Narębski 20 August 2018 в 21:44
поделиться
  • 1
    Пробовал предыдущий (git rm …), но я получаю …: needs merge и rm '…', которые у меня трудная интерпретация. И затем, если я попытаюсь выполнить, stackoverflow.com/questions/19985906/… снова появится. – Jesse Glick 6 March 2014 в 19:43
  • 2
    Не обращайте внимания на вторую половину этого комментария. Выход от Git несколько тревожный, но кажется безвредным. – Jesse Glick 6 March 2014 в 22:19
  • 3
    Существует ли массовый подход? У меня есть проект, который опирается на внешний материал, который я не хочу хранить. Таким образом, есть много файлов, которые были изменены вверх по течению, и я хочу удалить в своей ветке, что я перезаряжаюсь, несмотря ни на что. Это утомительно делать это один за другим. – mlt 13 January 2015 в 23:27
  • 4
    @mit: вы можете использовать git ls-files --stage и / или git status --porcelain и / или git diff-files <something>, чтобы получить список измененных файлов и диск сценария для их удаления или принятия вашей или их версии. – Jakub Narębski 13 January 2015 в 23:31
  • 5
    @jakub, это идея, но должен быть способ автоматически решить, что с git слияние с параметрами -Xtheirs или -Xours? они, похоже, не работают для удаления файлов, хотя – Alexander Mills 26 October 2016 в 19:18

Если вы используете Git Gui для окон,

  1. Прервите слияние
  2. Убедитесь, что вы находитесь на своей целевой ветви
  3. Удалите конфликтующие файл из explorer
  4. Повторное сканирование для изменений в Git Gui (F5)
  5. Обратите внимание, что конфликтующий файл удален
  6. Выберите Stage Changed Files To Commit (Ctrl-I) из Commit menu
  7. Введите комментарий фиксации как «удаленный конфликтный файл»
  8. Commit (ctrl-enter)
  9. Теперь, если вы перезапустите слияние, он (надеюсь ) Работа.
4
ответ дан salihcenap 20 August 2018 в 21:44
поделиться
  • 1
    Почему downvote? Ничего плохого? – salihcenap 3 September 2016 в 12:32
  • 2
    Парню просто не нравится, что вы, возможно, работаете с Git с графическим интерфейсом. Способ командной строки лучше. – Souris 9 September 2016 в 08:54

Я обычно запускаю git mergetool, и он подскажет мне, хочу ли я сохранить измененный файл или удалить его. Это самый быстрый способ IMHO, поскольку это одна команда вместо нескольких файлов.

37
ответ дан void.pointer 20 August 2018 в 21:44
поделиться
  • 1
    Это сработало для меня, когда git rm -force не сделал этого. – Brian Minton 17 February 2017 в 14:55
  • 2
    @BrianMinton меня тоже, другой материал был просто порочный круг – Nate L 27 June 2018 в 22:19
Другие вопросы по тегам:

Похожие вопросы: