Очистіть виделку та перезавантажте її з висхідного потоку


396

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

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


4
Дуже складні відповіді на просте запитання. Просто видаліть усе і знову клонуйте сховище.
Yaza

1
@Yaza, ні, це може спричинити ще більше проблем у деяких сценаріях.
Шиммі Вайцхандлер

@shimmy, не, якщо ви хочете почати з нуля, як запитував ОП
Yaza

Відповіді:


796

Найпростішим рішенням було б (використання " upstream" як віддаленого імені, що посилається на оригінал роздвоєного репо):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Подібно до цієї сторінки GitHub, розділ "Що робити, якщо я потрапив у погану ситуацію?" )

Майте на увазі, що ви можете втратити зміни, зроблені на masterгілці (як локально, так reset --hardі через віддалену сторону, через те push --force).

Альтернативою може бути, якщо ви хочете зберегти свої зобов’язання master, щоб перетворити ці комітети на вершині поточної upstream/master.
Замініть частину скидання на a git rebase upstream/master. Тоді вам все одно потрібно буде натискати.
Дивіться також " Що мені робити, якщо я потрапив у погану ситуацію? "


Більш повне рішення, створити резервну копію вашої поточної роботи (про всяк випадок), детально описано в " Очищення основного відділення git та переміщення деяких зобов'язань до нової гілки ".

Дивіться також " Витягніть нові оновлення з оригінального сховища GitHub у роздвоєне сховище GitHub ", щоб проілюструвати, що таке " upstream".

вище за течією


Примітка: останні репозитори GitHub захищають цю masterгілку від push --force.
Тож вам доведеться спочатку зняти захист master(див. Малюнок нижче), а потім знову захистити його після натискання силою ).

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


Примітка. Спеціально на GitHub зараз (лютий 2019 року) є ярлик для видалення роздвоєних репост для запитів на витяг, які були об'єднані вище за течією.


4
привіт, це спрацювало чудово! btw правильний синтаксис скиданняgit reset --hard upstream/master
tampe125

1
@ tampe125 Відмінно. Я зафіксував синтаксис git resetвідповіді.
VonC

fatal: 'upstream' не схоже на сховище git
Benubird

@Benubird - це назва віддаленого посилання на оригінал repo (той, який ви роздвояли): див. Графік та команди " git remote" в stackoverflow.com/a/3903835/6309 .
VonC

Правильно, але з вашого питання не зрозуміло, як встановити це налаштування, оскільки за замовчуванням «вище за течією» в командному рядку не визначено, як я розщедрився через github.
Benubird

31

Відповідь любові VonC. Ось проста версія його для початківців.

Є пульт дистанційного керування, originякий називається, я впевнений, що ви всі знаєте. В основному, ви можете додати стільки віддалених файлів, скільки захочете. Отже, ми можемо зробити новий пульт, який є оригінальним репо, а не вилкою. Мені подобається це називатиoriginal

Додамо оригінальні репо-файли до нашої вилки як віддалений.

git remote add original https://git-repo/original/original.git

Тепер давайте вийдемо з оригінальним репо, щоб переконатися, що у нас останнє кодування

git fetch original

Як, запропонував VonC, переконайтеся, що ми на майстра.

git checkout master

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

git reset --hard original/master

І ви закінчили :)


2
Я переходжу fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.до останнього кроку. Будь-яка порада?
TomNorway

Схоже, це просто залишає вам запас на початковій віддаленій гілці. Я припускаю, що для цього не вистачає кроку, щоб повернути ВАЛУ вилку на правильний пульт?
Рей Суельцер

1
originalкраще, ніж upstream(якими користуються документи Github), як origin/masterце "вище" місцевих master. Зменшує неоднозначність. Цікаво, чи це саме для цього ви використовуєте?
воган

1
Саме тому я цим і користуюся!
Ахмад Авайс

2
Я дотримувався цих вказівок і тепер статус git говорить: Про головне відділення Ваша філія та "origin / master" розійшлися та мають 52 та 5 різних доручень відповідно. (використовуйте "git pull", щоб об'єднати віддалену гілку у вашу), але я хочу відкинути свої 5 комітів. Який наступний крок?
користувач3562927

6

Після @VonC чудова відповідь. Ваша політика компанії GitHub може не дозволити "натискати" на "master".

remote: error: GH003: Sorry, force-pushing to master is not allowed.

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

Для ефективного скидання виделки потрібно виконати наступні дії:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Відкрийте свою вилку в GitHub, у розділі "Налаштування -> Відділення -> Гілка за замовчуванням" виберіть "new_master" як нову гілку за замовчуванням. Тепер ви можете натиснути на "головну" гілку:

git checkout master
git push --force origin

Тоді ви повинні встановити назад "master" як гілку за замовчуванням у налаштуваннях GitHub. Щоб видалити 'tmp_master':

git push origin --delete tmp_master
git branch -D tmp_master

Інші відповіді, що попереджають про втрату змін, все ще діють, будьте обережні.


4

Як це зробити 100% за допомогою GUI Sourcetree

(Не всім подобається робити справи через інтерфейс командного рядка git)

Після того, як це налаштовано, вам потрібно буде лише робити кроки 7-13 з цього моменту.

Витягнути> головна гілка каси> скинути їх на головний> Відправити зміни на сервер

Кроки

  1. На панелі інструментів меню у верхній частині екрана: "Репозиторій"> "Налаштування сховища"

"Репозиторій", виділений у верхній панелі меню

  1. "Додати"

Кнопка "Додати" внизу діалогового вікна

  1. Поверніться до GitHub і скопіюйте URL-адресу клонування.

Кнопка "Клонувати або завантажувати" на веб-сайті Github, а потім URL-адресу git

  1. Вставте URL у поле "URL-адреса / шлях", після чого дайте ім'я, яке має сенс. Я назвав це "майстром". Не встановлюйте прапорець "Віддалений за замовчуванням" прапорець . Ви не зможете перейти безпосередньо до цього сховища.

Поля "Віддалене ім'я" та "URL / шлях", виділені в діалоговому вікні "Віддалені відомості"

  1. Натисніть "ОК", і ви побачите, що він відображається у вашому списку сховищ зараз.

"master" сховище додано до списку сховищ у діалоговому вікні "Налаштування репозиторію"

  1. Натисніть "OK" ще раз, і ви побачите, що він відображається у вашому списку "Віддалені".

"master" сховище, виділене у віддаленому списку в бічній панелі

  1. Натисніть кнопку "Вибрати" (у верхньому лівому куті заголовка дерева джерела)

Кнопка "Вилучити" в області заголовка

  1. Переконайтесь, що прапорець "Вибрати з усіх віддалених" прапорець і натисніть "ОК"

У діалоговому вікні "Вилучення" виділено прапорець "Витягнути з усіх віддалених"

  1. Двічі клацніть на вашій «головній» гілці, щоб перевірити, чи вона вже не перевірена.

  2. Знайдіть команду, до якої ви хочете скинути, якщо ви назвали repo "майстром", ви, швидше за все, захочете знайти команду з тегом "master / master" на ній.

Приклад здійснення з тегом "master / master" на ньому

  1. Клацніть правою кнопкою миші на фіксації> "Скинути поточну гілку до цього".

  2. У діалоговому вікні встановіть поле "Використовуючи режим:" на "Жорстко - відмініть всі зміни робочої копії", потім натисніть "ОК" (переконайтеся, що спочатку всі зміни, які ви не хочете втратити, перейдіть на окрему гілку).

Поле "Використання режиму", виділене в діалоговому вікні "Скидання для виконання".  Встановлено "відмінити всі зміни робочої копії"

  1. Натисніть кнопку "Натиснути" (ліворуч у верхній частині заголовка дерева джерела), щоб завантажити зміни до вашої копії репо.

Кнопка "Натиснути" в області заголовка

Ваше Готово!

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