Як я можу скасувати "git commit" локально та віддалено після "git push"


242

Я виступав git commitза ним git push. Як я можу відновити ці зміни як на локальних, так і віддалених сховищах?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

Відповіді:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(Приклад натиснути: git push -f origin bugfix/bug123)

Це скасує останню фіксацію та відсуне оновлену історію на віддалений. Вам потрібно пройти це, -fоскільки ви замінюєте історію вище за течією на віддалений.


24
Як варіант, використовувати git reset --hard <the-sha-you-want-to-return-to>.
Олександр Грос

2
Довідка називається HEAD (з урахуванням регістру)
dunni

26
Крім того, будьте обережні - AFAIK вам не слід робити цього, якщо інші люди вийшли з репо.
Амадан

1
@BipinVayalu Це впливає на галузь, на якій ви зараз перебуваєте. Точніше, ГОЛОВА. HEAD найчастіше "прикріплюється" до гілки (вказує на назву гілки, а не безпосередньо вказує на коміт). Отже, загалом кажучи, це вплине на галузь, на яку вказує HEAD. Використовуйте, git log --decorate --onelineщоб дізнатись, куди вказує ваша СЕКЦІЯ.
Олександр Грос

4
git reset HEAD~1якщо ви не хочете, щоб ваші зміни пройшли (нестандартні зміни). Змініть, git push -f [origin] [branch]
введіть

161

Як правило, зробіть "обернену" команду, використовуючи:

git revert 364705c

потім надішліть його в пульт як зазвичай:

git push

Це не призведе до видалення комітету: воно робить додатковий фіксатор, який скасовує все, що було зроблено першим. Все інше, не дуже безпечне, особливо коли зміни вже розповсюджені.


9
Це більш безпечна (таким чином, мабуть, краща) відповідь, ніж відповідь Олександра Гроса (обрана відповідь).
Грейк

6
@Graeck Кожне з рішень має свої наслідки та переваги.
Олександр Грос

5
Це має бути прийнятою відповіддю, найкраще практика ніколи не переписувати історію, навіть більше, якщо співпрацювати з командою. git resetприймається лише в тому випадку, якщо ви все ще не натиснули зміни на сервер.
Джозеу Олександр Ібарра

17
@JosueIbarra Я не згоден у всіх випадках. У більшості випадків так, не слід переписувати історію. Однак я вважаю, що є законні випадки, коли ви абсолютно повинні. Наприклад, ви випадково скопіюєте файл із секретами. Це не повинно бути в репортажі. Тож ви можете швидко її видалити, використовуючи прийняту відповідь тут.
bfcoder

11
@bfcoder, якщо ви натиснули "секрет" на віддалений репо, це вже не секрет. І правильне виправлення - створити новий секрет, а не намагатися приховати свою помилку.
ербсман

41

Перш за все, розслабтесь.

"Нічого не під нашим контролем. Наш контроль є простою ілюзією", "Помилятися - це людина".

Я розумію, що ви ненавмисно підштовхнули свій код remote-master. ЦЕ буде добре.

1. Спочатку отримайте SHA-1значення комітету, який ви намагаєтеся повернути, наприклад, виконувати команду для управління гілкою. запустіть це:

git log

ви побачите купу 'f650a9e398ad9ca606b25513bd4af9fe ...', як рядки разом із кожним із комітетів. скопіюйте цей номер з комітету, який потрібно повернути назад .

2. Тепер введіть команду нижче:

git reset --hard your_that_copied_string_but_without_quote_mark

ви повинні побачити повідомлення типу "HEAD зараз у". вам зрозуміло. Що тільки що зробили - це відобразити цю зміну на місцях.

3. Тепер введіть команду нижче:

git push -f

ви повинні бачити, як

"попередження: push.default не встановлено; його неявне значення змінилось у ..... ... Всього 0 (дельта 0), повторно використане 0 (дельта 0) ... ... ваше_бран__назва -> головне (примусове оновлення) . "

Тепер вам все зрозуміло. Повторіть перевірку майстра з "git log", ваш fix_destination_commit має бути вгорі списку.

Вас вітають (заздалегідь;))

ОНОВЛЕННЯ:

Тепер змін, які ви внесли до того, як все це почалося, тепер уже немає. Якщо ви хочете повернути ці наполегливі дії знову, можливо. Завдяки git reflog та git cherry-pick командам .

Для цього я б запропонував, будь ласка, слідкуйте за цим блогом чи цим дописом .


добре вказати віддалений та гілку також, коли ви робите "git push -f", але "git push -f" буде працювати все одно більшу частину часу
Робсон

8

git reset HEAD~1якщо ви не хочете, щоб ваші зміни пройшли (нестандартні зміни). Змініть, введіть і натисніть зновуgit push -f [origin] [branch]


3

Ви можете зробити інтерактивну базу даних:

git rebase -i <commit>

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

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

Дивіться це запитання: Git: видалення вибраних комісій із сховища


3

Спробуйте використовувати

git reset --hard <commit id> 

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

потім натиснути

git push -f <remote> <branch>

2

Як варіант:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Примушуйте головну гілку віддаленого сховища початкового джерела до батьків останнього комітету

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