# 5 - Редактирование старого сообщения фиксации

Я понятия не имею, сколько часов я потратил, пытаясь разрешить конфликты, перебазировав свою ветку функций с помощью master (или main now, как я буду использовать в качестве примера по умолчанию в этой статье), когда они находятся далеко друг от друга, или обновление автора нескольких коммитов, которые я сделал с моей личной электронной почты вместо использования профессиональной - серьезно, я делал это очень много раз.

Я определенно не эксперт, когда речь идет о Git. Собственно, первой Системой контроля версий, которую я использовал, была Subversion (SVN) - более 9 лет назад. Спустя 3 года я начал использовать TFS / TFVC. Хорошо, неважно, давайте поговорим о Git.

Я начал профессионально использовать Git всего четыре года назад и совершенно не был знаком с командами терминала.

Поскольку мой предыдущий опыт работы с пользовательским интерфейсом TortoiseSVN, мне просто нужно было щелкнуть правой кнопкой мыши по некоторым файлам и папкам и сравнить с базой, прежде чем скрестить пальцы, чтобы все заработало, как ожидалось, мой первый выстрел с git состоял в том, чтобы попробовать несколько дружественных инструмент пользовательского интерфейса, такой как Дерево исходного кода или Рабочий стол GitHub.

Какое-то время все шло хорошо, но когда появилась первая большая проблема, я понял, что на любой вопрос, который я должен был искать о сложных проблемах, будет дан ответ с помощью команд git на терминале в 10 раз чаще, чем с помощью щелчков пользовательского интерфейса git.

Очевидно, что использование инструментов пользовательского интерфейса не мешает вам использовать терминал, когда дела идут плохо, но в моем случае я предпочел начать использовать терминал как можно скорее.

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

1. Получите или установите переменные пользователя и электронной почты.

В git есть три уровня переменных конфигурации: локальный, глобальный и системный. Первый (если он определен) имеет приоритет над вторым и так далее. Таким образом, мы можем иметь глобальную конфигурацию на нашем компьютере, но при необходимости иметь локальную конфигурацию для конкретного репозитория.

Примечание. Если у вас есть локальная переменная, она, например, переопределит глобальную.

Чтобы узнать, какая электронная почта настроена для конкретного репозитория, перейдите в папку репозитория и запустите каждую строку отдельно:

git config user.name
git config user.email

Если вы попробуете эту команду вне репозитория git, вы все равно сможете что-то получить, но это будет ваша глобальная или системная конфигурация.

Хотите знать, что настроено для каждого уровня? Просто добавьте конкретную опцию после команды config:

git config --system user.email
git config --global user.email
git config --local user.email
  • Последний будет работать только внутри репозитория git.
  • Вы можете выполнить те же команды для конфигурации «имя», изменив значение с email на name.

Как я могу установить эти конфигурации git?

По сути, это та же команда, но с добавлением значения в конце. Нравится:

git config user.name "Your Name"
git config user.email [email protected]

Если вы запустите эти команды внутри репозитория git, эти значения будут установлены на локальном уровне. Если вы находитесь за пределами репозитория git, для них будет установлен глобальный уровень.

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

Но что, если вы хотите узнать что-то самостоятельно в своей личной учетной записи git?

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

git config --global user.name "Lucas Tagliani"
git config --global user.email [email protected]

И внутри моей личной папки репозитория git я бы:

git config user.email [email protected]

Больше информации можно найти в этом ответе на StackOverflow или в официальных документах.

2. Как изменить автора (адрес электронной почты) одного или нескольких коммитов

Если вам просто нужно исправить автора электронной почты для последней совершенной вами фиксации, просто:

git commit --amend --no-edit --author="New Name<[email protected]>"

Затем вы можете нажать его с помощью flag--force-with-lease:

git push --force-with-lease

Теперь, если вам нужно исправить более одного недавнего коммита, рекомендуется выполнить эти шаги.

Но если вам нужно исправить это для нескольких коммитов - как я делал много раз - и вас не волнует история git, вы можете использовать этот скрипт:

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

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

Я запускал этот скрипт несколько раз в личных проектах, но никогда не делал этого в профессиональных. Будь осторожен. Если вы собираетесь его использовать, не забудьте заменить OLD_EMAIL, CORRECT_NAME и CORRECT_EMAIL.

3. Добавьте новые изменения в последнюю фиксацию.

Представьте себе это. Вы только что завершили необходимые изменения. Вы чувствуете себя уверенно: git add, git commit, git push. Затем вы обнаруживаете небольшую опечатку в каком-то модульном тесте и не хотите создавать еще одну фиксацию только для исправления опечатки ...

Без проблем! Это, наверное, самый простой вариант! Простой amend сделает свое дело. Просто беги:

git commit --amend

Затем откроется текстовый редактор с последним сообщением о фиксации. Отредактируйте сообщение, если хотите, сохраните и закройте! Сделано!

Примечание: это перезапишет git-sha из последней фиксации.

4. Удалите фиксацию из журнала git.

Итак, вы уже некоторое время играете с git и научились делать небольшие и независимые коммиты. Это облегчает вашу жизнь при поиске проблемы, и ваша история git также выглядит лучше.

Затем вы слышите от заинтересованного лица, что недавнее внедрение необходимо отменить. Вы можете подумать, что нет проблем! поскольку у вас есть небольшие и независимые коммиты, но как бы вы это сделали?

Если вы пытаетесь удалить только последнюю фиксацию, это довольно просто, вы можете просто запустить:

git reset --hard HEAD^

Но предположим, что ваш журнал git выглядит следующим образом:

* 97c8db67 fix: commit 3 is correct as well
* 69e04606 feat: commit 2 is correct
* 9f130ee1 fix: commit 1 needs to be removed

Если вам нужно удалить 9f130ee1 git-sha («необходимо удалить фиксацию 1»), вы можете выполнить интерактивную перебазировку:

git rebase -i HEAD~3

Где 3 - это количество коммитов, которые вы собираетесь искать, прежде чем выбрать, какие из них вы хотите удалить. Затем откроется текстовый редактор с таким содержимым:

pick 9f130ee1 fix: commit 1 needs to be removed
pick 69e04606 fix: commit 2 is correct
pick 97c8db67 fix: commit 3 is correct as well

Если мы просто заменим «pick» на «drop» в первой строке и сохраним файл, готово! Фиксация 9f130ee1 будет отключена!

  • Имейте в виду, что это отличается от git revert, он полностью удалит фиксацию и перезапишет историю git, что может быть плохой практикой, если вы уже нажали ее.
  • Если фиксация ПОСЛЕ удаленной фиксации зависит от удаленной фиксации, вам, вероятно, придется разрешать конфликты вручную.

5. Редактирование старого сообщения о фиксации.

Вы только что заметили некоторые орфографические ошибки в некоторых сообщениях о коммитах и ​​хотели бы исправить их.

Очень похоже на последний совет, вы можете запустить:

git rebase --interactive HEAD~3

Подождите, пока откроется текстовый редактор, и замените «выбрать» на «reword», затем сохраните и выйдите.

Есть много вещей, которые вы можете сделать с помощью git rebase, и отредактировать старое сообщение коммита - одно из них. Ищите другие варианты, используя git rebase --interactive здесь.

6. Как сделать ребаз из ветки по умолчанию

Очень быстрый, но полезный совет, который я узнал от Тиаго Марека при перебазировании основной ветки в мой feature-branch: чтобы избежать знаменитого коммита слияния, который выглядит как «Объединить ветвь 'main' of… ' на нашем сайте. git история.

Вместо того, чтобы нажимать очень заманчивую кнопку под названием "Обновить ветвь" или просто использовать git pull origin main, вы можете просто:

git pull --rebase origin main

Это будет в основном:

  1. отменить свои локальные коммиты
  2. вытащить коммиты с пульта
  3. добавить свои локальные коммиты обратно

Если есть какие-либо конфликты с git, вам будет предложено разрешить их, прежде чем нажимать.

7. Получайте логи между двумя коммитами.

Еще один быстрый совет, который я усвоил (на этот раз от Thayse Onofrio) при устранении неполадок, - как получить журнал git между двумя разными коммитами.

git log --oneline 5a984958..49a7891a

Это было действительно полезно, чтобы увидеть разницу между последней развернутой версией и ранее развернутой версией приложения. Вы также можете сделать это с помощью Github, если это ваш случай:

Https://github.com/user/your_repository/compare/5a984958..49a7891a

  • Если вы замените .. на ... в приведенной выше ссылке, у вас будет немного другое представление.

Заключение

Эти команды спасали меня много раз. Если у вас есть что добавить, спросить или прокомментировать, дайте мне знать. Спасибо за прочтение.