Скасувати git pull, як повернути репост до старого стану


1006

Чи є спосіб повернути або скасувати потягнення git, щоб моє джерело / репортаж прийшло до старого стану, який був до того, як робити git pull? Я хочу це зробити, тому що він об'єднав деякі файли, які я не хотів робити, а лише об'єднав інші файли, що залишилися. Отже, я хочу отримати ці файли назад, чи це можливо?

EDIT: Я хочу скасувати git merge для уточнення. Побачивши кілька відповідей, я це зробив

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Тепер, що мені робити? Це git reset --hard добре? Я не хочу його знову вкручувати, тому запитуючи детальні кроки?


23
Схоже, у вас є лише дві речі в історії: клон і прихід. Просто скиньте на клон:, git reset --hard 01b34faу цьому випадку ви могли б зробити, git reset --hard HEAD^що скидає одну команду перед головою.
jkp

2
--hard необхідний, якщо ви хочете змінити файли у своєму робочому режимі
William Pursell

3
@ seg.server.fault: якщо це спрацювало, завжди можна прийняти відповідь;)
jkp

7
git reset --hard HEAD ^
funroll

7
git reflogпокаже все, що було зроблено з git. Існує занепокоєння, яке git reset --hard [sha1 of something from reflog]поверне все, що показано в reflog, що іноді не є ціллю, наприклад. ви хочете повернути злиття на головну гілку, витягнуту з походження з поганими даними (трапляється), і після цього злиття ви працювали над іншими гілками. reflogпокаже кожну клітку на інших гілках. Але git checkout masterі git reset --hard [SH1 of commit on master branch just before merge]буде скинути лише поточну головну гілку, видаливши витягнуте злиття з походження.
Володимир Вуканак

Відповіді:


1427

Біг git pullвиконує такі завдання, щоб:

  1. git fetch
  2. git merge

Крок злиття поєднує гілки, налаштовані для об'єднання у вашому конфігурації. Ви хочете , щоб скасувати злиття крок, але , ймовірно , НЕ принести (не робить багато сенсу і не повинно бути необхідним).

Щоб скасувати злиття , використовуйте git reset --hardдля скидання локального сховища до попереднього стану; використовуйте git-reflog, щоб знайти SHA-1 попереднього стану, а потім відновити його.

Увага

Команди, перераховані в цьому розділі, видаляють усі незапущені зміни, що може призвести до втрати роботи:

git reset --hard

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

git reset --hard master@{"10 minutes ago"}

325
Відмінний спосіб , щоб вибрати попередній стан, замість того щоб використовувати ГИТ-reflog і копіювання хешів, є використання ярлика , як master@{1}, що попереднє положення master, master@{"5 minutes ago"}або master@{14:30}. Повні деталі щодо уточнення змін таким чином можна знайти у man git-rev-parseрозділі "Вказані зміни".
Каскабель

38
У цьому випадку ORIG_HEAD також повинен працювати ("git reset --hard ORIG_HEAD")
Jakub Narębski

@Jelfromi: дякую за цю пораду, я не знав, що ти можеш бути настільки багатослівним щодо перегляду. Я знав про вибір ревізій відносно HEAD, але коли постало запитання, я не знав, як далеко назад у часі він хотів піти.
jkp

Коли я потягнув, це говорить Updating d2c90a3..035ac4d. Тут ви також можете використовувати d2c90a3як параметр для скидання.
Тай

Не потрібно вводити хеші, коли ви використовуєте reflog. Ви також можете використовувати HEAD @ {1} або будь-який попередній номер, визначений у рефлозі.
Саймон Кіт

338

Те саме, що відповідь jkp, але ось повна команда:

git reset --hard a0d3fe6

де a0d3fe6 виявляється шляхом виконання

git reflog

і дивлячись на точку, в якій потрібно скасувати.


Чому я просто не можу це зробити git reset HEAD --hard, наприклад?
Сун Чо

9
@MikeC Цей підхід дозволяє повернутись до декількох
тягнень

2
Я не зміг використати лівий ідентифікатор, але git reset --hard HEAD@{n}працював
Е. Сундін

1
Ви повинні запропонувати редагувати відповідь jkp, а не майже повторювати її через стільки років.
Абхішек Ананд

Якщо у мене це є git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} та bbbbbbb HEAD @ {2}. Якщо я це зроблю, git reset --hard bbbbbbbя втрачу ГОЛА 0 і 1?
pmiranda

115

Більш сучасний спосіб скасувати злиття:

git merge --abort

І трохи старший спосіб:

git reset --merge

Старий спосіб, описаний у попередніх відповідях (попередження: відкине всі ваші місцеві зміни):

git reset --hard

Але насправді варто зазначити, що git merge --abortце рівнозначно тому, git reset --mergeщо MERGE_HEADє. Про це можна прочитати в довідці git для злиття команди.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Після невдалого злиття, коли його немає MERGE_HEAD, невдале злиття може бути скасоване, git reset --mergeале не обов'язково з git merge --abort, тому вони є не лише старим, а новим синтаксисом для одного і того ж . Ось чому я вважаю git reset --mergeсебе набагато кориснішим у повсякденній роботі.


20
git merge --abortпрацює В ході злиття, не після git pullзакінчення. Тож ця відповідь видається не важливою для питання.
Абхішек Ананд

1
git reset --mergeвидаляє всі зміни, не встановлені для фіксації. Знайшов це важкий шлях.
theadriangreen

62

він працює першим використанням: git reflog

знайдіть SHA свого попереднього стану та зробіть (HEAD @ {1} - приклад)

git reset --hard HEAD@{1}

40

Якщо у вас є gitk (спробуйте запустити "gitk - всі зі свого командного рядка git"), це просто. Просто запустіть його, виберіть команду, на яку ви хочете відкатати (клацніть правою кнопкою миші), і виберіть «Скинути головну гілку тут». Якщо у вас немає невмілих змін, виберіть "жорсткий" варіант.


8
Це варто запустити, якщо ви його ще не бачили. Це спливає шалений графічний інтерфейс.
Еван Моран

35

Припустимо, це $COMMITбув останній ідентифікатор комісії перед вами git pull. Те, що вам потрібно скасувати останній потяг, - це

git reset --hard $COMMIT

.

Бонус:

Говорячи про тягнення, я хотів би поділитися цікавою хитрістю,

git pull --rebase

Ця вище команда - найкорисніша команда в моєму житті git, яка зекономила багато часу.

Перед тим, як натиснути ваш щойно приєднаний сервер, спробуйте цю команду, і він автоматично синхронізує останні зміни на сервері (з вилученням і злиттям) і помістить ваш комітет вгорі в журналі git. Не потрібно турбуватися про ручне потягування / злиття.

Деталі можна знайти на веб- сайті: http://gitolite.com/git-pull--rebase


17

Це найпростіший спосіб повернути ваші зміни.

** Warning **

Створіть резервну копію змінених файлів, оскільки вони видалять новостворені файли та папки .

git reset --hard 9573e3e0

Де 9573e3e0ваш {Код ідентифікатора}


ця відповідь дуже корисна, тому що якщо ми зробимо гілку з походженням, то отримаємо щось подібне Updating ffce65bd..e929e884, зробиgit reset --hard ffce65bd
Ернесто Альфонсо

15

Ви можете зробити git reset --hard ORIG_HEAD

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


5

git pull зробити нижче операції.

i. git fetch

ii. git merge

Щоб скасувати потягнення, виконайте будь-яку операцію:

i. git reset --hard --- також відновити всі локальні зміни

або

ii. git reset --hard master@{5.days.ago} (Як 10.minutes.ago, 1.hours.ago, 1.days.ago..) , щоб отримати локальні зміни.

або

iii. git reset --hard commitid

Вдосконалення:

Наступного разу використовуйте git pull --rebaseзамість git pull.. змінити його сервер синхронізації, виконуючи виконання (добування та злиття).


4

Якщо є невдале злиття, що є найпоширенішою причиною того, щоб хотіти скасувати а git pull, біг git reset --mergeвиконує саме те, що можна було б очікувати: зберігайте вилучені файли, але скасовуйте об'єднання, яке git pullнамагалося об'єднати. Тоді можна вирішити, що робити без захаращення, яке git mergeіноді породжує. І це не потрібно, щоб знайти точний ідентифікатор фіксації, який --hardзазначений у кожній іншій відповіді.

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