Як видалити незапущені файли git?


947

Я випадково вчинив неправильну гілку. Як видалити цю комісію?

Відповіді:


1807

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

git reset --soft HEAD~1

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

git reset --hard HEAD~1

13
переконайтесь, що ГОЛОВКА вказує на гілку .. (перевірте це спочатку)
Frank Schwieterman

128
І переконайтеся, що HEAD ~ 1 є фіксацією ... Ви також можете це зробитиgit reset --hard origin
Daenyth

13
Думка git remoteперелічує походження для мене, git reset --hard originкаже fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.. Чому?
trss

7
Це круто. Просто врятувало мені життя.
NinjaBoy

2
git reset HEAD~1також збереже всі ваші зміни, але залишить вас із порожнім індексом, а не збереже все (як --softби варіант).
Холлоуей

138

Цікаво, чому найкраща відповідь, яку я знайшов, - лише в коментарях! ( Даніт з 86 голосами нагорі )

git reset --hard origin

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

git reset --hard origin/<branch>

16
Спасибі за це, злегка розширюється пояснення: для конкретної галузі:git reset --hard origin/<branch>
Клірі

4
Або git reset --soft origin/<branch>, якщо ви хочете позбутися від зобов'язань, але продовжуйте роботу на місцях.
річковий кінь

1
я розумію fatal: ambiguous argument 'origin': unknown revision or path not in the working tree., вам потрібно вказати галузь на кшталт:git reset --hard origin/feature/my-cool-stuff
Кіп

Блискуче! Це насправді працює, на відміну від "прийнятої" відповіді, яка просто відриває голову і залишає вас повішеними.
mae

55

Не видаляйте його: достатньо лише одного комітету git cherry-pick.

Але якщо у вас було кілька комірок на неправильній гілці, саме тут git rebase --ontoсвітить:

Припустимо, у вас це:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, тоді ви можете позначити masterта перемістити його там, де ви хочете бути:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

, скиньте відділення y, де воно повинно було бути:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

, і, нарешті, перемістіть свої зобов’язання (повторно застосуйте їх, роблячи фактично нові зобов’язання)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

на жаль, це не було питання.
KatariaA

1
@KatariaA Це вагома альтернатива видаленню зобов’язань, зроблених у неправильній гілці, і допоможе іншим у тій же ситуації (хороший фіксатор, зроблений на неправильній гілці).
VonC


6

Якщо ви хочете перенести цю комісію в іншу гілку, отримайте SHA відповідного комітету

git rev-parse HEAD

Потім переключіть поточну гілку

git checkout other-branch

І cherry-pickзобов’язатисьother-branch

git cherry-pick <sha-of-the-commit>

З мого досвіду, це не скасовує зобов’язання з оригінальної гілки, що вимагає необхідності в git reset --hard HEAD~1подальшому. Я думаю, що використання reset --softперемикання гілок та повторне виконання зобов’язань заощадило б додаткову роботу. Потім я знову використовував SourceTree, щоб робити більшість моїх базових речей, лише командний рядок з цим після моєї помилки.
jusopi

3

Для довідки, я вважаю, що ви можете «важко вирізати», виконуючи свою діючу гілку не тільки з перезавантаженням git --hard, але і з наступною командою:

git checkout -B <branch-name> <SHA>

Насправді, якщо ви не переймаєтесь перевіркою, ви можете встановити відділення на все, що вам потрібно:

git branch -f <branch-name> <SHA>

Це був би програмний спосіб видалення комітетів із гілки, наприклад, для копіювання нових комітетів до неї (за допомогою rebase).

Припустимо, у вас є гілка, від’єднана від головного, оскільки ви взяли джерела з іншого місця та скинули її у гілку.

Тепер у вас є відділення, в якому ви застосували зміни, назвемо це "тема".

Тепер ви створите дублікат вашої тематичної гілки, а потім повторно встановите її на дамп вихідного коду, який знаходиться у відділенні "dump":

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

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

Потім ви можете замінити "dump" на "topic_duplicate", виконавши:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

Або з

git branch -M topic_duplicate dump

Або просто відкинувши смітник

git branch -D dump

Можливо, ви також можете просто вибрати вишню після очищення поточної "теми_доповника".

Що я намагаюся сказати, це те, що якщо ви хочете оновити поточну гілку "дублікат" на основі іншого предка, ви повинні спочатку видалити попередні "вишневі" зобов'язання, виконавши git reset --hard <last-commit-to-retain>абоgit branch -f topic_duplicate <last-commit-to-retain> а потім скопіювавши інші зобов’язання (з головного тематична галузь) або шляхом випуску, або збору вишень.

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

Вишукання їжі набагато простіше:

git cherry-pick master..topic

Таким чином, вся послідовність зводиться до:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

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

Тож просто продемонструйте:

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

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


0

Після команди, яка працювала для мене, всі локально здійснені зміни відміняються, а локальний скидається до того ж, що і віддалене походження / головна гілка.

git reset - тверде походження

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