Как я могу отменить удаленные изменения и отметить файл, как “разрешено”?

У меня есть некоторые локальные файлы, я вытягиваю от удаленного ответвления и существуют конфликты. Я знаю, что хотел бы сохранить свои локальные изменения и проигнорировать удаленные изменения, вызывающие конфликты. Существует ли команда, которую я могу использовать, чтобы в действительности сказать "метку все конфликты, как разрешено, использовать локальный"?

195
задан Gary Barrett 29 April 2019 в 20:35
поделиться

1 ответ

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

Если вы не знаете (и не только не надеетесь), вы получите огромное количество трафика, я бы пошел на отдельные запросы, а затем беспокоился об оптимизации, если это будет выглядеть как проблема. На этом пункте в любом случае потребуется выполнить другие действия, такие как создание уровня доступа к данным и добавление кэширования.

-121--4244874-

В любом случае не следует использовать e.printStackTrace () напрямую - при этом информация будет отправлена в журнал Android без отображения приложения (тега журнала), из которого она поступила.

Как уже упоминалось, продолжайте фиксировать Исключение , но используйте один из методов андроид.util.Log для ведения журнала. Можно зарегистрировать только сообщение, но не трассировку стека, или использовать подробный журнал для трассировки стека:

try {
    Object foo = null;
    foo.toString();
} catch (NullPointerException ex) {
    Log.w(LOG_TAG, "Foo didn't work: "+ ex.getMessage());
    Log.d(LOG_TAG, Util.stackTraceWriter(ex));
}

Необходимо удалить сообщения журнала DEBUG или VERBOSE из производственных сборок. Самый простой способ - использовать ProGuard для удаления Регистраций. [dv] вызовов из кода.

-121--1196104-

git checkout имеет опцию -ours для извлечения версии файла, который был у вас локально (в отличие от --их , которая является версией, извлеченной вами). Вы можете пройти . - git checkout , чтобы попросить его проверить все в дереве. Тогда вам нужно отметить конфликты как разрешенные, что вы можете сделать с git add , и выполнить свою работу после того как сделано:

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

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

Это также хорошая привычка, чтобы при передаче в имени файла, чтобы компенсировать его с -- , например git checkout --ours -- < имя файла > . Если этого не сделать, и имя файла совпадает с именем ветви или тэга, Git подумает, что вы хотите получить эту версию, вместо того, чтобы проверить это имя файла,и используйте первую форму команды checkout .

Я немного расскажу о том, как конфликты и слияние работают в Git. При слиянии в чужом коде (что также происходит во время извлечения; тяга по сути является выборкой, за которой следует слияние), существует мало возможных ситуаций.

Самое простое, что вы находитесь в одной редакции. В этом случае, вы «уже в курсе событий,» и ничего не происходит.

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

Затем вы попадете в ситуации, в которых вам действительно нужно объединить две ревизии. В этом случае есть два возможных результата. Во-первых, слияние происходит чисто; все изменения находятся в разных файлах или в одних и тех же файлах, но достаточно далеко друг от друга, чтобы можно было применить оба набора изменений без проблем. По умолчанию, когда происходит чистое слияние, оно автоматически фиксируется, хотя его можно отключить с помощью команды --no-commit , если необходимо отредактировать его заранее. (например, если вы переименуете функцию foo в bar и кто-то другой добавит новый код, который вызовет foo , она будет объединена чисто, но создаст сломанное дерево, поэтому вам может понадобиться очистить его как часть фиксации слияния, чтобы избежать поломки фиксаций).

Окончательная возможность состоит в том, что происходит реальное слияние, и есть конфликты. В этом случае Git будет выполнять как можно больше операций слияния и создавать файлы с маркерами конфликтов ( < < < < < < , = = = = = = = и > > > > > > > ) в рабочей копии. место, где файлы хранятся с помощью git add до их фиксации), у вас будет 3 версии каждого файла с конфликтами; существует исходная версия файла от предка двух объединяемых ветвей, версия от HEAD (ваша сторона слияния) и версия от удаленной ветви.

Для разрешения конфликта можно либо отредактировать файл в рабочей копии, удалить маркеры конфликта и исправить код так, чтобы он работал. Кроме того, можно извлечь версию с одной или с другой стороны слияния, используя git checkout -ours или git checkout --theirs . После перевода файла в нужное состояние необходимо указать, что слияние файла завершено и он готов к фиксации с помощью git add , а затем можно зафиксировать слияние с помощью git commit .

325
ответ дан 23 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

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