Питання Відмінити перезагрузку


Хто-небудь знає, як легко скасувати гітару?

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

  • git checkout здійснити батьківство для обох гілок
  • потім створіть там температурну гілку
  • вишня-вибирати всі зобов'язання вручну
  • замінити галузь, в якій я перероблений вручну створеною гілкою

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

Проте мій підхід вражає мене як субоптимальний і схильний до помилок (скажімо, я просто перебазнув з двома своїми гілками).

Будь-які ідеї?

Роз'яснення: Я кажу про переробку, під час якої було відтворено купу зобов'язань. Не тільки один.


2434
2017-09-25 17:59


походження


Крім того, слід зазначити, що під час переробки ви можете виключити чи вчиняти котирування або вибивати їх; ці зміни не можна відновити без покажчика на початкові вузли або просіювання через рефлог, тому cherrypicking не буде працювати. - ANeves
stackoverflow.com/a/692763/2458438 В ідеалі це повинно бути прийнятною відповіддю. - DDM


Відповіді:


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

git reflog

і скинути поточну гілку до нього (з звичайними застереженнями про те, що він абсолютно впевнений, перш ніж відновити --hard варіант)

Припустимо, що стара фікція була HEAD@{5} у реферальному журналі:

git reset --hard HEAD@{5}

У Windows вам, можливо, доведеться навести посилання:

git reset --hard "HEAD@{5}"

Ви можете перевірити історію кандидата старої голови, просто зробивши це git log HEAD@{5} (Windows:  git log "HEAD@{5}")

Якщо ви не вимкнули облікові записи, ви можете просто зробити це git reflog branchname@{1} як перебаз від'єднує голівку гілки, перш ніж приєднатися до кінцевої голови. Я б двічі перевірив це, хоча я не підтвердив це останнім часом.

За замовчуванням усі рефлюкси активуються для нерозкритих сховищ:

[core]
    logAllRefUpdates = true

3371
2017-09-25 19:56



Git reflog чудовий, просто пам'ятайте, що ви можете отримати кращий відформатований вихід з git log -g (порада від Скотта Чакона progit.org/book) - karmi
@ Zach: git rebase --abort (-i не має сенсу з --abort) полягає в тому, щоб відмовитися від переробки, яка не була завершена - або через те, що існували конфлікти або тому, що це було інтерактивним або обома; це не про відміна успішного переробки, про який йде мова. Ви б або використали rebase --abort або reset --hard залежно від ситуації, в якій ви були. Ви не повинні робити обидва. - CB Bailey
Дякую! У моїй Git-інсталяції я мав поставити "HEAD (22)" в лапки, щоб вона працювала. - SidJ
Це врятувало моє життя ... на жаль, у моєму haste я зробив git reset --hard HEAD@{5} - котрий два робив вище, що я хотів зробити. Не варто говорити, дякую Богові за Гіта, що дозволило мені просто йти вперед і зробити цю корекцію після виконання іншого git reflog і усвідомлюючи, що я хочу піти, я просто піднявся на 1, я швидко виправив це, і все добре. =) - marcamillion
Про всяк випадок спочатку створіть резервну копію: git tag BACKUP. Ви можете повернутися до нього, якщо щось не так: git reset --hard BACKUP - kolypto


Фактично, rebase економить відправну точку ORIG_HEAD так це звичайно так просто, як:

git reset --hard ORIG_HEAD

Однак, reset, rebase і merge все збереже ваш оригінал HEAD вказівник на ORIG_HEAD отже, якщо ви виконали будь-яку з цих команд після того, як ви намагаєтесь скасувати зміну, тоді вам доведеться використовувати reflog.


1169
2018-03-28 13:24



Дякую. Це допомогло мені відновити сквош! - kakyo
У випадку ORIG_HEAD більше не є корисним, ви також можете скористатись branchName@{n} синтаксис, де n є n-м попереднім положенням покажчика гілки. Так, наприклад, якщо ви переробляєте featureA гілка на вашу master галузь, але вам не подобається результат переробки, то можна просто зробити git reset --hard featureA@{1} щоб скинути гілку назад до того місця, де вона була, перш ніж ви зробили переробку. Ви можете дізнатись більше про синтаксис @ @ {n} у @ офіційний Git документи для перегляду.
Це найпростіше. Слідуйте за допомогою a git rebase --abort хоча - Seph
Це має бути прийнята відповідь ІМО. - Tomáš Fejfar
ORIG_HEAD ДУЖЕ ДУЖЕ ВЕЛИКІСТЬ корисно, якщо ви просто зробили переробку і хочете повернути його у здоровий і мирний спосіб. Це повинна бути краща відповідь (або прийнята відповідь). Потрібен удар. Вершина проголосувала відповідь, яка просить зробити git reset --hard HEAD@{5}включає в себе непотрібне підрахунку очей, яке має більше можливостей помилитися. - DDM


Відповідь Чарльза працює, але ви можете зробити це:

git rebase --abort

очистити після reset.

В іншому випадку ви можете отримати повідомлення "Interactive rebase already started".


320
2017-07-27 18:21



У цьому розділі було видалено частину "| REBASE" у моєму записі. +1 - Wouter Thielen
Я думаю, це повинно бути git rebase --abort в (в залежності від вашої версії git можливо). - Seph
Це не питання. Питання полягає в тому, як скасувати завершений переробку. - Arunav Sanyal
@ArunavSanyal це остання надія, якщо скасувати не вдалося .. - aswzen


Зміна відгалуження на об'єкт, що зависає, з його старим наконечником, звичайно, є найкращим рішенням, оскільки він відновлює попередній стан, не витрачаючи жодних зусиль. Але якщо ви, напевно, втратили ці зобов'язання (f.ex., оскільки ви збираєте сміття з вашого сховища тим часом, або це свіжий клон), ви завжди можете знову перемістити гілку. Ключ до цього - це --onto перемикач

Скажімо, у вас виникла галузева тема, яку вигадано topic, що ви розгалужені master коли кінчик master був 0deadbeef вчинити У якийсь момент, поки на topic галузь, ти зробив git rebase master. Тепер ви хочете скасувати це. Ось як це зробити:

git rebase --onto 0deadbeef master topic

Це займе всі зобов'язання topic що не на master і відтворити їх на вершині 0deadbeef.

З --onto, ви можете перетворити вашу історію в значній мірі будь-яка форма.

Весело провести час :-)


75
2017-09-26 02:08



Я думаю, що це найкращий варіант через його гнучкість. Я відокремив b1 від майстра, потім перемістивши b1 до нової гілки b2, потім хотів би повернути b1, щоб знову засновати на майстер. Я просто люблю git - спасибі! - ripper234
Це найкращий варіант тут! Він зберіг усі зміни, які я змінив у моїй поточній гілці, і видалив усі небажані! - Alicia Tang
Я б сказав, що це поєднання --onto і -i ви можете перебудувати вашу історію практично в будь-якій формі. Використовуйте gitk (або gitx на Mac), щоб побачити форму, яку ви робите :-). - rjmunro


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

Тоді, відновлення так само просто, як git reset --hard BACKUP.


62
2018-05-12 20:57



Я теж це роблю. Також корисно відрізнити diff BACKUP..HEAD, щоб переконатися, що ви змінили те, що мали на увазі. - Paul Bone
Я теж робив це, але, оскільки мені стало більше комфортно, я більше не вважаю це необхідним. Файл reflog по суті робить це від вашого імені кожного разу, коли ви змінюєте HEAD. - Pete Hodgson
Що ж, я віддаю перевагу змістовним іменам, тому що пошук відповідного елемента в reflog іноді не є утіхою взагалі. - Alex Gontmakher
Насправді навіть не потрібно створювати гілку резервної копії, ви можете просто скористатись branchName@{n} синтаксис, тут n є n-м попереднім положенням покажчика гілки. Так, наприклад, якщо ви переробляєте featureA гілка на вашу master галузь, але вам не подобається результат переробки, то можна просто зробити git reset --hard featureA@{1} щоб скинути гілку назад до того місця, де вона була, перш ніж ви зробили переробку. Ви можете прочитати більше про branch@{n} Синтаксис на офіційний Git документи для перегляду.
Насправді, вам навіть не потрібно використовувати синтаксис вище, відповідно до Відповідь Пет Нітца, Оригінальний HEAD відділення тимчасово зберігається в ORIG_HEAD. Але також працює техніка використання мітки резервної копії, це просто ще кілька кроків.


У випадку ви штовхнули свою гілку до віддаленого сховища (як правило, це походження), а потім ви зробили успішну переробку (без злиття) (git rebase --abort дає "Немає переробки в процесі") ви можете легко скинути гілку використовуючи команда:

Скидання git - серйозне походження / {branchName}

Приклад:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean

53
2017-09-28 12:43



Це правильна відповідь для мене. Перезаписати і здійснити до переробки мав той самий ідентифікатор, і повернення до HEAD {1} просто не повернеться до переробки! - Bill Kotsias


У випадку, якщо ви не завершили перебудову, а посередині, виконані наступні роботи:

git rebase --abort

49
2017-10-15 20:20



Це працювало для мене. Я зіткнувся з конфліктами, і він кваліфікувався як "посередині". - Fakeer


Для кількох зобов'язань пам'ятайте, що будь-які посилання на коректність посилаються на всю історію, що веде до цього. Отже, у відповідь Чарльза, прочитайте "старе зобов'язання" як "новітні зі старих". Якщо ви скинете цю комбінацію, то вся історія, що веде до цього зобов'язання, знову з'явиться. Це має робити те, що ви хочете.


14
2017-09-25 21:36



Правда, дякую за нагадування ;-) - webmat