Как справиться с конфликтом слияния, вызванным файлами, перемещенными в целевую ветку - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в git, но у меня есть некоторые изменения, которые я хотел бы внести, и есть некоторые конфликты слияния. Эти конфликты возникают из-за некоторых файлов, которые были перемещены в целевую ветку. Как мне справиться с этими конфликтами? Файлы были только перемещены, поэтому внесенные мной изменения все еще сохраняются, они просто говорят мне, что файл был удален в целевой ветке. Должен ли я создать новую ветку из обновленной целевой ветки и снова внести изменения?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Может быть полезно знать, что в git нет такой вещи, как «перемещение» файла.

Допустим, вы перемещаете / my / path / file.txt в другой каталог, / my / other / path . Полный путь - это имя файла. Так что git знает, что в этой истории есть два файла, один с именем / my / path / file.txt , а другой с именем / my / other / path / file.txt . Они не связаны друг с другом каким-то магическим образом, как в вашем уме. Вы называете это перемещенным. На git первый файл был удален, а второй был создан.

Теперь верно, что иногда когда / my / path / file.txt удаляется и создается my / other / path / file.txt , git может объединить это в идею «переименования» файла - то есть Путь к файлу, который находился в одном каталоге, теперь изменился, и теперь он появляется в другом каталоге, но для того, чтобы это работало, они должны быть идентичными «одним и тем же» файлом, то есть их содержимое должно быть одинаковым.

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

Итак, у вас в голове есть человеческое представление о том, что «файлы были только перемещены, поэтому сделанные мной изменения все еще сохраняются», но git думает иначе. Git - это компьютер. Он видит, что в одной ветке файл с именем / my / path / file.txt исчез (потому что он был «перемещен», как вы полагаете). Но в ветке other файл с именем / my / path / file.txt остался на месте и был отредактирован!

Ну, это два разных изменения на тот же файл : удалить или изменить. Теперь git не знает, что делать.

(Между тем, git также видит, что в первой ветке файл с именем / my / other / path / file.txt был создан, но он никоим образом не связывает его ни с одним из двух файлов, о которых мы только что говорили.)

В конце концов, вы должны решить, что вы хотите здесь сделать. Я должен признать, что, даже будучи человеком, мне неясно, какое, по вашему мнению, должно быть разрешение. Похоже, что у вас действительно есть два файла: файл / my / other / path / file.txt , созданный в первой ветке, и файл / my / path / file.txt удален в первой ветке, но отредактирован во второй ветке. Я не могу представить, как вы собираетесь поступить на этом этапе. Вы, конечно же, не хотите, чтобы оба эти файла продвигались вперед. Но где вы хотите отредактировать файл? Даже я не знаю ответа на этот вопрос.

Значит, вам нужно ответить на этот вопрос. Вы, вероятно, захотите это на новом месте. Так что в этом случае, как мне кажется, лучше всего прервать слияние, переместить / my / path / file.txt в / my / other / path / file.txt во второй ветке и снова запустите слияние.


Я также хотел бы добавить, что конфликты сами по себе не являются плохим явлением! Все, что они означают, это то, что git не может полностью автоматически сгенерировать фиксацию слияния; он не знает, что вы хотите. По-видимому, вы это делаете, поэтому вы просто говорите это (сделав эту часть слияния фиксацией вручную). В целом, термины «конфликт слияния» и «разрешение конфликта» вводят в заблуждение; мы должны мыслить исключительно в терминах позитивной деятельности «создать (или подготовить к созданию) фиксацию слияния», которую либо git может сделать автоматически, либо вы и git можете сделать вместе, совместно.

0 голосов
/ 29 мая 2020

Перед созданием запроса на вытягивание

  1. Выполните слияние последней ветки разработки с веткой функций.
  2. Тогда вы увидите конфликты слияния при слиянии этого. Поэтому разрешайте конфликты слияния локально (лучше сохраните изменения в разработке, а затем добавьте свои изменения в файлы. Или, если вы считаете, что в разработке нет других изменений, кроме перемещения, оставьте свое и переместите файлы после этого. суждение об устранении конфликтов).
  3. Затем создайте запрос на вытягивание против разработки.

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

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