Очистите вилку и перезапустите ее из верхнего потока.

Я разветвил репозиторий, затем внес некоторые изменения, и, похоже, я все испортил.

Я хочу начать его заново с нуля, используя текущий upstream / master в качестве основы для моей работы.
Должен ли я перебазировать свой репозиторий или вообще удалить его?

5 ответов

Решение

Самое простое решение было бы (используя ' 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,
Заменить часть сброса на git rebase upstream/master, Тогда вам все равно придется форсировать толчок.
Смотрите также " Что мне делать, если я в плохой ситуации? "


Более полное решение, резервное копирование текущей работы (на всякий случай) подробно описано в разделе " Очистить ветку git master и перенести коммит в новую ветку ".

См. Также " Извлечение новых обновлений из исходного репозитория GitHub в разветвленный репозиторий GitHub ", чтобы проиллюстрировать, что " upstream " является.

вверх по течению


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

Люблю VonC ответ. Вот простая версия для начинающих.

Существует Git Remote называется origin Я уверен, что вы все в курсе. По сути, вы можете добавить в репозиторий git столько пультов, сколько захотите. Итак, что мы можем сделать, это ввести новый пульт, который является исходным репо, а не форком. Мне нравится это называть original

Давайте добавим оригинальные репо на наш форк как удаленный.

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

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

git fetch original

Как предложил VonC, убедитесь, что мы находимся на мастере.

git checkout master

Теперь, чтобы ускорить наш форк с последним кодом в исходном репо, все, что нам нужно сделать, это сделать полную перезагрузку нашей основной ветки в соответствии с исходным пультом.

git reset --hard original/master

И вы сделали:)

После @VonC отличный ответ. Политика вашей компании GitHub может не разрешать принудительное нажатие на мастера.

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" в качестве новой ветки по умолчанию. Теперь вы можете принудительно нажать на ветку 'master':

git checkout master
git push --force origin

Затем вы должны установить "master" в качестве ветви по умолчанию в настройках GitHub. Чтобы удалить 'tmp_master':

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

Остальные ответы, предупреждающие о потере ваших изменений, по-прежнему применяются, будьте осторожны.

Как это сделать на 100% через Sourcetree GUI

(Не всем нравится делать вещи через интерфейс командной строки git)

После того, как это будет установлено, вам нужно будет выполнить шаги 7-13 с этого момента.

Выбрать> оформить главную ветку> сбросить на главную> Отправить изменения на сервер

меры

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

  1. "Добавлять"

Кнопка

  1. Вернитесь на GitHub и скопируйте URL-адрес клона.

Кнопка

  1. Вставьте URL-адрес в поле "URL / путь", а затем дайте ему имя, которое имеет смысл. Я назвал это "мастер". Не устанавливайте флажок "Удаленный по умолчанию". Вы не сможете напрямую перейти в этот репозиторий.

Поля

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

  1. Нажмите "ОК" еще раз, и вы должны увидеть его в вашем списке "Remotes".

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

Кнопка

  1. Убедитесь, что флажок "Получить со всех пультов" установлен и нажмите "ОК".

Флажок

  1. Дважды щелкните по своей "основной" ветке, чтобы проверить, не проверена ли она уже.

  2. Найдите коммит, в который вы хотите сбросить коммит, если вы назвали репо "master", вы, скорее всего, захотите найти коммит с тегом "master / master" на нем.

Пример коммита с тегом

  1. Щелкните правой кнопкой мыши на коммите> "Сбросить текущую ветку до этого коммита".

  2. В диалоговом окне установите для поля "Using mode:" значение "Hard - отменить все изменения рабочей копии", затем нажмите "OK" (сначала внесите изменения, которые вы не хотите потерять, в отдельную ветку).

Поле

  1. Нажмите кнопку "Push" (вверху слева от области заголовка дерева источников), чтобы загрузить изменения в вашу копию репо.

Кнопка

Ваш готово!

В ответе VonC говорится

Имейте в виду, что вы можете потерять изменения, сделанные в ветке master (как локально, из-за reset --hard, так и на удаленной стороне, из-за push --force).

Поэтому я просто расскажу, как создать новую ветку в существующей вилке, которая отслеживает mainветвь репо, изначально разветвленная из.

Почему это может быть важно: предположим, у вас уже есть еще один запрос на извлечение для другой функции из того же форка. Или кто-то еще разветвился с вашей вилки. Тогда хард ресет - это плохо.

Предположим, удаленный удаленный сервер называется upstream.

      git fetch upstream main
git switch -c upstreamb/main/track upstream/main

Вы окажетесь в новой ветке upstreamb/main/track

      % git branch 
...
* upstreamb/main/track
% git pull upstream main
From github.com:XXXX/YYYY
 * branch                  main       -> FETCH_HEAD
Already up to date.

Заметь /в названии ветки разрешено. Чтобы избежать путаницы и двусмысленности, я добавил bвверх по течению, чтобы указать, что это локальная ветвь.

Теперь вы можете создать новую ветвь функции из трека, и вы можете использовать git difftoolили что-то выборочно сравнить и скопировать из заброшенной работы, если это необходимо.

Другие вопросы по тегам