Как заставить git merge обрабатывать незафиксированные изменения в моем рабочем дереве? - PullRequest
47 голосов
/ 02 мая 2009

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

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

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

Самый быстрый способ сделать это в git:

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

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

Ответы [ 4 ]

38 голосов
/ 02 мая 2009

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

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

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

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

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

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

20 голосов
/ 02 мая 2009

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

3 голосов
/ 19 марта 2019
  • Если местная работа не выполнена
    • И вы ввели совершенно новые файлы, которых нет в удаленной ветке:
    • Или файлы, затронутые вашей локальной работой, перекрываются ZERO с файлами, затронутыми изменениями, которые вам нужно извлечь с пульта:
      • Вам повезло: 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
  • Если местная работа совершена
    • И файлы, затронутые вашей локальной работой, перекрываются ZERO с файлами, затронутыми
      • Вам повезло: git pull будет "просто работать"
      • Однако: git pull --rebase будет "работать еще лучше" из-за более чистой истории
      • нет коммитов слияния; Ваши изменения будут зафиксированы после внесенных изменений
    • В противном случае:
      • git pull требует ручного разрешения конфликта:
        • git pull
        • разрешить конфликты слияния
        • git add FILE за каждый конфликтующий файл
        • git commit
      • git pull --rebase все еще может "работать еще лучше" из-за более чистой истории
        • однако, разрешение конфликтов слияния может быть намного сложнее

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

2 голосов
/ 22 января 2010

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

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

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

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

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

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

...