Как заставить git merge обрабатывать незафиксированные изменения в моем рабочем дереве?
Вопрос
В данный момент мы с коллегой оба работаем над главной веткой.У меня есть некоторый код в моем рабочем дереве, который я не хочу фиксировать (инструкции отладки и тому подобное).Теперь, если он внесет изменения в некоторые из тех же файлов, я не смогу их объединить:
$ 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 потребует ручного разрешения конфликта:
git stash save
git pull
git stash pop
- разрешать конфликты слияния
git reset
git stash drop
- git stash потребует ручного разрешения конфликта:
- Если ваши локальные изменения НЕ пересекаются с изменениями, которые вы извлекаете:
- Если выполняется локальная работа
- И файлы, на которые влияет ваша локальная работа, не имеют НИКАКОГО совпадения с файлами, на которые влияет
- Тебе повезло:
git pull
будет "просто работать" - Однако:
git pull --rebase
будет "работать еще лучше" из-за более чистой истории - фиксации слияния не происходит;ваши изменения будут зафиксированы после последующих изменений
- Тебе повезло:
- В противном случае:
- git pull потребует ручного разрешения конфликта:
git pull
- разрешать конфликты слияния
git add FILE
для каждого конфликтующего ФАЙЛАgit commit
git pull --rebase
все еще могло бы "работать еще лучше" из-за более чистой истории- однако разрешить конфликты слияния может быть намного сложнее
- git pull потребует ручного разрешения конфликта:
- И файлы, на которые влияет ваша локальная работа, не имеют НИКАКОГО совпадения с файлами, на которые влияет
Для получения подробного объяснения, пожалуйста, смотрите: https://happygitwithr.com/pull-tricky.html
Вы не можете указать git merge
объединить изменения в файлах, которые имеют изменения в вашем локальном хранилище. Это защищает вас от потери ваших изменений в те моменты, когда слияние идет плохо. Р>
С подходом CVS и SVN к слиянию, если вы не копировали файлы вручную перед обновлением, а он скремблировал их при слиянии, вам придется вручную повторно редактировать, чтобы вернуться в хорошее состояние.
Если вы передадите свои изменения или сохраните их перед выполнением слияния, все будет обратимо. Если слияние не проходит успешно, вы можете попробовать несколько способов заставить его работать и выбрать тот, который работает лучше всего.
Если вы делаете экспериментальные или отладочные изменения, вы можете использовать git rebase
для их перемещения после коммитов, которые вы получаете через git merge
, чтобы упростить избавление от них. или во избежание их случайного попадания в хранилище.
Обратите внимание, что использование git rebase
в ветви, которую вы поместили в общий репозиторий, вызовет горе у всех, кто извлекает данные из этого репозитория.
Я предпочитаю использовать git stash
в этих случаях, но я использую его только в том случае, если объединение изменяет файлы, которые я отредактировал и не зафиксировал.