Git: редагуйте лише повідомлення попередніх комісій


12

З ледачих причин я підштовхнув купу комітетів із повідомленнями за замовчуванням, і тепер це стало громіздко, оскільки я не знаю, що я змінив у кожній комісії.

Як редагувати лише повідомлення попередніх комітетів та (якщо можливо) зберігати дерево фіксації?


10
Остерігайтеся зміни публічної історії!
D. Ben Knoble

2
Я побоююся, що відповіді тут не дають вам майже достатньо гострих попереджень. це буде створити величезний безлад , якщо хто - то витягнув свою історію в той же час - все Moreso , якщо вони скоїли нову роботу поверх нього!
Eevee

Я буду використовувати це з причиною, у мене тут простіший випадок, я єдиний, хто використовує це репо.
Туйен Фам

3
Інформація: про це вже запитують (можливо, багато разів) у стеку Overflow .
користувач202729

Відповіді:


20

Щоб відредагувати повідомлення про фіксацію серії комітетів, я запускаю

git rebase -i firstsha

де firstshaє ідентифікатор для батьківського комітету першого комітету, який я хочу відредагувати. (Ви можете використовувати будь-яку дійсну посилання тут, тому git rebase -i HEAD~4буде показано останні чотири комісії.)

У редакторі, що відкриється, змініть усі записи "вибору" на "перейменувати" на комісіях, які ви бажаєте змінити, а потім закрийте редактор; потім буде запропоновано ввести повідомлення про фіксацію для всіх обраних вами зобов'язань.

Зверніть увагу , що це буде змінити дерево зробити, тому що хеші коммітов зміниться. Вам доведеться змусити натиснути своє нове дерево або перенести його на нову гілку. Це також зіпсує злиття, тому уникайте редагування об'єднань.

Щоб швидко відредагувати лише останню комісію, запустіть

git commit --amend

(однак остерігайтеся будь-якого інсценованого вчинку).


Як це вплине на дерево комітів, чи створить проміжну вертикальну лінію в дереві комітів? Зараз у мене було лише одне дерево вертикальних рядків, і понад 100 повідомлень потрібно змінити.
Туйен Фам

3
Це не створить новий "рядок" у вашому дереві фіксів, він змінить усі зобов'язання. Якщо ваша історія зараз лінійна, вона залишатиметься лінійною.
Стівен Кітт

Це залежить. Ви використовуєте його самостійно і не натискаєте на сервер? Тоді ні, лише одна «лінія». Але в іншому випадку їх може бути два, і виходячи з ваших відповідей на перші два, ми можемо допомогти вам позбутися старого "рядка".
Людина капітана

1
У Rebase є прапор для обробки злиття (я думаю, що це preserve-merges)
D. Ben Knoble

6

Що ви шукаєте, так і є git rebase.

Якщо ви бажаєте лише змінити попереднє git commitповідомлення, тоді вам потрібно скористатися лише наступним:

git commit --amend

І внесіть потрібні зміни до попереднього вступу, а потім збережіть зміни.

Однак якщо вам потрібно змінити старі зобов’язання, які вам потрібно використовувати rebase.

git rebase -i HEAD~N 

де N дорівнює кількості комісій, на які ви хочете повернутися, наприклад, 2 або 12, 6 тощо, тощо.

Тут ви повинні отримати текстовий редактор зі своїми комітами. Зміна параметрів від pickдо , rewordщоб змінити повідомлення.

Виявивши всі зобов'язання, які ви хочете змінити, і належним чином змінили їх параметри, збережіть і закрийте редактор. Потім внесіть зміни в кожне повідомлення про фіксацію. Після задоволення ви можете запустити:

git push --force

І вам слід було б підтримувати свою історію git, хоч і з різними значеннями хешу, оскільки ви внесли необхідні зміни. Ось кілька додаткових посилань, які слід ознайомити:

7.6 Інструменти Git - Історія перезапису
Довідка GitHub - Зміна повідомлення про
коммісію StackOverflow - Питання про зміну старих повідомлень про фіксацію


Якщо ви "переробите", вам не потрібно " commit --amend", якщо ви якимось чином не зіпсуєте процес вчинення.
Стівен Кітт

Спасибі, ось кроки , які я буду робити , як я розумію з вашого поста: 1. зробити git rebase -i firstshaщо firstshaє батьком зробити хеш коммітов , що я хотів би змінити повідомлення, то в редакторі, зміна pickдо reword, enterнове повідомлення, то питання git rebase --continueі робити git push --force?
Туйен Фам

@StephenKitt, я щойно помітив твою відповідь, я робив свою, коли ти подав свою. Я буду дотримуватися ваших порад і буду шукати, щоб внести зміни. Якщо це більш доречно, я можу злити свою відповідь до вашої, додавши посилання до ваших, якщо ви вважаєте, що це краще відповідатиме цьому питанню, ніж мати кілька подібних відповідей.
kemotep

@TuyenPham вам потрібно зробити git rebase -i HEAD~Nлише те, що N - це кількість комісій, які ви хочете піти. Змініть кожен варіант фіксації, з якого ви хочете відредагувати повідомлення, pickдо reword, збережіть цей файл, внесіть зміни до кожного з цих файлів фіксації та збережіть їх. Після того, як ви впевнені, ви все зробите, потрібно лише git push --force [Name of git branch you are were working on]. Ви завжди можете повернутися назад і зробити це заново або робити це поетапно.
kemotep
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.