Git — это популярная система контроля версий (VCS). Но она не всегда проста в использовании. Разработчики часто сталкиваются с проблемами, если вносят изменения в репозиторий. Существует несколько различных стратегий, которые помогают восстановить свой репозиторий. В этой статье обсудим, как отменить фиксацию git, слияние и изменить историю коммитов.
Как откатить последний коммит
Команда revert создаст фиксацию, которая отменит изменения целевой фиксации. Вы можете использовать ее для отмены последнего коммита:
git revert <commit to revert>
Можно найти имя коммита, который хотите отменить, используя [git log]. Первый коммит, который там описан, — это последний созданный коммит. Затем вы можете скопировать оттуда буквенно-цифровое название и использовать его в команде revert.
Вы также можете использовать команду reset для отмены последнего коммита. Но важно знать — она изменит историю коммитов, поэтому лучше использовать ее редко. Она переместит заголовок, рабочую ветвь, к указанному коммиту и удалит все после него:
git reset --soft HEAD~1
Как изменить название последнего коммита
Мы можем изменить последний коммит, выполнив команду git commit --amend. При выполнении этой команды откроется настроенный текстовый редактор, в котором можно отредактировать последнее сообщение о фиксации. Прежде чем запускать команду get, не забудьте сначала внести изменения с помощью git add. После ввода нового сообщения о фиксации закройте текстовый редактор.
Как откатить изменения в файле
Можно легко вернуться к предыдущему коммиту, если уверены, что ошибки нет. Создадим новую страницу и зафиксируем ее.
echo "some new content for the page 4" > page4.txt
git add page4.txt
git commit -m "create page 4"
Мы хотим восстановить наш репозиторий до того состояния, когда у нас было всего три страницы. Вот как это сделать:
- Запустите git reflog, чтобы просмотреть историю всех выполненных коммитов.
- Затем запишите идентификатор (хэш SHA1) коммита, к которому мы хотим вернуться.
- После запустите git reset --hard <commit id>.
Как отменить слияние
Слияние Git — это операция , которая объединяет изменения из разных ветвей в одну. Она позволяет разработчикам интегрировать новые функции, исправления ошибок или обновления, сделанные в одной ветви, с изменениями в другой ветви. Этот процесс важен для совместной работы и поддержания согласованной кодовой базы.
В Git ветвь — это легкий, подвижный указатель на конкретную фиксацию в истории фиксаций репозитория. Он представляет собой независимое направление разработки.
В Git есть различные типы слияний:
- ускоренное слияние — оно происходит, когда объединяемая ветвь опережает ветвь, в которую выполняется слияние. В этом случае указатель ветви перемещается вперед, чтобы включить новые коммиты. Это простой и автоматический процесс, который не создает новую фиксацию.
- рекурсивное слияние — объединяет изменения из двух ветвей с различными историями. Git анализирует историю фиксации и идентифицирует общего предка, затем применяет изменения из обеих ветвей для создания новой фиксации слиянием. При возникновении конфликтов может потребоваться их ручное разрешение.
- слияние Octopus — происходит при одновременном объединении более двух ветвей. Это позволяет объединить несколько ветвей в одну ветвь за одну операцию. Этот тип слияния полезен для консолидации изменений из разных ветвей функциональных возможностей в ветвь выпуска.
Пошаговое руководство по отмене слияния.
Проверьте статус слияния перед отменой:
- Откройте интерфейс командной строки Git или терминал.
- Перейдите в хранилище, в котором выполняется операция слияния.
- Используйте команду git status, чтобы проверить текущее состояние хранилища.
- Ищите любые сообщения или указания на продолжающийся процесс слияния.
Выполните команду git merge --abort:
- Если вы подтвердили, что операция слияния действительно выполняется и ее необходимо отменить, выполните git merge --abort
- Нажмите клавишу Enter, чтобы выполнить команду.
Подтвердите успешную отмену слияния:
- После выполнения команды Git попытается прервать процесс слияния.
- Git отобразит сообщение, указывающее, было ли слияние успешно отменено.
- Снова используйте команду git status, чтобы проверить состояние репозитория.
- Убедитесь, что статус отражает отмену слияния.
Как устранять конфликты или несоответствия после отмены слияния:
- Иногда отмена слияния может привести к тому, что репозиторий окажется в конфликтном состоянии.
- Используйте команду git status для выявления любых оставшихся конфликтов или несоответствий.
- Если конфликты существуют, устраните их вручную, отредактировав конфликтующие файлы.
- После разрешения конфликтов используйте команду git add <файл> для внесения изменений.
- Команда git commit подойдет для завершения процесса и создания нового коммита.
Советы:
- Создайте резервную копию — это гарантирует, что у вас будет точка отсчета на случай, если вам потребуется восстановить какую-либо потерянную работу или изучить слияние позже.
- Проанализируйте процесс слияния — воспользуйтесь возможностью, чтобы проанализировать процесс слияния, который привел к необходимости его отмены. Выявите все закономерности, требующие улучшения, чтобы предотвратить подобные проблемы при будущих слияниях.
- Устраняйте конфликты, если это необходимо — используйте инструменты разрешения конфликтов слиянием в Git для устранения конфликтов вручную или рассмотрите возможность использования инструмента слияния.
- Общайтесь с коллегами — если вы работаете над общим репозиторием или сотрудничаете с другими пользователями, важно сообщить о своем намерении отменить слияние. Обсудите причины, стоящие за этим решением. Согласуйте это со своей командой, чтобы избежать конфликтов или путаницы.
- Очистите рабочий каталог — после завершения слияния убедитесь, что рабочий каталог чист. Удалите все остаточные файлы или артефакты из прерванного слияния, чтобы избежать потенциальных конфликтов в будущих операциях.
Как изменить историю коммитов
Изменение истории коммитов может создать более четкую историю фиксации, она также сопряжена с потенциальными сбоями. Поскольку перезапись истории может привести к конфликтам с другими версиями ветки, лучше избегать изменения истории, которая была перенесена в удаленную ветку.
Рассмотрим наиболее распространенные команды Git, которые помогут изменить историю коммитов.
Команда git rebase используется для редактирования одного или нескольких существующих коммитов в истории локальной ветки. Эту команду можно использовать для объединения, редактирования, изменения порядка или удаления коммитов. При выполнении интерактивной перебазировки в текстовом редакторе можно задать подкоманды фиксации. В команде также должно быть указано, на основе чего следует выполнять фиксации.
Например, команда для интерактивного перебазирования последних четырех коммитов может быть такой:
git rebase -i HEAD~4
После выполнения этой команды в окне редактора отобразятся последние четыре коммита, а также список разрешенных подкоманд:
pick ca3eed4 Add README
pick 38d0f5a Update user documentation
pick 0966ba9 Add basic implementation
pick 71a2e6f Fix user interface bug
# Rebase cbfaa21..71a2e6f onto cbfaa21 (4 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
#
# Note that empty commits are commented out
С помощью команды git filter-repo можно быстро переписать историю всего репозитория, используя заданные пользователем фильтры. Это мощный инструмент с множеством приложений. Но поскольку он может повлиять на историю коммитов всего репозитория, его следует использовать с осторожностью.
Например, если пользователь зафиксировал файл, который не должен быть включен, то эту команду можно использовать для удаления этого файла из всех фиксаций в репозитории. Чтобы удалить файл user_login_info.txt из хранилища, запустите:
git filter-repo --force --invert-paths --path user_login_info.txt
Эту команду также можно использовать для обновления имен и электронных писем из прошлых коммитов. Для обновления этой информации требуется почтовая карта в формате git-shortlog, содержащая имена и электронные письма, которые вы хотите обновить. Это может выглядеть примерно так:
New Name <new_email> Old Name <old_email>
New Name 2 <new_email2> Old Name 2 <old_email2>
Как объединить коммиты
Процесс «сжатия» коммитов означает, что вы объединяете несколько существующих коммитов в один. Сжатие также возможно при слиянии ветвей:
$ git merge --squash feature/login
Auto-merging imprint.html
Removing img/iconBlog.png
Auto-merging about.html
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
Все изменения будут объединены точно так же, как при обычном слиянии. Но при использовании --squash вместо автоматического создания фиксации слиянием у вас остаются локальные изменения в вашей рабочей копии, которые вы затем можете зафиксировать самостоятельно.
Что делать, если откатилось слишком много
Рабочий каталог, как правило, синхронизирован с локальной файловой системой. Чтобы отменить изменения в рабочем каталоге, вы можете редактировать файлы, как обычно, используя обычный редактор. В Git есть несколько утилит, которые помогают управлять рабочим каталогом. Существует команда git clean. Это удобная утилита для отмены изменений в рабочем каталоге. git reset может быть вызван с помощью параметров --mixed или --hard. Так команда применит сброс к рабочему каталогу.
Команда git add используется для добавления изменений в промежуточный индекс. Git reset в основном используется для отмены изменений промежуточного индекса. Смешанный сброс переместит все ожидающие изменения из промежуточного индекса обратно в рабочий каталог.
Как удалить локальные и удалённые ветки
Обычно в Git-репозитории есть разные ветки. Это хороший способ работать над различными функциями и исправлениями, изолируя новый код от основной кодовой базы.
В репозиториях часто есть основная ветвь для основной кодовой базы. Разработчики создают другие ветви для работы над различными функциями.После завершения работы над функцией часто рекомендуется удалить эту ветвь.
Git не позволит удалить ветку, в которой вы находитесь в данный момент. Поэтому нужно убедиться, что проверили ветку, которую вы не удаляете. Например: git checkout main.
Удалите ветку с помощью git branch -d <branch>.
Например: git branch -d fix/authentication
Параметр -d удалит ветвь, только если она уже была перенесена и объединена с удаленной ветвью.
Команда для удаления удаленной ветки:
git push <remote> --delete <branch>.
Более короткий вариант:
git push <remote> :<branch>