Як я переформулюю перше повідомлення про виконання git?


116

У мене є робоче дерево, яке містить 3 коміси:

➜ ~ myproject git: (майстер) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <my@mail.com>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

Тепер я хочу rewordнадіслати повідомлення про своє перше вчинення (6707a66)

➜ ~ myproject git: (майстер) git rebase -i 6707

(… Введення vim)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# 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
#
# 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

У цьому випадку я хочу виправити ( rewordв git парламенті) відповідне повідомлення про виконання:

Початкові зобов’язання (з оманом)

… До чогось відповідного.

Не дивно, що моя спроба вище не вдалася, оскільки в першому вчиненні явно немає жодного з батьківських зобов'язань. (А коли вам потрібно rebase, вам потрібно посилатися на наступне найдавніше зобов’язання перед тим, яке ви хочете reword, правда?)

Суть мого питання, таким чином, чи можете ви досягти цього будь-якими іншими способами?


Або ви могли просто залишити його на весь час як химерність дивовижного
Крістофер


^ Дуже правда ... Я думав, що правильно шукав саме це питання, але це те саме, що і моє. Існує величезна кількість вдосконалення копірайтинг мого питання. :-P
Генрік

1
@hced: :) ваше копірайтинг не марнує - це допоможе іншим людям знайти рішення в майбутньому, навіть якщо його закрити як дублікат
Марк Лонгейр

2
Кожен, хто стикається з цим питанням, може знайти мою відповідь на зміну повідомлення першого зобов’язання? (git) бути корисним.

Відповіді:


214

Зробіть git rebase -i --root

(вкажіть на rootзамість того, щоб вказувати на певний комітет)

Таким чином, перша комісія також включається, і ви можете просто rewordтак, як і будь-яке інше.

--rootВаріант був введений в Git v1.7.12(2012). До цього єдиним варіантом було використання filter-branchабо --amend, що зазвичай важче зробити.

Примітка: див. Також подібне запитання та відповідь .


12

Ви завжди можете використовувати git filter-branch --msg-filter:

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master

1
fork0: Це чудово, дякую. Цікаво, чи це слід вважати "законною" практикою, оскільки немає кращого слова. Я маю на увазі, чи часто / рекомендується це робити так? Крім того, чи можете ви робити це ще раз у випадках із несправними повідомленнями про вчинення? Причина просити це тому, що я вперше зробив це з помилковою фіксацією SHA-1, скопіювавши ваш фрагмент (ваш останній випадок, тоді як я хотів змінити перший). Після повторного використання команди, цього разу з правильним SHA-1 (перша фіксація; 6707a66), вона наклала на мене удар.
Генрік

Ну, це звичайне :) І так, ви можете це повторити. Якщо ви просто додасте, -fвін буде продовжуватись і завжди переписуватиметься команди даної гілки. Опорне значення гілки від першого разу було збережено refs/original/master, перш ніж запустити команду.
fork0

Звичайно, ви можете просто видалити (або перейменувати) збережену посилання.
fork0

2
Я оновив код, щоб переконатися, що помилка з скопійованим ідентифікатором фіксації не відбулася. Тепер код навіть копіюється. Слово попередження , однак: воно не працює правильно, якщо є більше однієї початкової фіксації (тобто, коли ви об’єднали дві або більше неспоріднених гілок)
fork0

3
@hced: Вам слід пам’ятати, що переписання будь-якого комітету, який вважається «опублікованою історією», як правило, є поганою ідеєю. У вашому випадку це означатиме, що ви, як правило, не повинні цього робити, якщо хтось коли-небудь працював би над командою, яка мала ваш корінний прихильність як предка.
Марк Лонгейр

12

Суть pcreux - це хороший спосіб переформулювати першу команду:

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master

3
За мерзотнику 1.7.12 , git rebase -i --rootце шлях, як це було запропоновано florisla.
Дуглас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.