Как заставить git merge обрабатывать незафиксированные изменения в моем рабочем дереве?

StackOverflow https://stackoverflow.com/questions/813822

  •  03-07-2019
  •  | 
  •  

Вопрос

В данный момент мы с коллегой оба работаем над главной веткой.У меня есть некоторый код в моем рабочем дереве, который я не хочу фиксировать (инструкции отладки и тому подобное).Теперь, если он внесет изменения в некоторые из тех же файлов, я не смогу их объединить:

$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.

Исходя из опыта работы с subversion, я привык, что мое рабочее дерево автоматически объединяется, когда я извлекаю изменения из репозитория, и если возникают конфликты, я разрешаю их вручную.

Самый быстрый способ, который я нашел для этого в git, - это:

$ git stash
$ git merge origin/master
$ git stash pop

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

Это было полезно?

Решение

Насколько я могу судить, лучшее, что вы можете сделать, - это то, что у вас уже есть с git stash . Мне тоже кажется странным, что слияние хочет иметь дело только с чистыми деревьями.

Другие советы

Забудь все, что ты когда-либо узнал из Subversion.

Всегда фиксируйте перед внесением внешних изменений.

Представьте, что у вас есть работающее дерево - возможно, не идеальное, но вы добились определенного прогресса. Затем вы выполняете слияние, и код, который вы вносите, просто сеет хаос (сам по себе был глючным, слишком много конфликтов, чтобы иметь дело, и т. Д ...). Разве не было бы хорошо, если бы вы могли просто отменить это?

Если вы совершите, вы можете. Если вы этого не сделаете, вы просто будете страдать.

Помните: то, что вы делаете, не должно быть тем, на что вы давите, но то, что вы не делаете, вы можете легко потерять.

Просто сделайте безопасную и легкую вещь и позаботьтесь заранее и совершайте часто.

  • Если локальная работа не завершена
    • И вы ввели совершенно новые файлы, которых нет в удаленной ветке:
    • Или файлы, затронутые вашей локальной работой, не пересекаются с файлами, затронутыми изменениями, которые вам нужно извлечь с удаленного компьютера:
      • Тебе повезло: git pull будет "просто работать"
    • В противном случае:
      • Если ваши локальные изменения НЕ пересекаются с изменениями, которые вы извлекаете:
        • git stash будет работать:
          • git stash save
          • git pull
          • git stash pop
      • Если ваши локальные изменения немного пересекаются с изменениями, которые вы извлекаете:
        • git stash потребует ручного разрешения конфликта:
          • git stash save
          • git pull
          • git stash pop
          • разрешать конфликты слияния
          • git reset
          • git stash drop
  • Если выполняется локальная работа
    • И файлы, на которые влияет ваша локальная работа, не имеют НИКАКОГО совпадения с файлами, на которые влияет
      • Тебе повезло: git pull будет "просто работать"
      • Однако: git pull --rebase будет "работать еще лучше" из-за более чистой истории
      • фиксации слияния не происходит;ваши изменения будут зафиксированы после последующих изменений
    • В противном случае:
      • git pull потребует ручного разрешения конфликта:
        • git pull
        • разрешать конфликты слияния
        • git add FILE для каждого конфликтующего ФАЙЛА
        • git commit
      • git pull --rebase все еще могло бы "работать еще лучше" из-за более чистой истории
        • однако разрешить конфликты слияния может быть намного сложнее

Для получения подробного объяснения, пожалуйста, смотрите: https://happygitwithr.com/pull-tricky.html

Вы не можете указать git merge объединить изменения в файлах, которые имеют изменения в вашем локальном хранилище. Это защищает вас от потери ваших изменений в те моменты, когда слияние идет плохо.

С подходом CVS и SVN к слиянию, если вы не копировали файлы вручную перед обновлением, а он скремблировал их при слиянии, вам придется вручную повторно редактировать, чтобы вернуться в хорошее состояние.

Если вы передадите свои изменения или сохраните их перед выполнением слияния, все будет обратимо. Если слияние не проходит успешно, вы можете попробовать несколько способов заставить его работать и выбрать тот, который работает лучше всего.

Если вы делаете экспериментальные или отладочные изменения, вы можете использовать git rebase для их перемещения после коммитов, которые вы получаете через git merge , чтобы упростить избавление от них. или во избежание их случайного попадания в хранилище.

Обратите внимание, что использование git rebase в ветви, которую вы поместили в общий репозиторий, вызовет горе у всех, кто извлекает данные из этого репозитория.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top