5 проблем - 5 команд Git

· How to avoid force push?
· How to find a commit with specific content?
· How do you combine commits?
· How do you change a specific commit?
· How you can undo a git rebase?

Как избежать силового толчка?

Вы переустанавливаете свою ветку на main. Вы не хотите форсировать. Почему? Можно сломать пульт. Вы стираете изменения других членов команды.

Вот один пример. Давайте создадим функциональную ветку, и Алиса и Боб продвигают работу в эту функциональную ветку. Алиса завершает часть функции, фиксирует и отправляет на удаленный компьютер. Боб заканчивает свою работу, перед отправкой на удаленный сервер он замечает изменения в основной ветке. Чтобы дерево оставалось чистым, он выполняет перебазирование основной ветви. Он пытается протолкнуть изменения - получает отказ. Алиса внесла изменения в функциональную ветку, которую не получил Боб. Он выполняет силу толчка. Принудительное нажатие стирает все изменения Алисы.

Что вы можете сделать вместо этого? Используйте --force-with-lease.

Эта команда гарантирует, что мы не удалим сторонние изменения вверх по течению. На практике это работает, проверяя, что исходная ссылка - это то, что мы ожидаем, потому что ссылки являются хешами и кодируют цепочку родителей в их значение. ¹

Даже --force-with-lease может вызвать проблемы. Как? При использовании git fetch до --force-with-lease. То же, что и git push -f. --force-with-lease сравнивает ссылки. Получение обновлений refs, но не рабочего дерева. Не бывает слияния и фокусов --force-with-lease. Не используйте fetch до --force-with-lease.

Как найти коммит с конкретным содержанием?

Как найти коммит с определенным изменением? Допустим, это метод. Вы можете использовать следующую команду: git log -S “string”.

Для более подробной информации добавьте --source --all. Использование —-source показывает все коммиты, ведущие к последней. Использование --all для поиска в каждой ветке.

Вы даже можете искать в журнале изменений фиксации с помощью регулярного выражения.

Как вы комбинируете коммиты?

У вас есть несколько коммитов, которые вы хотите объединить. Два или три коммита придерживаются одной и той же логики. Сначала выполните мягкий сброс основной ветви. Во-вторых, создайте новую фиксацию.

Каков лимит коммитов для объединения? По-разному. Вы должны следовать принципу микрокоммитов. Почему? Легче отслеживать, рассуждать и управлять. Что проще? Выбираете ли вы микрокоммит или гигантский коммит?

Микро-фиксация - это крошечная фиксация. Он состоит из изменений, необходимых для выполнения одного ограниченного изменения . ²

Вот более точный способ. Вы можете использовать interactive rebase. Допустим, вам нужно объединить последние 4 коммита. Вам необходимо выполнить следующую команду.

Когда вы запускаете интерактивную перебазировку, Git перечисляет команды в текстовом редакторе. Текстовый редактор показывает коммиты и операции, которые вам нужны. Если вы не измените ни одну операцию, you leave pick, ничего не произойдет. Вам нужно использовать s or squash для комбинирования коммитов. Сохраните файл, и ваши операции будут выполнены.

Мне нравится использовать Nano. Настройте nano в качестве текстового редактора, так как с ним проще работать.

git config --global core.editor emacs // default
git config --global core.editor nano // Nano as editor

Вы хотите объединить свою ветку как одну фиксацию?

Сначала проверьте свою основную ветку. Во-вторых, выполните слияние с --squash. Это помещает все изменения в одну фиксацию. В-третьих, зафиксируйте изменения и измените сообщение. Слияние происходит как одна фиксация в основной ветке.

Как изменить конкретный коммит?

Почему вы хотите изменить конкретную фиксацию? Почему бы не добавить новый коммит? Потому что вы знаете эти команды? Нет. Чтобы сохранить практику микро-фиксации.

В самой старой или первой фиксации отсутствуют изменения. Добавление их в новую фиксацию нарушает стратегию микро-фиксации. Используйте эту практику для небольших коммитов, простого в использовании дерева git и лучшего переназначения.

Как можно отменить перебазирование git?

Чтобы отменить завершенное перебазирование, используйте git reset. Вы либо сбрасываете на тег, либо делаете фиксацию.

Пометьте свою работу, прежде чем начинать опасную перебазировку. Вы можете вернуться к нему позже, выполнив сброс.

Вы также можете использовать ORIG_HEAD как хороший контрольно-пропускной пункт.

ORIG_HEAD - это предыдущее состояние HEAD, установленное командами, которые могут иметь опасное поведение. (HEAD@{1} - всегда последнее значение HEAD, ORIG_HEAD - последнее значение HEAD перед опасной операцией) . ³

ORIG_HEAD создается командами, которые резко перемещают ваш HEAD, чтобы записать положение HEAD перед их операцией, чтобы вы могли легко вернуть конец ветви в состояние перед их запуском.

ORIG_HEAD не всегда устанавливается. Поэтому лучше использовать HEAD@{1}. Почему? Поскольку эта команда относится к reflog, а не к изменениям ветвей.

Чтобы прервать незавершенное перебазирование, используйте следующую команду.

git rebase --abort