Додати зміни до попереднього комітету з Magit


43

У мене 2 коміти, А потім Б, готові до поштовху. Я розумію, що забув щось додати в А.

Як я можу додати цю зміну до A за допомогою Magit? Я навіть не знаю, на яку частину документації Git я повинен дивитися.

Відповіді:


68

Давайте на мить зробимо вигляд, що ви хочете додати щось у HEADфіксацію, тобто "другий фіксатор B" у вашому прикладі.

Спливаюче вікно набору даних cмає обов'язкове " aЗмінити". Якщо натиснути цю клавішу, ви "зміните" поетапні зміни в HEADкоміті. Оскільки комісії не змінюються в Git, це фактично замінить стару команду новою. Буфер зі старим повідомленням фіксації з’явиться, так що ви можете змінити його, якщо додана зміна також вимагає, щоб ви відкоригували повідомлення. Як завжди, натисніть, C-c C-cколи ви закінчите редагування повідомлення. Це еквівалентно запуску git commit --amendв командному рядку.

  • a Змінити - додати поетапні зміни до HEADта відредагувати повідомлення про фіксацію

Оскільки часто трапляється, що вам потрібно лише скорегувати зміни або повідомлення, Magit надає два додаткові варіанти:

  • e Extend - додайте поетапні зміни до HEADредагування повідомлення про фіксацію
  • w Reword - змінити повідомлення HEADбез додавання до нього поетапних змін

Якщо ви хочете відредагувати документ, який не є HEAD, то вищезгадане не вийде. Ці команди завжди "змінюють" (тобто замінюють) HEADфіксацію. Git не надає жодної команди для зміни іншого комітету, окрім HEADцього, це дещо більше.

Magit дійсно надає таку команду, але оскільки є ситуації, коли бажано робити це у кілька етапів, ми обговоримо це спочатку.

Змінення комітету, відмінного від, HEADможна розділити на три етапи:

  1. Тимчасово зробити , що інші роблять ( A) HEAD.
  2. Змініть HEAD(як описано вище), що призведе до фіксації A'.
  3. Скажіть Git повторно застосувати наступні зобов’язання A, але згодом A'.

Це можна зробити за допомогою інтерактивної бази даних. Введіть, rщоб відобразити спливаючу базу даних. Потім введіть mдля виклику варіанту редагування "редагування комісії". З'являється буфер із останніми комісіями. Перейдіть до зобов'язання, яке ви хочете змінити, і введіть, C-c C-cщоб вибрати його Потім Git перемотає історію до цього фіксу та показує інформацію про поточну ребазу в буфері стану.

Змініть, HEADяк описано вище. Потім скажіть Git, що ви все зробили, набравши текст r r. Якщо A'і Bконфлікт, то перезавантаження зупиниться на Bі вам доведеться вирішити конфлікт. Після цього натисніть, r rщоб продовжити.

Якщо ви знаєте, що ваші зміни в Aрезультаті призведуть до конфлікту B, виконайте такі дії, як описано вище, інакше використовуйте наступний підхід.


Git дозволяє створювати "виправлення фіксує" за допомогою git commit --fixup A. Це створює новий комітет, який записує зміни, які "мали бути внесені в інший комітет". Ця фіксація стає новою HEAD. Існує також --squashваріант. Інформацію про відмінності див. На git-commitсторінці чоловіка.

Щоб насправді поєднати команду Aта нову комісію, A'а потім знову застосувати Bповерх того, вам доведеться використовувати ребазу. Magit забезпечує зручну команду для цього r f.

Основна відмінність вищезазначеного підходу полягає в тому, що тут ми спочатку створюємо нову команду, а потім перезаписуємо, щоб поєднати це з "ціллю" та повторно застосувати B. Вище ми почали з звільнення, а не з зобов'язань.

У програмі Magit як --fixupі --squashваріанти, так і варіанти доступні з спливаючих вікон фіксування, на fта s. Але Magit також пропонує "миттєві" варіанти команд для фіксації та сквош на Fі S. Ці варіанти створюють нову команду на зразок "невідкладених" варіантів, але потім вони миттєво поєднують фіксацію фіксації з цільовим комітетом за допомогою ребазування, не потребуючи виклику іншої команди.

"Миттєве виправлення" ( c F) - це по суті те саме, що і "розширити HEAD" ( c e), за винятком того, що він працює для будь-якої фіксації, а не лише HEAD.


Подальше читання:


Кристально чистий! Дякую, чудовий пакет BTW.
Матьє Маркес

1
Що ж, я думаю, що у другій половині моєї відповіді є деякі м'які частини. Але щоб уникнути тих, мені доведеться подвоїти цю довгу відповідь, тому я радий, що це працює для вас ;-)
tarsius

Дякую за цю відповідь тарсій, це справді працює для мене.
anquegi

Чіткість першої половини цього пояснення змушує читати другу половину, яку дотримуватися набагато важче, досить розчаровує!
Лін Хедлі

git-commitman page переспрямовує, до git-rebase(1)яких є ці рядки: Запропоноване повідомлення фіксації для складеного комітету - це з'єднання повідомлень про виконання першого коміту та тих, хто має команду "сквош", але опускає повідомлення про фіксацію комітетів за допомогою "fixup" командування. IOW, використовуйте fixup, якщо ви просто хочете виправити код у попередньому фіксації, використовуйте сквош, якщо ви також хочете виправити повідомлення про фіксацію.
Ясусі Шоджі

3

git commit --amend –C HEAD- це команда Git, яку ви хочете шукати, і ви можете вносити зміни в Magit за допомогою C-c C-a.


Я використовую найновішу версію Magit, C-c C-aце зі старої версії (я думаю). Крім того, я не бачу жодного сліду "внесення змін" у довідковий буфер ( ?).
Матьє Маркес

Дивіться відповідь Ремі на еквівалент магніту 2.x.
nпостаs

3

Отже, один робочий процес:

  • внести свої зміни
  • c (фіксувати) f (виправлення - вибрати фіксувати своє виправлення)

Потім

  • r (повторна база даних) -a (автоматичне падіння, може бути дефолт) i (інтерактивне)

Авторозмикання автоматично перемістить усі! Fixup фіксації в потрібне місце і встановить їх, щоб вони повернулися на повторну базу.


Єдине, що я зробив, що ти не сказав, - це перейти між першою кулею і другою. Удар iдає мене Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.. За винятком того, що я не маю жодних неспроможних змін. : /
Матьє Маркес

Спробував ще раз після того, як витягати, Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort. Чи намагаєтесь я сказати мені, що моє виправлення може з'явитися під час майбутнього злиття?
Матьє Маркес

@MathieuMarques: "За винятком того, що я не маю жодних неспроможних змін", - Git вважає, що ви робите. Зверніть увагу, що повідомлення пропонує поетапні зміни, а не незмінені. Re: merge in rebaseдивіться КУПИ під git help rebase. Я пропоную зробити виправлення, перш ніж тягнути за течією.
npostavs

1

Для внесення змін до останнього комітету це "c a". Виправлення призначено для внесення змін до деяких старих комісій.


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