Есть ли способ отредактировать сообщение о коммите на GitHub?

130

Есть ли способ отредактировать сообщение о коммите после его отправки и отправки на GitHub? Я вижу, что есть «добавить заметку», а также встроенное комментирование, но нет фактического редактирования сообщения коммита. В расширениях git есть также «изменить коммит», но это не изменяет существующее сообщение.

Мэтью Питерс
источник
Вы можете попробовать отменить фиксацию (см. Некоторые варианты в этом вопросе SO: stackoverflow.com/questions/4114095/… ) - только убедитесь, что вы сначала сделали резервную копию любых изменений кода, чтобы не потерять их ради комментария!
Путешествующий техник
Смотрите также Как мне отредактировать неверное сообщение о коммите в Git? Переполнение стека.
Арьян

Ответы:

184
  1. git rebase -i <commit hash you want to change>^

    Откроется редактор по умолчанию (обычно ) со списком коммитов и действий для каждого. По умолчанию действие есть pick.

  2. Для любого коммита, который вы хотите изменить, измените pickна reword.

  3. Сохраните и выйдите (в vi:) :wq.

  4. Для каждого такого коммита вы получите редактор для редактирования сообщения коммита. Измените его, как считаете нужным, сохраните и выйдите.

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

  5. Теперь вы можете загрузить их на GitHub с помощью git push origin --force.

Если вам просто нужно исправить свой последний коммит, вы можете заменить шаги 1-4 на git commit --amend.

Mureinik
источник
3
@ MatthewPeters Я предполагаю, что должен быть способ, но я не знаю - я использую командную строку напрямую.
Mureinik
4
Не похоже, что вы можете указать <хеш коммита, который вы хотите изменить>, скорее вам нужно указать хеш коммита, предшествующего тому, который вы хотите изменить, или использовать HEAD ~ x, где x - количество коммитов из HEAD, где элемент, который вы хотите изменить, находится.
ssc327
3
@ ssc327 Обратите внимание, что я ^там - я действительно предложил перебазировать родительский элемент коммита, который вы хотите изменить.
Mureinik
2
@ Мурник, вы правы, я почему-то пропустил просмотр ^
ssc327
1
@deadfish Используя командную строку Windows, вы должны набрать, ^^чтобы завершить команду литералом, ^ например: git rebase -i 2c747b32^^
Wyck
35

В Intellij Idea вы можете сделать это так просто.

  1. Открытый контроль версий (история)
  2. Выберите вкладку журнала
  3. Выберите совершить, чтобы изменить комментарий
  4. нажмите F2 (Mac fn + F2) и обновите сообщение о коммите
fedrbodr
источник
1
Не работает, если вы уже нажали на пульт.
выплатить
8
Вы должны выполнить git push origin --forceвпоследствии, как предложено в ответе @ Mureinik.
Дэн Макак
1
Опция «reword» отключена, если коммит уже был передан.
Huyz
1
Чтобы сделать это с Intellij IDEA для коммита, который был выдвинут, вы должны сначала начать с интерактивной перебазировки (как вы это сделали бы из командной строки Git). Чтобы выполнить ребазинг, щелкните правой кнопкой мыши по вашему проекту -> пункт меню «Git» -> «Репозиторий» -> «ребаз ...» (последний пункт меню). Вставьте SHA коммита перед тем, который вы хотите изменить, в поле «Onto» и нажмите «Rebase». После этого вы получите интерактивную подсказку о перебазировании. Выберите «reword» в выпадающем списке действий рядом с коммитом, который вы хотите изменить, и нажмите кнопку «Начать перебазирование» (продолжение в следующем комментарии)
jplandrain
1
(продолжение) Затем вам будет предложено текстовое приглашение для каждого коммита, который вы хотите изменить. После того, как сообщения журнала изменены, вы можете применить дальнейшие изменения (обратите внимание, что теперь опция «reword» больше не отображается серым цветом). Когда вы закончите, вы можете принудительно нажать ваши изменения, чтобы завершить интерактивное обновление. Весь процесс в точности такой же, как в ответе @Mureinik, который делает это из командной строки.
jplandrain
3

Предпосылка:

если ваш git-график выглядит так ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192и b7ec061являются хешами коммитов target-commit и parent-commit, отдельно)

Решение:

Вы можете просто ввести следующие инструкции ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Объяснение:

  1. git reset --soft b7ec061 сохранит ваши изменения файлов и сбросит их в parent-commit (т.е. b7ec061)
  2. git commit -m "..." локально создаст новый коммит
  3. git push -f подтолкнет ваш новый коммит к серверу и заменит старый (т.е. df9c192)
Alumi Lu
источник
2

Другой вариант - создать дополнительную «фиксацию ошибок» (и push), которая ссылается на объект фиксации, содержащий ошибку - новая фиксация ошибок также обеспечивает исправление. Ошибочная фиксация - это фиксация без существенных изменений кода, но с важным сообщением о фиксации - например, добавьте один пробел в ваш файл readme и зафиксируйте это изменение с важным сообщением фиксации или используйте опцию git --allow-empty. Это, конечно, проще и безопаснее, чем перебазирование, оно не изменяет истинную историю и сохраняет дерево ветвей чистым (используяamendтакже хороший выбор, если вы исправляете самый последний коммит, но ошибочный коммит может быть хорошим выбором для более старых коммитов). Этот тип вещей случается так редко, что достаточно просто документировать ошибку. В будущем, если вам потребуется выполнить поиск в журнале git по ключевому слову функции, оригинальная (ошибочная) фиксация может не появиться, поскольку в этой оригинальной фиксации использовалось неправильное ключевое слово (оригинальная опечатка) - однако ключевое слово появится в сообщении об ошибке, которое затем укажет вам исходный коммит с опечаткой. Вот пример:

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Автор: Первый Последний 
Дата: ср. 8 августа 15:55:52 2018 -0600

    Ошибочные коммиты:
    Этот коммит не имеет существенного изменения кода.
    Этот коммит предоставляется только для документирования исправления к предыдущему сообщению коммита.
    Это относится к фиксации объекта e083a7abd8deb5776cb304fa13731a4182a24be1
    Исходное неверное сообщение о коммите:
        Изменен цвет фона на красный
    Исправление (* изменение выделено *):
        Изменен цвет фона на * синий *

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Автор: Первый Последний 
Дата: ср. 8 августа 15:43:16 2018 -0600

    Некоторое временное сообщение о коммите

commit e083a7abd8deb5776cb304fa13731a4182a24be1
Автор: Первый Последний 
Дата: ср. 8 августа 13:31:32 2018 -0600

    Изменен цвет фона на красный
rob_7cc
источник
Конечно, это безопасно, но много текста для чтения. Я предпочел бы переписать историю :)
pkalinow
0

Ответ @Mureinik хорош, но не понятен новичку.

Первый метод:

  1. Если вы хотите отредактировать только последнее сообщение о коммите, вам нужно только git commit --amend:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Как видите, передайте сообщение сверху без префикса команды, например pick, это уже страница редактирования, и вы можете напрямую отредактировать верхнее сообщение и сохранить и выйти , например:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Тогда делай git push -u origin master --forceили <how you push normally> --force. Ключ здесь --force.

Второй метод:

  1. Вы можете увидеть коммит хеша git logили извлечь из репозитория URL, например, в моем случае это881129d771219cfa29e6f6c2205851a2994a8835

  2. Тогда вы можете сделать git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835или git rebase -i HEAD^(если последний)

  3. Вы бы увидели:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# 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
  1. Но если вы видите, что noopвы, вероятно, печатаете неправильно, например, если вы делаете то, git rebase -i 881129d771219cfa29e6f6c2205851a2994a88что пропущено ^в конце, вам лучше выйти из редактора без сохранения и выяснить причину:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Если noopпроблем нет , просто измените слово pickна reword, остальное просто остается (вы не редактируете сообщение коммита в данный момент), например:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Save & quit увидит страницу редактирования, аналогичную методу №1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Отредактируйте сообщение сверху, как в методе № 1, и сохраните и выйдите, например:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Опять же, как метод № 1, делать git push -u origin master --forceили <how you push normally> --force. Ключ здесь --force.

Для получения дополнительной информации, пожалуйста, прочитайте документацию .

林果 皞
источник