Відповіді:
Використовуйте git rebase --interactive HEAD~4
та встановлюйте edit
параметр для коміту, який ви хочете змінити.
Пам’ятайте, що не слід таким чином змінювати коміти, що надсилаються до віддаленого сховища. У такому випадку краще додати новий коміт із відсутнім файлом.
git push -f
якщо я впевнений, що вище течія не змінилося?
add
використовував пропущені файли, тому я зробив посилання на "xxx" як повідомлення. Потім я виконав команду rebase і змінив команду "xxx" з "pick" на "edit". Тоді я зробив "git rebase - продовжувати". Тепер, коли я дивлюся на історію, у мене є "ххх" як остання фіксація, а попередня фіксація, до якої я хотів додати їх, не змінюється! Цікаво, де була моя помилка?
Я усвідомлюю, що люди можуть google і прийти сюди, щоб знайти більш просту відповідь: Що робити, якщо це був лише останній вчинок? (Питання ОП полягає у фіксації 4-ї комісії ще в історії)
У випадку, коли ви здійснюєте та розумієте, що забули додати якийсь файл негайно , просто зробіть:
# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit
# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit
Де --no-edit
збережеться те саме повідомлення про фіксацію.
Простенька!
--amend
є різні хеши
HEAD^4
. Це нормально, як є, лише як доповнення для довідки. ;)
Якщо ви НЕ пересунули ці 4 коміти, ви можете зробити це наступним чином:
Створіть файли виправлень для всіх цих комітів:
git format-patch -4
Перемотати назад на 4 коміти:
git reset --hard HEAD~4
Додати відсутній файл:
git add missing-file
Зверніть це з --amend
:
git commit --amend
Застосувати всі збережені виправлення назад:
git am *.patch
Якщо ви натиснули, НЕ слід використовувати цей метод. Натомість просто визнайте свою помилку та створіть ще одну фіксацію поверх HEAD, яка вирішує цю проблему.
git format-patch
/ git am
набагато краще. Найголовніше, це надає вам більше впевненості, якщо ви щось псуєте - коміт, збережений як виправлення у фізичному файлі, є вашим найкращим захисним мережею.
git gc
:)
rm *.patch
)
Незважаючи на те, що прийнята відповідь є правильною, вона не має детальних інструкцій щодо того, як виконати редагування комітету під час процесу відновлення.
По-перше, запустіть процес відновлення бази даних:
git rebase --interactive HEAD~4
Список фіксацій буде представлений, виберіть Комміт ви хочете відредагувати, змінивши слово pick
в edit
і зберегти файл.
Внесіть необхідні зміни у свій код (не забудьте викликати git add
нові файли)
Після того, як всі модифікації будуть зроблені, видайте git commit --amend
- це дозволить змінити зобов’язання, позначене якedit
Викликати, git rebase --continue
що завершить процес (якщо є більше комісій, позначених як edit
, вищезазначені кроки потрібно повторити)
Важливі примітки:
НЕ видаляйте рядки, позначені такими, pick
які ви не хочете редагувати - залиште їх такими, як є. Видалення цих рядків призведе до видалення відповідних комісій
GIT примушує вас до stash
випуску, якщо ваш робочий каталог не є чистим; Ви можете, проте, git stash pop / git stash apply
під час ребазування, щоб змінити ці зміни (тобто зміни, приховані перед початком процесу відновлення), до комітету, позначеного якedit
якщо щось пішло не так, і ви хочете повернути зміни, внесені під час процесу відновлення, перед тим, як він закінчився (тобто ви хочете повернутися до точки перед початком відновлення), використовуйте git rebase --abort
- також читайте: Як скасувати інтерактивну ребауз, якщо --abort doesn ' т працює?
Як сказано у прийнятій відповіді:
Пам’ятайте, що ви не повинні змінювати комісії, висунуті у віддалений сховище таким чином. У цьому випадку краще додати нову комісію з відсутнім файлом.
Відповідь чому, є у Git Book (параграф під назвою " Небезпеки звільнення "):
Не перебазуйте коміти, які існують поза вашим сховищем.
Якщо ви будете дотримуватися цих вказівок, у вас все буде добре. Якщо ви цього не зробите, люди будуть ненавидіти вас, і ви будете зневажати друзів та родичів.
Коли ви перебазуєте матеріали, ви відмовляєтеся від існуючих комітів і створюєте нові, схожі, але різні. Якщо ви куди-небудь натискаєте комітети, а інші витягують їх і базують на них роботу, а потім ви переписуєте ці комісії з git rebase і знову підштовхуєте їх, вашим співробітникам доведеться знову об'єднати свою роботу, і все стане брудно, коли вони намагаються потягніть їх роботу назад у вашу.
[...]