Переписування моєї локальної філії з віддаленою гілкою


153

Я повністю fubar'd свого місцевого відділення, і я хотів би почати з початку. Версія на сервері правильна.

Я не хочу починати спочатку, я хотів би використати свою краєзнавчу історію, щоб виправити свою величезну накрутку. (Я можу, якщо доведеться.)

git fetch branchname, і git pull branchnameне працюють. Повідомлення, яке я отримую, є " оновленим ", проте моя локальна версія не відповідає серверній.

git pull origin/branchnameдає мені помилку " не знайдено "


Відповіді:


248

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

git branch fubar-pin

оновіть список віддалених гілок та синхронізуйте нові зобов’язання:

git fetch --all

потім відновіть свою філію до точки, де походження / гілка вказує на:

git reset --hard origin/branch

будьте обережні , це видалить будь-які зміни з вашого робочого дерева !


2
+1, але ви, можливо, захочете додати нагадування git fetch originперед скиданням
Mark Longair

Я зробив це з однією незначною зміною, і це не спрацювало: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (деякі інші речі), git reset - тверде походження / гілка. Кінцевим результатом було те, що я все ще був на старій комісії. Отже, такий підхід може працювати в деяких випадках, але я думаю, він працює не у всіх.
греггель

@greggles: Будь-які помилки? Після останньої команди HEAD повинен вказати на початок / гілку.
knittl

1
@Gavin: ні, це ні в якому разі не вплине на інші галузі, ніж origin/branch. Ніколи.
knittl

1
@greggles Я знаю, що це дуже пізно, але для інших людей, які задаються питанням, чому це може статися, такий підхід працюватиме лише у тому випадку, якщо у вас буде перевірена галузь. Це не спрацювало для вас, тому що ви знаходились у відокремленому стані HEAD (HEAD вказує на комітку, а не гілку), і ці команди працюють лише у тому випадку, якщо HEAD вказує на гілку. Коли ви робите, git resetколи HEAD вказує на гілку, ця гілка буде слідувати.
Майкл Дорст

60

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

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Тоді якщо ви впевнені, що нічого не хочете зі своєї старої гілки, видаліть її:

git branch -D branch-old

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


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

Чудова відповідь, корисна для мене. Одне запитання: Офіційна документація щодо перевірки git-каси, здається, говорить про те, що ваша третя команда повинна бути: git checkout -b <branch> --track <remote>/<branch>чи працює однаково добре, без --track?
Starman

1
Я думаю, що var var branch.autoSetupMerge(який я вважаю за замовчуванням до true) робить --trackнеявним. І так, у всіх моїх налаштуваннях git мені не потрібно явно --trackробити це checkout -b, але YMMV.
Кейсі Маршалл

5

У вашому місцевому відділенні, ймовірно, є зміни, які ви хочете відкинути. Для цього вам потрібно буде git resetскинути головку гілки до останнього місця, яке ви відхилилися від гілки репо вгору за течією. Використовуйте, git branch -vщоб знайти ідентифікатор sha1 верхньої гілки, і скиньте її, використовуючи її git reset SHA1ID. Тоді ви повинні мати можливість git checkoutскасувати зміни, залишені у вашому каталозі.

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


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

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