Подтвердить что ты не робот

После конфликта Git слияния многие файлы, которые я не касался, становятся изменениями, которые нужно совершить

Итак, я работаю в ветке, вношу некоторые изменения и запускаю git merge master. Я получаю конфликт слияния в одном из файлов, которые я изменил (что я знаю, как с этим бороться), но по какой-то причине куча файлов, которые я не касался (но которые были обновлены в главном редакторе), внезапно вошел в мой список "Изменения быть совершенным".

Почему это? И как мне это исправить? Я не хочу, чтобы какие-либо из этих изменений не менялись.

4b9b3361

Ответ 1

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

Git всегда собирает новые коммиты в промежуточной области перед их выполнением. Слияние делает то же самое. В промежуточной области создается новая фиксация со всеми изменениями из ветки источника. В случае конфликта этот процесс обновления промежуточной области прерывается, и вам предоставляется контроль. Вот почему это происходит. После того, как вы зафиксируете, в репозитории будет создано "объединение слиянием", в котором родительские и целевые ветки будут родителями.

Что касается "Я не хочу, чтобы какие-либо из этих изменений не менялись", почему вы вообще слияли, если не хотите никаких изменений?

Ответ 2

Я думаю, что проблема с этим способом GIT заключается в том, что после фиксации будет выполняться "push". "Push" будет включать все зафиксированные файлы, включая файлы, которые "толкатель" не касался. Это делает отслеживание очень сложным.

Ответ 3

Причина этого в том, что вы, скорее всего, сделали противоположное тому, что вы намеревались сделать.

Предположим, что ваша рабочая ветвь называется topic-branch.

Вместо этого:

$ git merge master

вы могли бы сделать:

$ git checkout master
$ git merge topic-branch

На английском языке вместо объединения ветки master в topic-branch вы могли бы объединить topic-branch в master.

Чтобы понять, почему это достигает желаемого результата, мы можем рассмотреть утверждение, сделанное в предыдущем ответе:

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

Проблема, с которой вы сталкиваетесь, - это просто merge, пытающаяся выполнить свою работу. Файлы не изменяются в вашей ветке темы, но они находятся на ветке, в которую вы сливаетесь. Если вы посмотрите на это в противоположном направлении слияния topic-branch в master, проблема исчезнет, ​​потому что он рассматривает только файлы, которые вы изменили.

Концептуально, вот что делает слияние (подробнее здесь):

Пусть текущая голова называется текущей, а голова должна быть объединена называемое слиянием.

  • Определите общий предок текущего и слияния. Назови это предок фиксации.
  • Сделка с легкими случаями. Если фиксация предка равен слиянию, а затем ничего не делать. Если ancestor-commit равен текущему, затем выполните ускоренное слияние.
  • В противном случае определите изменения между фиксацией предка и слиянием.
  • Попытайтесь объединить эти изменения в файлы в текущем.
  • Если конфликтов не было, создайте новый коммит с двумя родителями, текущий и слияние. Задавать current (и HEAD), чтобы указать на это новое коммитирование, и обновить рабочие файлы для проекта соответственно.
  • Если возник конфликт, вставьте соответствующие маркеры конфликтов и сообщите об этом пользователю. Нет фиксации.