#git #merge #commit #conflict #partial
#git #слияние #фиксация #конфликт #частичный
Вопрос:
Я сталкиваюсь с конфликтами при попытке объединить восходящие изменения обратно в мою ветку, и я не уверен, как их разрешить.
Я создал свою собственную вилку. Я клонировал его. Я внес изменения в ветку на своем форке, зафиксировал и отправил. Но затем основной форк обновился, и я попытался обновить свой собственный форк, объединив восходящий поток следующим образом:
$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master
Слияние говорит о какой-то проблеме с файлом, и автоматическое слияние не работает. Это говорит мне исправить это самому и повторно объединить. Итак, я на самом деле зашел в (восходящий) репозиторий на GitHub основного форка и скопировал весь код нового файла в файл на моем форке и попытался объединить снова. Затем git выдает мне эту ошибку:
фатально: «слияние» невозможно, потому что у вас есть неотключенные файлы. Пожалуйста, исправьте их в рабочем дереве, а затем используйте ‘git add / rm’, чтобы соответствующим образом отметить разрешение и выполнить фиксацию, или используйте ‘git commit -a’.
Есть ли какой-то аргумент, который я упускаю из виду? Я делаю что-то глупое? Что это значит под «неотключенными файлами»? Разве весь смысл слияния не в объединении файлов? Должен ли я фиксировать свои изменения перед слиянием?
Комментарии:
1. Честный совет: Я предлагаю вам прочитать руководство по VCS и слиянию в целом. Вопросы и ответы, которые вы дали, заставляют меня немного беспокоиться о том, правильно ли вы это сделаете
2. Как разрешить конфликты: kernel.org/pub/software/scm/git/docs / …
3. ProGit, похоже, довольно популярная онлайн-книга по Git; Я бы также рекомендовал Git снизу вверх.
Ответ №1:
То, что вы видите, означает, что автоматическое слияние не смогло разрешить конфликты в файлах. Вам нужно разрешить эти конфликты вручную. Запустите git mergetool
или git gui
.
Комментарии:
1. ОК, только что запустил Git GUI. Я никогда не использовал это раньше, и когда я открыл свой локальный репозиторий. Что мне делать после запуска git GUI?
2. В
git gui
вы увидите конфликтующие файлы. Вы можете проверить и разрешить их непосредственно изgit gui
. Или, если вам не нравитсяgit gui
, просто запуститеmergetool
, чтобы разрешить коллизии.3. Хорошо, я предпочитаю mergetool. Итак, он показывает мне каждый конфликт, автоматически ли он устраняет конфликт? Можете ли вы изменить способ его исправления? Или мне все еще нужно вручную это исправить?
4. @anonymous Mergetool просто запускает выбранную вами программу, поведение зависит от программы.
5. когда я запускаю mergetool, он сообщает мне нажать <return>, чтобы открыть «инструмент разрешения слияния» (tortoisemerge) А затем я открываю tortoisemerge и смотрю на все различия. Это автоматически объединяет их для меня?
Ответ №2:
Команда «git merge» пытается включить изменения из другой ветки в текущую ветку. Если слияние чистое, то есть без конфликтов, оно будет зафиксировано. Поскольку в вашем слиянии действительно были конфликты, оно не зафиксировалось. Вам нужно разрешить конфликт.
Извлечение копии из восходящего репозитория — один из способов сделать это — приняв версию восходящего репозитория. Вы можете сделать это в git, используя «git checkout — их conflicting_file.txt «
Редактировать файл, чтобы придать ему нужную форму, можно другим способом.
Как только это будет исправлено, вам нужно добавить с помощью «git add conflicting_file.txt «затем зафиксируйте. Тогда ваша рабочая копия чиста и готова к дальнейшему взлому. Удачи.
Комментарии:
1. Хорошо, (проект, над которым я работаю, написан на Java) поэтому, если конфликтующий файл был вызван «blah.java «Я бы запустил «git checkout — их blah.java «? И я не понимаю всей этой штуки с «добавлением». Зачем мне нужно «добавлять», если я исправил конфликт?
2. Это точно так же, как любая правка в git. Сначала вы редактируете файл в своей рабочей копии. Затем вы добавляете (git add blah.java ), который сообщает git, что файл (blah.java ) будет частью следующего коммита. Затем фактически выполните фиксацию. Разница со слиянием заключается в том, что некоторые файлы, у которых нет конфликтов, уже будут добавлены. Вы добавляете оставшиеся файлы, чтобы показать, что вы разрешили конфликты.
Ответ №3:
В Git бывают случаи, когда merge отказывается даже запускаться, чтобы защитить ваши локальные изменения. Это может произойти в двух случаях:
-
У вас в репозитории есть незафиксированные изменения, которые конфликтуют со слиянием. Git откажется выполнять слияние со следующим сообщением:
ошибка: ваши локальные изменения в следующих файлах будут перезаписаны слиянием: foo Пожалуйста, зафиксируйте свои изменения или спрячьте их, прежде чем сможете объединить. Прерывание
Тогда вам нужно либо сначала зафиксировать изменения (
git commit -a
илиgit add
git commit
), либо спрятать их с помощьюgit stash save
. -
Вы находитесь в середине какой-то незавершенной операции слияния. Произошел некоторый конфликт, например
Автоматическое объединение foo КОНФЛИКТ (содержимое): конфликт слияния в foo Сбой автоматического слияния; исправьте конфликты, а затем зафиксируйте результат.
и вы не закончили разрешать конфликты (редактируя файлы и помечая их как разрешенные с помощью
git add
или используя какой-либо графический инструмент слияния черезgit mergetool
) и не создали окончательный коммит слияния с помощьюgit commit -a
или прервали слияние с помощьюgit reset --hard
(ПРИМЕЧАНИЕ: это отменит все внесенные вами изменения, и вы потеряете проделанную работу по разрешению конфликтов !!!).Или вы просто запустили second
git merge
слишком быстро или использовалиgit merge
вместоgit commit
для создания фиксации слияния.ошибка: "слияние" невозможно, потому что у вас есть неотключенные файлы. подсказка: исправьте их в рабочем дереве, подсказка: а затем используйте 'git add / rm' как подсказка: подходит для обозначения разрешения и совершения фиксации, подсказка: или используйте 'git commit -a'. фатальный: завершение из-за неразрешенного конфликта.
Разрешите конфликты, как описано, например, в статье Джунио Си Хамано «Старая забава с завершением слияния» и завершите слияние с помощью
git commit
, или отмените слияние, или спрячьте его. Тогда, если вы хотели создать это второе слияние, вы можете это сделать.
Примечание: по умолчанию в командной строке с поддержкой git отображается, находитесь ли вы в процессе слияния, перебазирования или применения исправлений ( git am
операция). Вы также можете настроить его так, чтобы он показывал, загрязнен ли рабочий каталог (отличается от последней версии, т. Е. HEAD).
Ответ №4:
Запустите git commit
(после добавления файлов) второй раз, не git merge
.
Также разрешение конфликта создаст файлы, которые помогут вам объединить. Смотрите также git mergetool
.
Комментарии:
1. Хорошо, но когда я запускаю git commit, я получаю аналогичную ошибку о «Несвязанные файлы не могут быть зафиксированы»
2. Вы запустили
git add <file>
первым?3. Нет, я запустил git mergetool и устранил проблемы, затем зафиксировал нормально. Должен ли я был сделать что-то по-другому?
4. Если вы решаете вручную без git mergetool, вам сначала нужно использовать git add. Но использование git mergetool — лучший способ.
Ответ №5:
После того, как вы разрешили слияние, вам нужно использовать git add
для добавления файлов, которые вы изменили, в индекс, а затем зафиксировать (как сказано в сообщении). Это говорит git «Да, я действительно хочу внести эти изменения».
Помните, всегда используйте git add
перед фиксацией (либо обычно, либо при совершении слияния), если вы используете интерфейс командной строки. Интерфейсы, такие как magit, могут упростить это для вас, так что вам не придется беспокоиться о том, чтобы каждый раз вводить «git add».
Комментарии:
1. Хорошо, я думаю, в этом есть смысл. Просто «git добавить?» Или сработал бы «git add -a»? : P нет, не сработало. Я должен добавлять каждый измененный файл вручную?