Разрешение конфликтов Git слияния - PullRequest
32 голосов
/ 08 октября 2011

Репозиторий Git был клонирован на локальных машинах нескольких разработчиков. Некоторые изменения были внесены в код в хранилище. Теперь мы получаем ошибку:

error: Your local changes to the following files would be overwritten by merge:

        public_html/sites/file
        public_html/sites/file1.txt
        public_html/sites/file2.txt
Please, commit your changes or stash them before you can merge.
Aborting

Я прочитал довольно много тем в Интернете, и было предложено несколько различных вариантов. Один подход был запущен:

 git stash
 git pull
 git stash pop

Мне кажется, я понимаю основной принцип кражи. Мой вопрос: это хорошее решение, и могу ли я столкнуться с какими-либо проблемами, используя этот подход? Я в целом хорошо разбираюсь в веб-разработке, но я довольно простой пользователь Git и не смог бы избавиться от неприятностей на этом этапе.

Ответы [ 4 ]

15 голосов
/ 08 октября 2011

git stash совершенно законно, хотя, как сказал Грег, по какой-то причине исправление конфликтов может стать странным.Но они все еще исправимы, на самом деле вы ничего не будете делать.Я знаю, что для повторного применения тайника команда git stash apply, хотя pop может быть альтернативой, о которой я не знаю (или она может сделать что-то другое, я не знаю, так что вы, вероятно, хотитеиспользуйте apply.)

Есть ли причина, по которой вы не хотите фиксировать эти изменения перед слиянием?Как правило, это правильно.

Другой вариант:

git stash
git checkout -b newwork
git stash apply
git commit ...

Это создает новую ветку, которая позволит вам обновлять мастер безо всяких конфликтов (снова проверьте мастер, затем нажмите или выберите + объединить).Затем вы можете объединить свою ветку с (пока еще на главном) git merge newwork.Вы можете разрешить конфликты на мастере, сохраняя при этом работу над новой работой без каких-либо конфликтов.Это немного безопаснее, если вы беспокоитесь о том, что конфликты действительно могут испортить ситуацию, но, как правило, конфликты являются лишь частью процесса, поэтому не стоит слишком беспокоиться о них.

6 голосов
/ 08 октября 2011

Хорошей практикой является всегда принятие любых локальных изменений перед извлечением (объединением) нового кода. Если вы не делаете коммитов, то Git не знает, как вы хотите управлять локальными изменениями. Сливаются только с чистым рабочим деревом.

При слиянии могут возникать конфликты из-за того, что одни и те же файлы изменяются локально и кем-то другим. По моему опыту, разрешение конфликтов из реальной операции слияние немного проще, чем разрешение того же конфликта из операции stash pop .

3 голосов
/ 09 июля 2015

У меня есть другое решение:

git reset --hard FETCH_HEAD

Это работает почти во всех случаях.

1 голос
/ 17 апреля 2014

Сначала вы должны:

git checkout -- public_html/sites/file
git checkout -- public_html/sites/file1.txt
git checkout -- public_html/sites/file2.txt

Следующий шаг:

git pull origin master
...