Питання Видаліть зобов'язання з філії в Git


Я хотів би знати, як видалити копію.

По delete, Я маю на увазі, що це не так, як я зробив, що робити, і коли я буду натискати в майбутньому, мої зміни не будуть натискати на віддалену гілку.

Я читаю допомогу з git, і я думаю, що команда, яку я повинен використовувати, є git reset --hard HEAD. Це правильно?


2582
2017-08-27 03:39


походження


Я думаю, що це так ні дублікат Git скасувати останню фіксацію як він запитує, як видалити будь-який вчинити з філії. Я також думаю, що не з відповідей насправді вирішити це питання. Вони всі перемотують останній, не робить cherry-pick і delete єдине вчинення, яке могло статися деякий час тому. - Chris
@ Крис, відповідь з git rebase -i HEAD~10 він вирішує це питання, оскільки це дозволяє вам довільно вибирати зобов'язання видаляти. Git застосовує зобов'язання в діапазоні, який ви вказуєте один за одним, ігноруючи зобов'язання, які ви видалили з журналу. Я використав цю команду сьогодні, щоб позбутися від другої та третьої останніх зобов'язань моєї репо, зберігаючи при цьому перший. Я погоджуюсь, що жоден з інших відповідей не є задовільним. - MST
@MST так, я повинен був сказати, не з варіантів прийнятої відповіді відповісти на це питання, але ви абсолютно праві - ця команда, здається, працює - Chris


Відповіді:


Обережно:  git reset --hard  ВИДАЛУТЬСЯ ЗМІНИ РОБОЧОГО КАТАЛОГУ. Обов'язково призупинити місцеві зміни, які ви хочете зберегти перед тим як запускати цю команду.

Припускаючи, що ви сидите на цій фіксації, тоді ця команда буде її зношувати ...

git reset --hard HEAD~1

The HEAD~1 означає скоєння перед головою.

Або ви можете подивитися на випуск git log, знайдіть ідентифікатор commit, який ви хочете зробити, а потім виконайте наступне:

git reset --hard <sha1-commit-id>

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

git push origin HEAD --force

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

Якщо ви вже натиснули, може бути краще використовувати git revert, щоб створити "дзеркальне зображення", яке скасовує зміни. Однак обидва обіцянки будуть в журналі.


FYI - git reset --hard HEAD чудово, якщо ви хочете позбутися робочої сили в прогрес. Він поверне вас до останньої фіксації та знищить усі зміни в робочому дереві та індексі.


Нарешті, якщо вам потрібно знайти копію, яку ви "видалили", вона зазвичай присутня в git reflog якщо у вас немає сміття зібране ваше сховище.


3311
2017-08-27 03:44



HEAD~1 або просто HEAD^. Якщо ви штовхнули, то слід використовувати git revert замість цього. - Jakub Narębski
обов'язково призупиніть будь-які локальні зміни, які ви хочете зберегти, перш ніж запускати цю команду ... - William Denniss
Очевидно, ви також можете використовувати HEAD~n повертатися" n зобов'язує вас з голови. Можливо, з цього моменту можна тлумачити ... --hard HEAD також як HEAD~0 => видалення роботи в процесі роботи. - yoshi
@ beamrider9 imho git rebase майже завжди є кращим способом видалення помилок (як описано у відповіді Грега Хеггілла) - не в останню чергу тому, що rebase насправді включає в себе велике попередження, що ви будете видаляти речі 4realz. - Noah Sussman
це не видаляє зміни з дерева commit, хоча. ОР звернувся з проханням про вже здійснене зобов'язання. Якщо ви reset --hard, і перевірте log --oneline --all, комікси все ще залишаються в дереві. Як ми видаляємо ці зобов'язання з дерева? Дякую. - iGbanam


Якщо ви ще не підштовхнули когось до виконання, можете використовувати його git rebase -i щоб видалити цю фіксацію. По-перше, дізнайтеся, наскільки далеко тому, що робиться (приблизно). Тоді робіть:

git rebase -i HEAD~N

The ~N означає перезавантажити останню N зобов'язує (N повинен бути, наприклад, номером HEAD~10) Потім ви можете відредагувати файл, який Git подарує вам, щоб видалити правопорушний фікс. Після збереження цього файлу Gіt перезаписує всі наступні дії так, ніби ви не видалили.

Книга "Гіт" має гарний характер розділ про переробку з малюнками та прикладами.

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


603
2017-08-27 03:51



Примітка. Якщо у вас виникнуть будь-які з'єднання "-nof-ff" в останній партії команд, rebase буде забігти їх :( Це згадується під -p на ця сторінка. Проблема полягає в тому, якщо ви замінюєте -i з -p, ви більше не отримуєте цього спливаючого вікна з варіантами «редагувати цю компромісність, спробуйте його» та ін Ні, хто знає це рішення? - Bukov
Що робити, якщо ви його підштовхнули? (просто я використовую віддалене репо) - Costa
@ Коста ви можете використовувати push -f щоб змусити натиснути та замінити віддалену гілку з вашим місцевим. Якщо це ваш власний віддалений репо, не проблема. Проблема починається, якщо хтось інший приніс тим часом. - Greg Hewgill
Я додав і здійснив файл даних, який був занадто великий для GitHub (так, він, напевно, не повинен бути в джерелі репо в будь-якому випадку, о добре). Коли я намагався натиснути, GitHub відмовився через надто великий файл. Все, що я хотіла зробити, це скасувати це здійснення, одночасно зберегти кілька інших незв'язаних зобов'язань, які слідували. The git rebase -i HEAD~5 команда була точно що мені потрібно було повністю вилучити цю фіксацію з мого місцевого репо! Дякую! - aldo
@ dumbledad: With rebase -i, зміни, що відповідають видаленому коректуванню, не зберігаються. - Greg Hewgill


Інша можливість - одна з моїх особистих улюблених команд:

git rebase -i <commit>~1

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


416
2017-08-27 03:49



Thx, btw, якщо ви зіткнетеся з будь-якими проблемами (наприклад, порожніми комами), які ви можете використовувати git rebase --continue - realgt
Навіть простіше: git rebase -i HEAD~1 - mmell
Вауцери git rebase -i HEAD~1 дійсно прибрали репо! Важко точно сказати, що це зробило, але все це виглядає набагато гірше. Трохи тривожна, насправді. - Charles Wood
Я думаю, що варто відзначити, що зобов'язання не руйнується, просто вилучено зі списку. Якщо ви зіпсували, ви можете отримати підтвердження, використовуючи відрегулювати. - Zaz
Видаляє лінію так само, як d / drop? - Leo


Я додаю цю відповідь, тому що не розумію, чому кожен, хто тільки що намагався здійснити роботу, хоче видалити всі ці роботи через помилку, використовуючи Git!

Якщо ви хочете тримати вашу роботу і просто "скасувати", що виконує команду (ви потрапили, перш ніж натискати на репо):

git reset --soft HEAD~1

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


281
2017-10-15 18:17



Ось приклад того, чому: ви робите невелику частину роботи на сервері розробників, який ви здійснюєте. Тоді виявляється, що цей сервер не має вихідного HTTPS-доступу, тому ви не можете натискати на нічого. Найпростіше просто прикинеться, що це ніколи не відбулося, і переробляти патч з вашої локальної машини. - Steve Bennett
reset --soft був спасителем життя, щоб не втратити поточну роботу. - RaphaelDDL
Дякую. Ця відповідь має бути вищим або включена в прийняту відповідь. Видалення фіксації! = Повернення фіксації. - Alsciende
@RandolphCarter: ви все одно втратите будь-які нездійснені зміни. - naught101
@ Rob, наприклад, коли ви випадково вводите файл із секретом (наприклад, пароль), який ніколи не повинен бути в управлінні джерелом. Місцевий внесок повинен бути зруйнований, не просто скасовується, тому він ніколи не буде натискати на сервер. - Bob Meyers


Якщо ви не опублікували зміни, ви можете видалити останнє повідомлення

$ git reset --hard HEAD^

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

Якщо ви вже опублікували для відключення, скористайтеся командою гіт повернути

$ git revert HEAD

47
2017-08-27 10:47



Це не спрацювало. Коли я записую журнал, все ще там, незважаючи на те, чому я це роблю, він просто додає більше команд. Я хочу очистити історію. - Costa
@Costa: що не працює (тобто, яку версію ви використовували), і як ви зробили журнал git? - Jakub Narębski
Я спробував майже все з цього питання та відповіді. (Я спробував повернути GIT HEAD, нещодавно) My git log: tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)' - Costa
Я просто хочу видалити зобов'язання (як ніколи вони не існували). Я пішов на деякі дивні пригоди кодування, з кількома новими комиксами, і це все закінчилося тим, що сміття. Як я можу просто стерти з мого журналу git? - Costa
Святий чорт щось чарівно зробив саме те, що хотів ... який з цих команд це зробив? !!?! - Costa


Видалення цілій фіксації

git rebase -p --onto SHA^ SHA

Очевидно замінити "SHA" на посилання, з якого хочете позбутися. "^" У цій команді є буквальним.

http://sethrobertson.github.io/GitFixUm/fixup.html


43
2017-08-31 19:36



як я можу покращити цю відповідь? інші рішення просто показують, як це робити в інтерактивному режимі або видаляти верхні команди. - ribamar
Дякую за цю посилання! Мені було цікаво, після виконання цього, чому я все ще бачу, що виконуючи SHA в моєму журналі git? - bapors
Чому нам це потрібно? -p тут - Serge Roussak
-p, --preserve-merges            Повторне з'єднання виконує замість того, щоб вирівняти історію шляхом повторного виконання, вводить комбінацію. Злиття вирішення конфліктів або ручні зміни до об'єднаних зобов'язань не зберігаються. - raittes


git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId - це той, який ви хочете повернути назад


33
2017-10-16 09:51



git push --force <origin> <branchName>. оскільки без згадування назви філії це може змінити весь файл на віддаленому комп'ютері. - sheelpriy


Якщо ви хочете виправити вашу останню фіксацію, ви можете скасувати здійснення та не завантажувати в нього файли, виконавши такі дії:

git reset HEAD~1

Це поверне ваше сховище у свій стан до команди git add, які поставили файли. Ваші зміни будуть у вашому робочому каталозі. HEAD ~ 1 відноситься до фіксації нижче поточного кінця філії.

Якщо ви хочете розблокувати N, це робить, але продовжуйте змінювати код у своєму робочому каталозі:

git reset HEAD~N

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

git reset --hard HEAD~1

Точно так само, якщо ви хочете відмовитися від останніх команд N, і не хочете, щоб коди змінювалися:

git reset --hard HEAD~N

29
2018-05-31 07:19





Силу історії змін

Припускаючи, що ви не просто хочете видалити останню фіксацію, але хочете видалити певні копії останніх, виконайте наступні дії:

git rebase -i HEAD~<number of commits to go back>, так git rebase -i HEAD~5 якщо ви хочете побачити п'ять останніх зобов'язань.

Потім в текстовому редакторі змініть слово pick до drop поруч із кожним зобов'язанням, який ви хочете видалити. Зберегти та вийти з редактора. Вуала!

Історія додаткових змін

Спробуй git revert <commit hash>. Повернути створить a новий commit, який скасовує зазначену фіксацію.


20
2018-06-15 23:01





Скажімо, ми хочемо видалити 2 та 4 копії з репо.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Примітка: Вам потрібно мати права адміністратора на репо оскільки ви використовуєте --hard і -f.

  • git checkout b3d92c5 Оформити копію останнього користування.
  • git checkout -b repair Створіть нову гілку, щоб працювати.
  • git cherry-pick 77b9b82 Запустити через фіксацію 3.
  • git cherry-pick 2c6a45b Запустити через зобов'язання 1.
  • git checkout master Майстер оформлення замовлення
  • git reset --hard b3d92c5 Скидання майстра для останнього користування.
  • git merge repair Об'єднайте нашу нову гілку магістра.
  • git push -f origin master Натисніть майстра на віддалений репо.

19
2017-09-05 07:19



останній крок повинен бути git push -f origin master немає варіанту --hard - Vivek