Викиньте місцеві комісії в Git


1467

Через деякий збір вишні, моє місцеве сховище Git наразі на п’ять разів перевершує походження, і не в хорошому стані. Я хочу позбутися всіх цих зобов'язань і почати все заново.

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

Можливо, git revertце те, що мені потрібно, але я не хочу в кінцевому рахунку на 10 комірок до початку (або навіть на шість), навіть якщо він сам поверне код у потрібний стан. Я просто хочу зробити вигляд, що останні півгодини ніколи не бувало.

Чи є проста команда, яка це зробить? Це здається очевидним випадком використання, але я не знаходжу жодного прикладу цього.


Зауважте, що це питання стосується конкретних комісій , а не :

  • незатребувані файли
  • нестандартні зміни
  • поетапні, але неспроможні зміни

Відповіді:


2469

Якщо ваші надлишкові комісії видно лише вам, ви можете просто git reset --hard origin/<branch_name> повернутися туди, де є походження. Це відновить стан сховища до попереднього комітету, і він відкине всі локальні зміни.

Рухаєтеся git revertробить нові коммітов для видалення старих коммітов в шляху , який тримає історію SANE кожного.


90
git reset --hard <commit hash, branch, or tag>якщо ви хочете перейти до конкретної довідки, крім віддаленої гілки.
Сем Софф

55
Щоб було зрозуміло, якщо ви не працюєте над masterіншою галуззю, вам слід бігтиgit reset --hard origin/<your-branch-name>
Zoltán

33
Це дозволить не тільки відкинути локальні комісії, але й викинути все з вашого робочого дерева (тобто локальні файли). Якщо все , що вам потрібно зробити , це uncommit, але залишити свою роботу недоторканими, ви повинні зробити «GIT ГОЛОВУ скидання ^» ... за stackoverflow.com/questions/2845731 / ...
aaronbauman

3
Ви можете зробити Fetch після цього. Це зафіксувало лічильник кількості комісій, які очікують на натискання на SourceTree.
Стен

2
git reset --hard origin/<branch_name>Він також скине конфігурацію проекту, тому подбайте про це. У мене великий .cfgфайл, який був скинутий за замовчуванням. Мені довелося витратити години на це знову.
MAC

271

Просто видаліть свою локальну галузь-майстер та відтворіть її так:

git branch -D master
git checkout origin/master -b master

2
Це добре спрацьовує, коли зворотне відстеження змін буде коштувати занадто багато часу, що трапилось зі мною після пари скасованих.
aross

1
Корисно для проблем із підтягуванням / натисканням серед членів команди!
Хорхе Орпінель

Це ідеально, коли ви хочете відновити гілку замість просто майстра.
Володимир Ралев

1
це не гарний спосіб видалити одну локальну комісію. Краще використовуватиgit reset --hard origin/<branch_name>
Kirit Vaghela

1
Можливо, це рішення спрацює, але це не означає, що воно є правильним.
Адлі

201

Спробуйте:

git reset --hard <the sha1 hash>

щоб скинути голову туди, де ви хочете бути. Використовуйте gitk, щоб побачити, на якій комісії ви хочете бути. Ви також можете зробити скидання в межах gitk.


5
Оголосивши це керівництво корисною інформацією, але відповідь Бен Джексона отримує галочку для того, щоб точно вирішити те, що я хотів - таким чином, що не вимагало від мене пошуку хешей. :)
Девід Молес

2
Це той, коли ваша нова філія ще ніколи не була висунута до походження
січня

126

Видаліть останню комісію:

git reset --hard HEAD~1

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

git reset --soft HEAD~1


5
Корисна відповідь. Дякую! Я використав скидання git - програмне забезпечення походження / майстер
Тарун Кумар

2
@TarunKumar ДЯКУЙТЕ! Я використовую VS інтеграцію, і ваше рішення було єдиним способом, який я зміг знищити купу об'єднань, які я не хотів, щоб у філії я не мав дозволу на реєстрацію.
DVK

Дякую, саме те, що я шукав, "git reset --soft HEAD ~ 1" зробив цю роботу, оскільки я вчинив ненавмисно і хотів відновити, але були інші файли, які я не хотів знищувати після відновлення.
edvard_munch

47

Якщо ви використовуєте програму Atlassian SourceTree , ви можете використовувати параметр скидання в контекстному меню.

введіть тут опис зображення


42

Про вашу філію:

git reset --hard origin/<branch_name>

Підтвердіть зворотний зв'язок (до штату, без місцевих комісій), використовуючи " git log" або " git status", отже.


1
@Troyseph: усі відповіді, перелічені вище, я спробував як є, і не вдалося виправити сценарій. Тут було спробувано відповісти на загальний підхід, який не був проілюстрований у жодній із наведених відповідей.
парашут

3
Прийнята відповідь така ж, як і ваша, за вирахуванням загальної назви гілки, а в коментарях @Zoltan прямо написаноJust to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
Troyseph

1
Це найкраща відповідь на мій погляд.
dwjohnston

21

git reset --hard @{u}* видаляє всі ваші локальні зміни в поточній гілці, включаючи коміти. Я здивований, що ніхто цього не опублікував, але враховуючи, що вам не доведеться шукати, до яких зобов'язань повернутися або грати з гілками.

* Тобто, перезавантажте поточну гілку на - @{upstream}звичайно origin/<branchname>, але не завжди


1
Деякі оболонки, як риба, будуть інтерпретувати "@", тому вам, можливо, доведеться покласти "@ {u}" у лапки, наприклад, `git reset --hard '@ {u}'. У будь-якому випадку, хороша знахідка!
trysis


1
Як ви друкуєте значення @ {u}?
Філіп Рего

12

Щоб побачити / отримати ідентифікатор SHA-1 комітету, який ви також хочете повернути

gitk --all

Щоб повернутись до цього зобов'язання

git reset --hard sha1_id

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


це відмінно підходить для ситуацій, коли пульт більше не доступний, і його потрібно просто повернути до деяких місцевих комісій. gitk приголомшливий - не знав про це заздалегідь.
theRiley

Якщо ви вже в gitk, ви також можете просто клацнути правою кнопкою миші на команді і вибрати "скинути гілку XY на сюди".
mkrieger1

І новіші зобов’язання не будуть негайно видалені. Просто немає гілки, яка вказує на них більше (пам’ятайте, гілка - це не що інше, як «закладка» для певного комітету).
mkrieger1

9

У мене виникла ситуація, коли я хотів видалити комісію, яка не була натиснута, але це було раніше. Для цього я використав таку команду

git rebase -i HEAD~2 -> він відновить два останні коміти

І я використав 'drop' для підпису, який хотів видалити.


9

Видаліть відслідковувані файли (невідомі локальні зміни)

git clean -df

Постійне видалення всіх локальних комісій та отримання останньої віддаленої передачі

git reset --hard origin/<branch_name>

8

Для локальних комітетів, які не натискаються, ви також git rebase -iможете видалити або скасувати комісію.


1
Я знаю, що це може бути не найкоротшим рішенням, але я підтримав вас, оскільки ІМХО git rebase -iє більш загальним способом вирішення багатьох подібних проблем і може бути корисним у різних ситуаціях.
Стефан Маринов

1
Використовуйте dropключове слово (замість видалення рядка), видаляючи всі коміти, щоб уникнути припинення відновлення бази даних.
Міхал Чізмазія

6

Простим рішенням буде відповідати місцевій головній гілці HEAD за походженням / головним відділенням HEAD

git reset --hard origin/master

PS: origin / master - це віддалений вказівник на головну гілку. Ви можете замінити майстер на будь-яке ім'я філії


4

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

First of all what is HEAD?

HEADце просто посилання на поточний комітет (останній) у поточній галузі.
У HEADбудь-який момент може бути лише сингл . (крім git worktree)

Вміст HEADзберігається всередині, .git/HEADі він містить 40 байт SHA-1 поточної комісії.


detached HEAD

Якщо ви не перебуваєте на останньому комітеті - це означає, що HEADвказує на попереднє вчинення в історії, його називають detached HEAD.

введіть тут опис зображення

У командному рядку це виглядатиме так - SHA-1 замість назви гілки, оскільки значення HEADне вказує на кінчик поточної гілки

введіть тут опис зображення

введіть тут опис зображення

Кілька варіантів того, як відновитись із відокремленої ГЛАВИ:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

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

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Ви завжди можете використовувати reflogтакож.
git reflogвідобразиться будь-яка зміна, яка оновила, HEADі перевірка потрібного запису відмикання HEADповернеться до цього зобов'язання.

Кожен раз, коли зміниться HEAD, буде новий запис у reflog

git reflog
git checkout HEAD@{...}

Це поверне вас до бажаного завдання

введіть тут опис зображення


git reset --hard <commit_id>

"Перемістіть" голову назад до потрібної фіксації.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Примітка: ( Так як Git 2.7 )
    ви також можете використовувати git rebase --no-autostashтакож.

git revert <sha-1>

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

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Ця схема ілюструє, яка команда робить що.
Як ви бачите, там можна reset && checkoutзмінити HEAD.

введіть тут опис зображення


3

Для тих, хто цікавиться рішенням Visual Studio, ось тут:

  1. У Team Explorerвікні підключіться до цільового репо.
  2. Потім Branchesклацніть правою кнопкою миші потрібну гілку та виберіть View history.
  3. Клацніть правою кнопкою миші у Historyвікні та виберіть Reset -> Delete changes (--hard).

Це викине ваші місцеві комісії та поверне стан вашого репо до вибраного комітету. Тобто ваші зміни після витягу репо будуть втрачені.


2

Якщо ваша філія випереджає " origin/XXX" на 5 комітів.

Ви можете видавати:

git reset --hard HEAD~5

І він повинен видалити останні 5 комітів.


0
git reset --hard <SHA-Code>

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

Код SHA можна отримати, переглянувши веб-версію вашої панелі керування git для останнього комітету на гілці.

Таким чином, ви можете синхронізуватися з останньою комісією на гілці.

Ви можете зробити це git pullпісля успішного завершення жорсткого скидання, щоб підтвердити нічого нового для синхронізації, тобто ви побачите повідомлення.

Ваше відділення оновлено Origin/<Branch Name>


0

Якщо ви отримаєте місцеве репо в повний безлад, то надійним способом скинути місцеві комісії в Git - це ...

  1. Використовуйте "git config --get remote.origin.url", щоб отримати URL-адресу віддаленого походження
  2. Перейменуйте локальну папку git у "my_broken_local_repo"
  3. Використовуйте "git clone <url_from_1>", щоб отримати свіжу локальну копію віддаленого сховища git

З мого досвіду, Eclipse досить добре обробляє світ, що змінюється навколо нього. Однак вам може знадобитися вибрати зачіпані проекти в Eclipse та очистити їх, щоб змусити Eclipse відновити їх. Я думаю, що й іншим ІДЕ може знадобитися примусова перебудова.

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


0

Якщо ви просто хочете відкинути локальні коміти та зберегти зміни, зроблені у файлах, тоді виконайте
скидання git @ ~
Інші відповіді, адресовані жорсткому скиданню

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