Один git репозиторий может заключать в себе множество ветвей разработки. Чтобы создать новое ответвление под именем "experimental", выполните команду
$ git branch experimental
Теперь если вы выполните
$ git branch
то получите список всех существующих ветвей:
experimental
* master
Ветка "experimental" это та, которую вы только что создали, а ветка "master" это ветка по умолчанию которая создается автоматически. Звездочка указывает в какой ветке вы в данный момент находитесь; наберите
$ git checkout experimental
чтобы переключиться в ветку experimental. Теперь отредактируйте файл, выполните комит, и переключитесь обратно в главную ветку "master":
(edit file)
$ git commit -a
$ git checkout master
Убедитесь, что сделанные изменения невидимы, поскольку они были сделаны в ветке experimental, а вы сейчас в главной ветке "master".
Вы можете сделать другое изменение в ветке "master", затем выполнить коммит:
(edit file)
$ git commit -a
на этом этапе две ветки разошлись, поскольку в каждой из них различные изменения. Чтобы включить изменения в ветке experimental в master, выполните
$ git merge experimental
Если изменения не конфликтуют, то вы закончили. Если же существуют какие либо конфликты, то в проблемных файлах останутся заметки которые можно увидеть выполнив;
$ git diff
Как только вы отредактировали файлы вызывающие конфликты выполните,
$ git commit -a
это выполнит коммит результат слияния. В заключении,
$ gitk
покажет наглядное графическое представление истории.
Теперь вы можете удалить ветку experimental командой
$ git branch -d experimental
Эта команда гарантирует что изменения в ветке experimental уже в текущей активной ветке.(Прим. переводчика: если вы попытаетесь удалить ветку которую вы не слили со своей рабочей git выведет предупреждение и попросит вас выполнить след.команду $ git branch -D experimental)
Если вы отрабатываете в ветке сумашедшие идеи, и уже пожалели об этой ветке, вы всегла можете удалить ветку выполнив
$ git branch -D crazy-idea
Ветки это легко и просто, и это хороший способ попробовать что то новое.
Вы можете объединить две разошедшиеся ветки разработки используя git merge:
$ git merge branchname
сливает изменения сделанные в ветке "branchname" в активную(рабочую) ветку. Если присутствуют конфликты -- например один и тот же файл модифицирован разными способами в удаленной и локальной ветках -- то вы будете предупреждены; вывод будет выглядеть след. образом:
$ git merge next
100% (4/4) done
Auto-merged file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
Отметки конфликтов останутся в проблемных файлах, и после того как вы исправите их вручную, вы можете обновить индекс и выполнить git commit, как вы обычно это делаете когда изменяете файл.
Если вы просмотрите результирующий коммит используя gitk, вы увидите что у него два родителя: один указывает на последний коммит активной ветки, а другой на последний коммит другой ветки.
Когда слияние не происходит автоматически, git оставляет индекс и рабочее дерево в особом состоянии которое дает всю информацию необходимую чтобы разрешить конфликт.
Файлы с конфликтами отмечаются в индексе особым образом, так что до тех пор пока вы не исправите проблему и не обновите индекс, выполненить git commit не удастся:
$ git commit
file.txt: needs merge
Также, git status перечислит эти файлы как "unmerged", а файлы с конфликтами будут иметь добавленные отметки, и выглядеть след.образом:
<<<<<<< HEAD:file.txt
Hello world
=======
Goodbye
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
Все что вам нужно это отредактировать файлы, исправить конфликты, а затем выполнить
$ git add file.txt
$ git commit
Заметьте что сообщение-описание коммита уже будет содержить некоторую информацию о слиянии. Обычно вы можете оставить это сообщение-описание, а также можете добавить свои дополнительные комментарии, если пожелаете.
Теперь вы знаете все что вам нужно чтобы выполнить простое слияние. Но git предоставляет больше информации, чтобы помочь разрешить конфликты:
Если в процессе слияния и исправления конфликтов,вы застряли и решили сдаться и выбросить все к черту, то вы всегда можете вернуться с состоянию pre-merge (такое же как и было до того как вы запустили слияние) выполнив
$ git reset --hard HEAD
Если вы уже выполнили коммит после слияния, и вы хотите сбросить его,
$ git reset --hard ORIG_HEAD
Как бы там ни было, последняя команда может быть опасной в некоторых случаях --никогда не сбрасывайте коммит если этот коммит возможно уже был использован в слиянии в другую ветку, если вы это сделаете то это запутает последующие слияния.
Есть один специальный случай не упомянутый выше, который несколько иной по сути. Обычно, результаты слияния это коммит у которого два родителя, один на каждую ветку разработки.
Однако в некоторых случаях когда активная ветка не отклонилась от другой -- и каждый коммит в активной ветке уже содержится в другой -- то git просто выполняет "fast forward"; голова активной ветки перемещается вперед и указывается на голову сливаемой ветки, без создания каких-либо новых коммитов.