Это вообще нуждается в представлении?
git перебазировать
Для создания функциональной ветки требуется корневая фиксация внутри первичной ветки, из которой будет создана новая ветка.
Но все же возможно зафиксировать (например, через запросы на включение) в основную ветку, и после нескольких коммитов ваша ветка не будет содержать вещи, которые были интегрированы в то же время.
Простой пример: Terraform. Во время разработки IaC, пусть это будет модуль, несколько раз мне приходилось выполнять проверку кода и планирование, используя:
terraform validate
terraform plan
Результат команды plan
показал, что некоторые ресурсы будут уничтожены, в случае применения данного плана. Но я ничего не удалял.
Что случилось?
Новые ресурсы были объединены в основную ветку, а в моей ветке их не было — я создал свою ветку раньше. После ребаза — все ОК. Никаких разрушений, только дополнения, как и должно быть.
git checkout -b ‹new_branch›
Это позволяет создать новую ветку из того места, где вы сейчас находитесь, и сразу переключиться на нее. Просто классная экономия времени :)
git push — принудительно с арендой
Я обнаружил это совсем недавно и сразу же внедрил в свой рабочий процесс.
Каждый раз, когда вы делаете rebase вашей ветки, а затем пытаетесь отправить ее на удаленный сервер — ошибка. Обычное решение — выполнить коммит с флагом --force
, что, кстати, не очень хорошая идея.
Я бы сказал, что в 99% случаев, когда вы используете этот флаг — все в порядке
(пока вы знаете, что делаете), но все же — этот 1%, оставленный здесь,
для человеческие ошибки.
Например, перезаписать всю основную ветку не обновленной функциональной веткой. Звучит очень плохо…
Так в чем же разница?
--force-with-lease
позволяет защитить удаленную ветку от изменений при отправке, если локальная история не расходится с удаленной.
Другими словами — используя эту опцию, вы не будете перезаписывать чужие изменения, которые были внесены за это время — попытка сделать это вызовет ошибку.
git push origin — удалить
Если быть точным — это git push origin --delete <name_of_the_branch>
Это позволяет вам удалить ветку из удаленного источника, но сохранить ее локально.
Если вы не хотите случайно выполнить push в эту ветку еще раз, после этого также стоит выполнить git branch --unset-upstream
.
‹name_of_the_branch› следует заменить на название ветки, которую вы хотите удалить.
git rm — кешируется
Если вы хотите добавить файл в .gitignore, но он в настоящее время отслеживается git, вы заметите, что git продолжит отслеживать файл. Чтобы выйти из этой ситуации, необходимо удалить файл из отслеживания.
git rm --cached <name_of_the_file>
После выполнения этой команды файл будет помещен в статус удаленный, но имейте в виду, что это не будет означать физического удаления файла. После выполнения коммита — файл все еще будет там, но больше не будет отслеживаться git.
git слияние — сквош
Чтобы сохранить линейную историю в первичной ветке, мне очень нравится использовать «сквош-коммит», который приводит к тому, что все коммиты из функциональной ветки «упаковываются» в один коммит, который добавляется в первичную ветку.
Есть недостатки?
Что ж — как всегда, это не идеальное решение. Создание одного коммита означает, что каждая часть новой функции будет упакована. Из-за этого подробная информация о реализации данной функции будет потеряна.
Если когда-нибудь в будущем вам понадобится отследить, кто внес какую-то ошибку — возможно, результат этого поиска будет неточным.
git pull — только для ff
«ff» означает «быстрая перемотка вперед».
Позволяет извлекать данные из удаленного источника, только если локальная история не отличается от удаленной. Это мой метод вытягивания по умолчанию :)
Привет!
Спасибо за то, что вы здесь, и за ваше время! Надеюсь, вы узнали что-то полезное отсюда. Не стесняйтесь комментировать!
Бесконечно благодарен!
Энди :)