|
|||||||
Git: Разрешение конфликтов объединений
Время создания: 07.08.2018 11:45
Текстовые метки: git, merge, слияние, объединение, разрешение конфликтов
Раздел: Компьютер - Программирование - Системы контроля версий (VCS) - Git
Запись: xintrea/mytetra_syncro/master/base/1533631505zj1s8aefyy/text.html на raw.github.com
|
|||||||
|
|||||||
Разрешение конфликтов объединений Если слияние не произошло автоматически, git помещает индекс и рабочий катвалог в специальное состояние содержащее всю необходимую информацию чтобы помочь разрешить конфликт слияния. Файлы с конфликтами помечены в индексе специально, так, что до тех пор, пока вы решите проблему и не обновите индекс, совершить git-commit(1) не удастся: $ git commit Кроме того, в git-status(1) будут перечислены эти файлы, как “unmerged” (необъединённые), а файлы с конфликтами будет помечены маркерами конфликта, например: <<<<<<< HEAD:file.txt Все, что вам необходимо сделать, это отредактировать файлы для разрешения конфликтов, а затем дать команды $ git add file.txt Заметим, что сообщение коммита будет уже заполнен ддя вас некоторой информацией о слиянии. Конечно, вы можете просто использовать это сообщение по умолчанию без изменений, однако вы можете, если посчитаете нужным, добавить свои комментарии. Выше описоно всё, что вам необходимо знать для решения простых слияния. 7.1. Получение помощи при разрешения конфликтов слияния Все изменения, которые git смог объединить автоматически уже добавлены в файл индекса, так что git-diff(1) показывает только конфликты. Используется особый синтаксис: $ git diff Напомним, что комммит, который будут зафиксирован после того, как мы урегулировали конфликт будет иметь двух родителей, а не одного: один из родителей будет HEAD – вершина текущей ветки; а другой будут вершиной другой ветви, значение которой временно сохраняется в переменной MERGE_HEAD. В ходе слияния, индекс содержит три версии каждого файла. $ git show :1:file.txt # файл в общий предке обеих ветвей Начиная со стадии 2 и стадии 3 версии были обновлены с неконфликтными изменениями, и остающиеся разлияия между ними являются существенной для анализа слияния, и которую можно получить командой git-diff(1) для из индекса для показа этих оставшихся конфликтов. Команда git diff показывает различия между версией рабочего каталога file.txt и версиями стадии 2 и стадии 3. После разрешения конфликта обычным способом (но до обновления индекса), сравнения это будет выглядеть следующим образом: $ git diff Здесь видно, что наше версия решение исключить “Hello world” от первого родителя, удалить “Goodbye” от второго родителя, и добавить: “Goodbye world”, которое ранее отсутствовало в обоих предках. В некоторых особые опции diff позволяют находить различия рабочего каталога от любого из этих этапов: $ git diff -1 file.txt # различий с этапом 1 Командами git-log(1) и gitk[1] также обеспечивается помощь при слиянии: $ git log --merge Они будут показывать все коммиты, которые существуют только в HEAD и в MERGE_HEAD, и которых касаются необъеденяемый файл. Вы также можете использовать git-mergetool(1) которая позволяет объединить необъеденённые файлы с помощью внешних средств, таких как emacs или kdiff3. Каждый раз, когда вы урегулировать конфликты в файле и обновляя индекс: $ git add file.txt различные этапы этого файла будет «коллапсировать», после чего git-diff уже не будут (по умолчанию) показывать различия для этого файла. 8. Отмена слияния Если вы не смогли слить ветви и решили просто отказаться и отказаться, вы всегда можете вернуться к состоянию до слияния : $ git reset --hard HEAD Или, если вы уже зафиксировали слияние коммитом, что вы хотите его отменить, Однако эта последняя команда может быть опасной в некоторых случаях когда ваш коммит имеет уже коммиты потомки, или если этот коммит сам является слиянием с другой ветвью, тогда удаление коммита запутает будущие слияния. 9. Быстрое слияние вперёд Существует один особый случай, не упомянутый выше, которая третируется по-разному. Нормально, результатом слияния является коммит слияния с двумя родителями, в точке объединения на двух линий разработки. Однако, если текущая ветка является потомком другой и каждый коммит всегда один и всегда содержат коммит предыдущего, то можно просто выполнив команду git`ом “fast forward” (Быстрое движение вперёд) вершина текущей ветки продвинется вперед до точки вершины объединения в новую ветвь, без каких-либо новых созданий коммитов. 10. Исправление ошибок Если вы сделали ошибку в рабочем каталоге, но пока еще не зафиксировали вашу ошибку, вы можете вернуть рабочий каталог в прошлое состояние командой $ git reset --hard HEAD Если вы сделаете коммит и позже вы решили отказаться от него, то у есть два принципиально различных способа решения проблемы:
10.1. Исправление ошибки новым коммитом Создание нового коммита, который отменяет ранее сделанные исправления, очень легко, просто дайте команду git-revert(1) с ссылкой на плохой коммит; например, вернуться к последниме коммиту: $ git revert HEAD Это позволит создать новыЙ коммит, который “откатывает” изменения HEAD. Вам будет предоставлена возможность отредактировать сообщение для совершения нового коммита. Вы также можете вернуть последние изменения, например, предпоследние: $ git revert HEAD^ В этом случае git попытается отменить старые изменения, оставляя нетронутыми любые изменения, сделанные после коммита. Если последние изменения пересекаются с изменениями будет восстановления, Вам будет предложено устранить конфликты вручную, как и в случае удалени конфликтов a merge . 10.2. Исправление ошибки путём переписывания истории Если взять проблематичный коммит является последним коммитом, и вы еще не сделали его публичным, вы можете просто удалить его, используя git-reset . Кроме того, вы можете отредактироватьсодержимое рабочего каталога и обновлять индекс для устранения ошибки, так-же, как если бы вы хотели создать новый коммит, а запустив $ git commit --amend который заменит старый коммит новым путём включения ваших изменений, и давая вам возможность изменить вначале старое сообщение коммита. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|