Очистите вилку и перезапустите ее из верхнего потока. - PullRequest
342 голосов
/ 10 марта 2012

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

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

Ответы [ 4 ]

695 голосов
/ 10 марта 2012

Самое простое решение было бы (используя '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 ".

upstream


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

enter image description here


Примечание: в частности, на GitHub теперь есть (февраль 2019 г.) ярлык для удаления разветвленных репо для извлечениязапросы, которые были объединены в апстрим.

28 голосов
/ 22 сентября 2016

Любовь 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

И все готово:)

4 голосов
/ 06 августа 2018

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

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

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

Извлечение> главная ветвь извлечения> возврат к своему основному устройству> Push-изменения на сервере

Steps

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

  1. "Добавить"

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

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

  1. Нажмите «ОК», и вы должны увидеть, что оно появилось в вашем списке репозиториев.

  1. Снова нажмите «ОК», и вы увидите, что оно появилось в вашем списке «Пультов».

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

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

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

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

Example of a commit with a

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

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

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

Готово!

3 голосов
/ 07 августа 2017

После @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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...