Чи є спосіб редагувати повідомлення про фіксацію на GitHub?


129

Чи є спосіб відредагувати повідомлення про фіксацію після здійснення та натискання на GitHub? Я бачу, що є "додати примітку", а також вбудовані коментарі, але фактичного редагування повідомлення про фіксацію немає. Також у "git-розширеннях" є "змінити комісію", але це не редагує існуюче повідомлення.


Ви можете спробувати скасувати фіксацію (див. Деякі параметри цього питання: stackoverflow.com/questions/4114095/… ) - лише переконайтеся, що спершу створіть резервну копію будь-яких змін коду, щоб не втратити їх заради коментаря!
Подорож технічного хлопця

Відповіді:


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

    Це відкриє ваш редактор за замовчуванням (зазвичай ) зі списком комітетів та дій для кожного з них. За замовчуванням дія є pick.

  2. Для будь-яких зобов'язань, які ви хочете змінити, перейдіть pickна reword.

  3. Збережіть і закрийте (in vi:) :wq.

  4. Для кожної такої комісії ви отримаєте редактор для редагування повідомлення про фіксацію. Змініть його так, як вам здається, збережіть і вийдіть.

    Після того як ви закінчите редагувати всі повідомлення про фіксацію, ви повернетесь до командного рядка та матимете нове дерево з оновленими повідомленнями.

  5. Тепер ви можете завантажити їх у github, використовуючи git push origin --force.

Якщо вам просто потрібно виправити останню прихильність, ви можете замінити кроки 1-4 на git commit --amend.


3
@MatthewPeters Я припускаю, що має бути спосіб, але я не знаю - я безпосередньо використовую командний рядок.
Мурейник

4
Не здається, що ви можете вказати <зайняти хеш, який ви хочете змінити>, швидше вам потрібно вказати хеш коміту, який передує тому, який ви хочете змінити, або використовувати HEAD ~ x, де x - кількість комітетів від HEAD, де елемент, який ви хочете змінити, знаходиться.
ssc327

3
@ ssc327 Зауважте, що я ^там - я дійсно запропонував звільнити від батьків батьківський комітет, який ви хочете змінити.
Мурейник

2
@Murenik ви маєте рацію, я якось пропустив побачення ^
ssc327

1
@deadfish Використання командного рядка для Windows, необхідно ввести ^^для завершення команди з буквальним , ^ наприклад: git rebase -i 2c747b32^^
Уїк

35

У Intellij Idea це можна зробити так просто.

  1. Відкрити контроль версій (історія)
  2. Виберіть вкладку журналу
  3. Виберіть фіксацію, щоб змінити коментар
  4. натисніть F2 (Mac fn + F2) та оновіть повідомлення про фіксацію

1
Не працює, якщо ви вже натиснули на пульт.
виплата

8
Після цього вам доведеться стратити, git push origin --forceяк було запропоновано у відповіді @ Mureinik.
Дан Мадак

1
Параметр "Reword" вимкнено, якщо фіксація вже натиснута.
хуйз

1
Щоб зробити це за допомогою Intellij IDEA для компресу, який було натиснуто, спершу слід почати з інтерактивної ребази (як це було б зроблено з командного рядка Git). Для того, щоб зробити ребазу, клацніть правою кнопкою миші на вашому проекті -> "Git" пункт меню -> "Repository" -> "rebase ..." (останній пункт меню). Вставте 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окремі хеші цільових зобов'язань та батьківських зобов’язань окремо)

Рішення:

ви можете просто ввести наступні інструкції ...

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

Пояснення:

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

2

Іншим варіантом є створення додаткового "errata commit" (і натискання), який посилається на об'єкт "commit", який містить помилку. Новий елемент errata також забезпечує виправлення. Помилка errata - це команда, яка не має суттєвих змін коду, але важливе повідомлення про фіксацію - наприклад, додайте один символ пробілу у файл readme та виконайте це, змінивши важливе повідомлення про фіксацію, або скористайтеся опцією git --allow-empty. Це, звичайно, простіше і безпечніше, ніж повторне звільнення, воно не змінює справжню історію, і воно підтримує чистоту дерева гілок (використовуючиamendце також хороший вибір, якщо ви виправляєте останню комісію, але помилка errata може бути хорошим вибором для старих комісій). Такі речі так рідко трапляються, що просто документувати помилку досить добре. Надалі, якщо вам потрібно здійснити пошук у журналі git за ключовим словом функції, оригінальний (помилковий) комітет може не з’являтися, оскільки неправильне ключове слово було використано в цьому початковому фіксації (оригінальний помилка) - однак ключове слово з’явиться в комірі errata, який потім вкаже вам на оригінальний документ, який мав друкарський помилок Ось приклад:

$ git журнал
фіксувати 0c28141c68adae276840f17ccd4766542c33cf1d
Автор: Перший Останній 
Дата: Ср 8 серпня 15:55:52 2018 -0600

    Помилка Errata:
    Цей документ не змінює істотного коду.
    Ця фіксація надається лише для документального виправлення попереднього повідомлення про фіксацію.
    Це стосується здійснення об'єкта e083a7abd8deb5776cb304fa13731a4182a24be1
    Оригінальне повідомлення про неправильне здійснення:
        Колір фону змінено на червоний
    Виправлення (* зміна виділена *):
        Колір фону змінено на * синій *

фіксувати 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Автор: Перший Останній 
Дата: Ср 8 серпня 15:43:16 2018 -0600

    Деякі проміжні повідомлення про вчинення

фіксувати e083a7abd8deb5776cb304fa13731a4182a24be1
Автор: Перший Останній 
Дата: Ср 8 серпня 13:31:32 2018 -0600

    Колір фону змінено на червоний

Напевно, це безпечно, але багато тексту для читання. Я вважаю за краще переписувати історію :)
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. Зберегти та вийти, з’явиться сторінка редагування, схожа на метод №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.

Для отримання додаткової інформації читайте документ .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.