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

397

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

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

tampe125
источник
4
Очень сложные ответы на простой вопрос. Просто удалите все и снова клонируйте хранилище.
Яза
1
@ Яза, нет, в некоторых случаях это может вызвать еще больше проблем.
Шимми Вайцхандлер
@ Shimmy, нет, если вы хотите начать все заново, как OP спросил.
Яза

Ответы:

797

Самое простое решение было бы (используя ' 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сначала снять защиту (см. Рисунок ниже), а затем повторно защитить ее после принудительного нажатия ).

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


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

VonC
источник
4
привет, это сработало отлично! Кстати правильный синтаксис сбросаgit reset --hard upstream/master
tampe125
1
@ tampe125 Отлично. Я исправил синтаксис git resetв ответе.
VonC
роковое: «upstream» не выглядит как git-репозиторий
Benubird
@Benubird - это имя удаленного, ссылающегося на исходный репозиторий (тот, который вы разветвили): см. График и команды « git remote» в stackoverflow.com/a/3903835/6309 .
VonC
Правильно, но из вашего вопроса не ясно, как это настроить, так как по умолчанию «upstream» не определен в командной строке, поскольку я разветвлялся через github.
Benubird
31

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

Есть пульт Git, 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

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

Ахмад Авайс
источник
2
Я иду fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.на последний шаг. Любой совет?
TomNorway
Похоже, что это просто оставляет вас в запасе на исходной удаленной ветке. Я полагаю, что отсутствует шаг для сброса ВАШЕЙ вилки обратно на правильный пульт?
Рэй Зельцер
1
originalлучше, чем upstream(который используется в Github docs), как origin/masterи «upstream» от local master. Уменьшает двусмысленность. Интересно, поэтому ты этим пользуешься?
вон
1
Именно поэтому я использую это!
Ахмад
2
Я следовал этим инструкциям, и теперь git status говорит: «На ветке master» Ваша ветка и «origin / master» разошлись, и у каждого по 52 и 5 разных коммитов соответственно. (используйте "git pull", чтобы объединить удаленную ветку с вашей), но я хочу отменить 5 коммитов. Какой следующий шаг?
user3562927
6

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

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

Hugodby
источник
4

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

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

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

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

меры

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

«Репозиторий» выделен в верхней строке меню

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

Кнопка «Добавить» внизу диалога

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

Кнопка «Клонировать или скачать» на веб-сайте Github, за которой следует URL-адрес git.

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

Поля «Удаленное имя» и «URL / путь» выделены в диалоговом окне «Удаленные данные»

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

«главный» репозиторий добавлен в список репозиториев в диалоге «Настройки репозитория»

  1. Нажмите «OK» еще раз, и вы должны увидеть его в списке «Remotes».

«Основной» репозиторий выделен в списке пультов на боковой панели

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

Кнопка «Выбрать» в области заголовка

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

Флажок «Извлечь со всех пультов», выделенный в диалоговом окне «Извлечь»

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

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

Пример коммита с тегом "master / master"

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

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

Поле «Использование режима» выделено в диалоговом окне «Сбросить».  Он установлен, чтобы "отменить все изменения рабочей копии"

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

Кнопка «Нажми» в области заголовка

Ваш готово!

Даниэль Тонон
источник