Я випадково вчинив неправильну гілку. Як видалити цю комісію?
Я випадково вчинив неправильну гілку. Як видалити цю комісію?
Відповіді:
Видаліть останню комісію, зберігаючи виконану вами роботу:
git reset --soft HEAD~1
Видаліть найновішу комісію, знищивши виконану вами роботу:
git reset --hard HEAD~1
git reset --hard origin
git remote
перелічує походження для мене, git reset --hard origin
каже fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
. Чому?
git reset HEAD~1
також збереже всі ваші зміни, але залишить вас із порожнім індексом, а не збереже все (як --soft
би варіант).
Цікаво, чому найкраща відповідь, яку я знайшов, - лише в коментарях! ( Даніт з 86 голосами нагорі )
git reset --hard origin
Ця команда буде синхронізувати локальне сховище з віддаленим сховищем, позбувшись усіх змін, внесених у ваш локальний. Ви також можете зробити наступне, щоб отримати точну гілку, яку ви маєте в походження.
git reset --hard origin/<branch>
git reset --hard origin/<branch>
git reset --soft origin/<branch>
, якщо ви хочете позбутися від зобов'язань, але продовжуйте роботу на місцях.
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, вам потрібно вказати галузь на кшталт:git reset --hard origin/feature/my-cool-stuff
Не видаляйте його: достатньо лише одного комітету 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
Якщо ви хочете перенести цю комісію в іншу гілку, отримайте 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, щоб робити більшість моїх базових речей, лише командний рядок з цим після моєї помилки.
Для довідки, я вважаю, що ви можете «важко вирізати», виконуючи свою діючу гілку не тільки з перезавантаженням 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. Але таким чином ви можете зберігати оновлену модифіковану (виправлену) версію, яка базується на версії вашого дистрибутива, тоді як ваша реальна розробка суперечить справжньому майстру висхідного потоку.
Тож просто продемонструйте:
Сподіваюся, що це комусь допоможе. Я мав намір переписати це, але зараз не можу керувати. З повагою
Після команди, яка працювала для мене, всі локально здійснені зміни відміняються, а локальний скидається до того ж, що і віддалене походження / головна гілка.
git reset - тверде походження