Як відмовитись від місцевих комісій у Git?


262

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

git reset --hard
git rebase origin
git fetch
git pull
git checkout

У цей момент я отримав повідомлення

Your branch is ahead of 'origin/master' by 2 commits.

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


6
Не потрібно робити і те, git fetchі інше git pull- тягнення - це комбінація отримання та злиття.
Ефір

12
Зауважте користувачам: головна проблема цього питання не має нічого спільного з повідомленням "Ваша гілка випереджає" походження / головне "за N комітами". . Будь ласка, перестаньте закривати інші запитання як копії цього питання через це повідомлення.

Відповіді:


579
git reset --hard origin/master

видалить усі комісії не origin/masterтам, де originє ім'я репо, а masterє назва гілки.


1
Я думав, що синтаксис "походження / майстер" з косою рисою відноситься до місцевого репо?
Даніель К. Собрал

9
mipadi: Правильніше кажучи, він скине поточну гілку, щоб вказати на те саме виконання, що і початкове / головне.
Крістоффер Хаммарстрем

Це стосується гілки. origin/master- гілка, яка відстежує masterгілку originвіддаленого репо.
mipadi

@ DanielC.Sobral Ні, origin/masterце посилання на masterгілку віддаленого телефону origin.
Матвій

1
@littletiger git не відстежує папки, лише файли та їх шляхи. Тому він повністю ігнорує порожні папки (папки без файлів або лише ігноровані файли). Вони ніде не з’являються, оскільки в них немає чого піти.
Мамочка

33

Окрім відповіді mipadi (яка повинна працювати до речі), ви повинні знати, що робите:

git branch -D master
git checkout master

також робить саме те, що ви хочете без having to redownload everything(цитата перефразована). Це тому, що ваше локальне репо містить копію віддаленого репо (і ця копія не збігається з вашим локальним каталогом, вона навіть не така, як ваша перевірена гілка).

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

Якщо у вас немає галузей, крім майстра, вам слід:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Але як це відокремлює вчинені на місцевому рівні послуги, зроблені на початку? Насправді це мені говорить про цеCannot delete the branch 'master' which you are currently on.
Даніель К. Собрал

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

2
2. Звичайно, ви не можете видалити гілку, яка зараз перевірена. Щоб видалити майстер, спочатку перевірте іншу гілку. Якщо немає іншої гілки, просто створіть тимчасову:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

Також зверніть увагу на те, що я говорив про те, що ваша локальна копія віддаленого репо-файлу відрізняється: git не дозволить вам редагувати або навіть переглядати файли у вашій копії віддаленого відділення. Це дозволить вам створити ще одну гілку з віддаленої гілки, яку ви потім зможете переглядати та редагувати. За умовою, ця місцева гілка має ту саму назву, що й віддалена гілка. Ви частково праві в тому, що origin/masterє на вашій локальній машині. Це ваша локальна (повна) копія віддаленого відділення. Справжня віддалена гілка origin master.
slebetman

Це працювало для мене. Можливо, це git branch -D masterне було необхідним, оскільки, як вказувалося, воно створює помилку.
Алексіс Вілке

15

Те, що я роблю, - це намагаюся скинути важко голову. Це знищить усі місцеві зобов'язання:

git reset --hard HEAD^

Це найкраща відповідь, яка справді спрацювала. Відхилено всі місцеві комісії та скиньте на HEAD. Для чого використовується ^ char?
Karim

@karim «^», ймовірно , регулярний вираз речі, які , ймовірно , що - то досить глибоко , що я не знаю , чи читати давно в ручному файлі .. вибачте людина :)
Жанг Nguyen

1
Пізно, але ^позначає батьківський прихильність, тому скидання для HEAD^відкидання невмілих змін і переміщення гілки до попереднього комітету, фактично "видалення" останнього комітету (хоча комісія все ще існує, гілка просто не вказує на це). Відповідь матиме лише один місцевий прихил, а решта - це незаперечні зміни. @karim @giang
QuantumQuaver

3

Вам потрібно бігти

git fetch

Щоб отримати всі зміни, і тоді ви не отримаєте повідомлення з "ваша філія попереду".


5
Вилучення не має нічого спільного з основною проблемою запитувача, яка позбавляється місцевих комісій.

1
що робити, якщо я вже вчинив файли в локальній, а потім намагаюся запустити згадану команду. На ній з’явиться те саме повідомлення про помилку. Я спробував git fetch і git fetch -p теж. але показує таку ж помилку
Морез

1

Я бачив випадки, коли пульт вийшов із синхронізації та потребував оновлення. Якщо reset --hardчи branch -Dне працює, спробуйте

git pull origin
git reset --hard 

це не відповідає на питання, чи reset --hardпрацює в цій ситуації
CharlesB

1
Привіт Чарльз, ти маєш рацію, що reset --hardтут має працювати. Однак я просто вказую, що вона періодично не git pull originдає змоги скинути гілку належним чином, а команда повторно синхронізує пульт та дозволить reset --hardфункціонувати функціонуванню належним чином.
Джим Клуз

0

Мені довелося зробити:

git checkout -b master

як git сказав, що його не існує, тому що його протирають

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