Видаліть git-комітку, яку не натискали


722

Я зробив це, git commitале ще не перемістив його до сховища. Тож коли я це роблю git status, я отримую "# Ваша гілка випереджає" господар "на 1 комітку.

Тож якщо я хочу відмовитись від своєї головної комісії, чи можу я просто зробити:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

враховуючи, що коли git logя отримую:

фіксувати eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Дата: вівторок 29 вересня 11:21:41 2009 -0700


зробити db0c078d5286b837532ff5e276dcf91885df2296
Дата: Вт 22 вересня 10:31:37 2009 -0700

9
Це запитання є дублікатом іншого Вашого власного запитання: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Брайан Кемпбелл



3
НЕБЕЗПЕЧНО: це reset --hardможе призвести до втрати роботи, оскільки це призводить до перезапису ваших локальних файлів (вашої нової роботи) git з файлами з Інтернету (трапилося зі мною). У запитаннях та відповідях щодо git слід чітко вказати, що виконують їх команди та які ризики для читачів слід.
OrangeSherbet

Відповіді:


673

На насправді, коли ви використовуєте git reset, ви повинні звернутися до фіксації , що ви скидання до ; тож ви хочете скористатися db0c078, мабуть,

Простішою версією було б git reset --hard HEAD^повернення до попереднього зобов’язання перед поточним керівником; таким чином вам не потрібно копіювати ідентифікатори комісій.

Остерігайтеся будь-яких дій git reset --hard, оскільки ви можете втратити будь-які непомітні зміни. Ви можете перевірити, git statusчи впевненість у тому, що ваша робоча копія чиста, чи ви хочете зняти будь-які зміни.

Крім того, замість HEAD ви можете використовувати origin/masterяк посилання, як запропонував @bdonlan у коментарях:git reset --hard origin/master


374
Або git reset --hard origin/masterповернути його до того, звідки було походження.
бдонлан

1
Іншим корисним покажчиком, на який можна скинути, є ORIG_HEAD або його узагальнення, використовуючи reflog HEAD @ {1} (остання позиція HEAD).
Якуб Нарбський

12
Читач, перед вами git resetсвій код. Робіть собі прихильність: різниця між reset, reset --softта reset --hard(Що трапляється з вашою раніше git addaka "твоєю роботою" :) Фото: посилання
user18099

3
Зауважте, що це видалить усе, що було в комітті, яке ви хочете видалити (так git status, атрибут не покаже жодних змін, і комісія буде видалена / зміни будуть втрачені).
Bjørn Børresen

12
ПРИМІТКА. Будьте уважні при використанні, git reset --hard HEAD^оскільки ви втратите зміни в зафіксованих файлах (ви зміни буде видалено). У цьому питанні є дві гілки: Щоб скасувати зобов’язання, але все-таки змінити на диску, зробіть цеgit reset --soft HEAD~1
papigee

625

ЯКЩО ви НЕ перенесли зміни на віддалений

git reset HEAD~1

Перевірте чистий робочий екземпляр git status.

ELSE ви змінили зміни на віддалений

git revert HEAD

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


34
Це відповідає на "Видалити останню комісію git, яку не було натиснуто" (найближча відповідь ІМХО)
П'єр де ЛЕСПІНАЙ

25
Крім того, він зберігає локальні зміни, зроблені в останньому комітеті, в той час як git reset - твердий не
Станімір Стоянов

1
для мене це скасує останнє підштовхування та невдалене скоєння
CodyChan

git revert HEAD для мене щойно видалив усі файли, які я був готовий надіслати. Будь обережний!
Джейсон Брюс

159
git reset --hard origin/master

щоб відновити його до того, де було походження.

Про це написав @bdonlan у коментарях . Цю відповідь я додав для людей, які не читають коментарів.


4
Це питання було задано майже 5 років тому, і це вже в одному з коментарів.
Anubian Noob

1
Що робити, якщо поточна локальна філія відрізняється від master- я повинен використовувати origin/mybranchтоді?
Павло Власов

9
Я зазвичай не читаю коментарів, коли я поспішаю з відповіддю ... Дякую за те, що я поставив відповідь (простий, який працює)
Леонардо Алвеш Мачадо

Попередження: майте на увазі, що це видалить усі ваші існуючі зміни коду, окрім git reset HEAD~яких лише повертає фіксацію коду
Mayer Spitzer

69

У цьому питанні є дві гілки (Відмова комісії не означає, що я хочу втратити всі свої локальні зміни):

1. Щоб відновити останню фіксацію та скасувати зміни у скоєному файлі, виконайте такі дії:

git reset --hard HEAD~1

2. Щоб відновити останню фіксацію, але зберегти локальні зміни (на диску) :

git reset --soft HEAD~1

Ця команда (пізніша команда) приведе вас до стану, яким ви були б, якби ви це зробили git add.

Якщо ви хочете зняти файли після цього, зробіть це

git reset

Тепер ви можете внести більше змін, перш ніж додавати, а потім знову виконувати.


47

Просто введіть консоль:

$ git reset HEAD~

Ця команда відкидає всі локальні комісії перед віддаленою HEAD


7
Чи можете ви пояснити, що ваша відповідь додає до наявних відповідей?
nvoigt

Це знімає поточне зобов’язання перед натисканням - не повертаючи зміни, які ви внесли на місцевому рівні - як і інші відповіді - що може бути серйозним моментом виведення волосся
Грант

42

Я вірю, що один із них відповідатиме вашим потребам

1 - Скасувати фіксацію та зберігати всі файли поетапно: git reset --soft HEAD~;

2 - Скасувати зйомку та знеструмлення всіх файлів: git reset HEAD~;

3 - Скасуйте комісію та повністю видаліть усі зміни: git reset --hard HEAD~;

ось я знайшов відповідь


Цю відповідь потрібно прийняти: D
Аарон Джон Сабу

30

Видаліть останню фіксацію перед натисканням

git reset --soft HEAD~1

1означає останню фіксацію, якщо ви хочете видалити два останніх використання 2тощо, *


3
Привіт, Карина, згадка про --softце є чудовим доповненням до можливих відповідей, але ви могли б також зазначити чому? Пояснення вашого рішення завжди корисно. Також спробуйте дотримуватися англійської мови. Спасибі
Властиміл Овчачик

1
--soft- гарантує, що ви не втратите змін у файлі, чий документ ви намагаєтесь скасувати
papigee

19

Я пережив таку ж ситуацію, що я робив нижче, оскільки це набагато простіше. Пройшовши, commit-Idви можете дістатися до конкретного зобов’язання, яке ви хочете піти:

git reset --hard {commit-id}

Оскільки ви хочете видалити останню команду, commit-Idвам потрібно перенести туди, куди потрібно перемістити вказівник:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Просто попередження для новачків, як я - створити резервну копію будь-яких файлів, у яких потрібно ВІДНОВИТИ зміни, оскільки вони будуть повернені до попередньої версії. Мій сценарій полягав у тому, що я випадково помістив дамп бази даних у свій каталог репо, а потім здійснив - я, очевидно, не хотів вносити ці файли до репо, але DID хотів зберегти зміни, які я вніс до інших файлів. Тож мені довелося скопіювати та вставити необхідні зміни з резервної копії, яку я зробив перед тим, як виконати скидання git.
користувач1063287

10

Це те, що я роблю:

Перший замовлення вашого відділення (для моєї справи master):

git checkout master

Потім скиньте на віддалену HEAD ^ ( вона видалить усі ваші локальні зміни ), примусьте очистити та витягнути:

git reset HEAD^ --hard && git clean -df && git pull

1
Це дуже ядерний варіант. Я б запропонував м'яке скидання до обмеженої кількості комісій.
c0der512

3

Одним із способів є видалення локальної гілки та отримання цієї гілки з сервера, якщо ваша локальна філія випереджає декілька комітетів, і вам потрібно скасувати все.


блискуча відповідь - це дозволяє легко натиснути його на sourcetree :)
Kamil Kiełczewski

1

У мене просто була та сама проблема, і я закінчив робити це:

git rebase -i HEAD~N

(N - кількість комітів git покаже вам)

Це підкаже ваш текстовий редактор, а потім ви можете видалити потрібне зобов’язання, видаливши пов'язаний з ним рядок.

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