
Сегодня Рабеа, мастер на работе, прошел через несколько полезных команд Git, которые не так хорошо известны тем из нас, кто не отклоняется от стандартных, таких как add, commit и push.
Git может нанести большой вред, поэтому люди могут нервничать, экспериментируя с ним, но как только вы ближе познакомитесь с тем, как он работает, это не так уж и страшно.
Вот некоторые из полезных команд, которые мы прошли сегодня утром.
Деление коммитов пополам
Это полезная команда при вводе новой базы кода или обнаружении ошибки из предыдущей фиксации и помогает определить, в какой фиксации возникла ошибка и где. Он использует двоичный поиск, чтобы определить, где были внесены изменения, вызвавшие ошибку, но вы должны помочь ему сузить круг поиска.
Чтобы использовать его, вы должны сначала ввести:
git bisect start
Это позволяет вам начать двоичный поиск. Обычно вы находитесь в фиксации, где существует ошибка, поэтому вы можете пометить текущую фиксацию как плохую.
git bisect bad
Затем вы можете определить фиксацию, в которой, как вы знаете, нет ошибок, и пометить ее как хорошую:
git bisect good *SHA-of-good-commit
SHA - это длинный уникальный ключ, присваиваемый каждой фиксации. Идентифицировать SHA можно, набрав:
git log
Продолжайте делать это, идентифицируя плохие и хорошие коммиты, пока больше не останется ничего для проверки, и git покажет информацию о первой плохой фиксации. Можно увидеть разницу между этим и хорошими коммитами, используя git diff, и тогда вы обнаружили ошибку!
Ребазинг и слияние
Ребазинг всегда пугал меня, все, что переписывает историю, кажется довольно устрашающим. Опять же, при более близком знакомстве, четкая структурная схема происходящего избавляет от страха.
Следующий код в вашей конфигурации git обеспечивает визуальное представление ветвей, что весьма полезно при знакомстве с перебазированием и слиянием:
//I have aliased this to hist in my config hist = log — graph — decorate — pretty=oneline — abbrev-commit — all
Что означает объединение ветки?
Хорошая аналогия, с которой знакомо большинство людей, - это Word. Представьте, что вы и ваш друг редактируете текстовый документ и начинаете с одного и того же фрагмента текста.
Когда один из вас начинает вносить изменения одновременно с другим, трудно сказать, кто из вас правильный. Эти разные версии, которые расходятся с исходным текстом или мастером, похожи на ветки git. Исходный текст похож на основную ветку или текущую рабочую ветку, а версии, над которыми вы работаете, похожи на функциональные ветки.
Если вы хотите отправить свои изменения обратно в мастер, вы можете объединить ветку функций в мастер. Если ваш друг также внес изменения, возможно, возникнут конфликты слияния в тех областях, где вы пытались различными способами изменить основную / текущую рабочую ветвь.
Git обычно заботится обо всех совместимых изменениях и соответственно обновляет основную ветку. Если есть конфликт слияния, он четко помечает его, чтобы вы могли его идентифицировать, выбрать изменения, которые вам действительно нужны, и зафиксировать это изменение.
Когда вы объединяете ветку, это обрабатывается как обычная фиксация и сохраняется в истории с уникальным SHA и отображается в вашем журнале git.
Что означает ребазирование ветки?
Ребазинг ветки меняет историю. Продолжая аналогию с Word, это было бы похоже на то, что вы продолжаете работать над своими изменениями в исходном тексте, а затем сохраняете свои изменения или ветвь как исходный текст или главную ветвь.
Это отличается от слияния, поскольку у вас нет дополнительной фиксации, которая показывает объединенную ветку, и все ваши изменения будут теми, которые теперь являются главными.
С осторожностью используйте перебазирование, особенно если вы работаете над совместным проектом. Это может вызвать проблемы, если вы работаете над основной веткой, которая отличается от всех остальных в вашей команде. Это может вызвать серьезные конфликты, которые будет сложно разрешить.
Cherry-Pick
Git cherry-pick позволяет вам выбрать определенный коммит из одной ветки и добавить его в другую ветку. Все, что вам нужно сделать, это выяснить SHA коммита, который вы хотите выбрать, проверить ветку, в которую вы хотите добавить этот коммит, а затем написать:
git cherry-pick *SHA-of-commit-you-want-to-add
Если вы хотите отредактировать сообщение фиксации, вы также можете добавить флаг -e, и затем эта фиксация будет добавлена с выбранным сообщением фиксации.
Давить
Также можно объединить предыдущие коммиты в один, если вы хотите очистить историю git. Это можно сделать с помощью интерактивной перебазировки:
git rebase -i HEAD~*number of commit messages you want to squash
Если есть 4 коммита, число после HEAD ~ будет 4. Как только он будет сохранен, он покажет коммиты в новом файле, и есть несколько вариантов выбора, что делать с каждым коммитом.
# p, pick = use commit # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit
Вы можете поместить соответствующую букву или команду рядом с каждым коммитом. Сжатие после сохранения и выхода приведет вас к экрану с вопросом, какие сообщения фиксации вы хотели бы сохранить после сквоша. Затем, выбрав игнорирование сообщения, закомментировав его или удалив, фиксация будет подавлена.
Переименование коммитов
Также можно переименовать старую фиксацию, используя шаги, упомянутые выше для сквоша, но вместо того, чтобы сжать команду, напишите r рядом с ней и сохраните и закройте экран, будет отображаться экран с просьбой переименовать сообщение.
Итак, есть несколько полезных команд git. Я уверен, что есть еще много интересных способов использования git, но я уверен, что приведенные выше будут весьма кстати в ближайшее время. Спасибо, Рабеа!
Полезные сайты:
Https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell