Очистите вилку и перезапустите ее из верхнего потока.
Я разветвил репозиторий, затем внес некоторые изменения, и, похоже, я все испортил.
Я хочу начать его заново с нуля, используя текущий 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 с этого момента.
Выбрать> оформить главную ветку> сбросить на главную> Отправить изменения на сервер
меры
- В панели инструментов меню вверху экрана: "Репозиторий" > "Настройки репозитория"
- "Добавлять"
- Вернитесь на GitHub и скопируйте URL-адрес клона.
- Вставьте URL-адрес в поле "URL / путь", а затем дайте ему имя, которое имеет смысл. Я назвал это "мастер". Не устанавливайте флажок "Удаленный по умолчанию". Вы не сможете напрямую перейти в этот репозиторий.
- Нажмите "ОК", и вы должны увидеть, что он появится в вашем списке хранилищ сейчас.
- Нажмите "ОК" еще раз, и вы должны увидеть его в вашем списке "Remotes".
- Нажмите кнопку "Получить" (вверху слева в области заголовка дерева источников)
- Убедитесь, что флажок "Получить со всех пультов" установлен и нажмите "ОК".
Дважды щелкните по своей "основной" ветке, чтобы проверить, не проверена ли она уже.
Найдите коммит, в который вы хотите сбросить коммит, если вы назвали репо "master", вы, скорее всего, захотите найти коммит с тегом "master / master" на нем.
Щелкните правой кнопкой мыши на коммите> "Сбросить текущую ветку до этого коммита".
В диалоговом окне установите для поля "Using mode:" значение "Hard - отменить все изменения рабочей копии", затем нажмите "OK" (сначала внесите изменения, которые вы не хотите потерять, в отдельную ветку).
- Нажмите кнопку "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
или что-то выборочно сравнить и скопировать из заброшенной работы, если это необходимо.