Как мне очистить вилку Github, чтобы можно было делать чистые запросы на вытягивание?

83

Я форкнул репозиторий на Github. Я внес некоторые незначительные изменения и отправил запросы на вытягивание в апстрим, но по ходу мой форк стал настолько искаженным, что я не могу генерировать чистые запросы на вытягивание; когда я запускаю пул-реквест из ветки с шестью изменениями, Github хочет отправить тринадцать, причем семь из них уже существуют в восходящем направлении (natch).

Моя проблема, похоже, связана только с извлечением последних коммитов , но когда я создаю новую ветку и коммиты с вишневым выбором, у меня все еще есть дополнения. Я тоже поиграл с ребазингом , но теперь похоже, что даже мой мастер настолько испорчен, что я не могу создать чистую копию апстрима . Очевидно, это потому, что я не понимал, что мне нужно перебазировать вместо слияния , поэтому очевидно, что я сделал ошибки; что я пытаюсь сделать, так это выяснить, как распутать этот узел и вернуться в чистое состояние, в котором я могу двигаться вперед с пользой.

Я как бы хочу взорвать свою вилку и создать новую вилку восходящего потока, но я понимаю, что это тоже сложно.

Признавшись в своих грехах, связанных с Git, как мне получить отпущение грехов на GitHub?

pjmorse
источник
1
Обожаю ваше признание и просьбу о прощении :-)
Джон Керн
Что, есть люди, для которых git не религия? ;-)
pjmorse

Ответы:

102

Шаг 1. Извлечение изменений из восходящего потока
. Рекомендуется добавить вышестоящее репо как «восходящее», как описано на странице « Форк репо» :

git pull --rebase upstream master

--rebaseОпция помещает изменения поверх последний коммит без слияния.

Шаг 2. (Необязательно) Объедините ваши коммиты в 1 коммит

git reset --soft upstream/master

Эта команда «отменит» все ваши коммиты, но не изменит файлы. Таким образом, вы можете зафиксировать все свои изменения за одну фиксацию.

git commit -a

Шаг 3. Проверьте и проверьте свои изменения

Чтобы показать изменения, используйте графический интерфейс, например встроенный gitk, Sourcetree , TortoiseGit или Tower (платный) и т. Д.

Шаг 4: нажмите

git pushвыдаст ошибку, потому что push изменит историю целевого репозитория.
Если вы уверены, что изменения, показанные на шаге 3, верны, нажмите "-f"

git push -f origin master


Дополнительная информация
Команда для добавления пульта:

git remote add upstream git://github.com/[username]/[project].git

Вы также можете использовать прямой URL:

git pull --rebase  git://github.com/[username]/[project].git

Но тогда вам понадобится хэш последней фиксации восходящего потока вместо «upstream / master» на других этапах.

Боб Фэнджер
источник
3
Большое спасибо. GitHub должен обновить репозиторий Fork A Repo .
buschtoens
Благодаря! Я пробовал множество способов решить эту проблему, но ничего не помогло. Был почти готов сдул мою вилку, прежде чем нашел этот ответ ... и это сработало. Благодаря!
Иуда Габриэль Химанго
Привет, @JudahHimango. Вы тоже выполнили «шаг 2». Потому что я нахожусь в такой же ситуации, как и ты. Вы можете мне помочь.
arunit21
Это отличный ресурс. Благодаря!
Д-р Ян-Филип Герке
Мое разветвленное репо постоянно говорило, что оно не синхронизировано с восходящим потоком, поэтому я вытаскивал и объединял - что приводило к фиксации на моем форке, в которой не было необходимости. Используя этот подход и принудительное нажатие, мы разобрали это. Я также использовал rebase для объединения некоторых из моих предыдущих коммитов: git rebase -i HEAD ~ n [где n - количество
The Coder
4

Насколько я понимаю, как с Git, так и с Mercurial (я использовал только последний, поэтому могу ошибаться) совсем несложно сдуть вилку и заново ее разветвить. Я делаю это все время со своими проектами. Если вы согласны с этим (можете создать резервную копию ваших изменений или у вас нет каких-либо существенных изменений в вашей вилке), я бы сказал, что это, вероятно, путь.

Помните, что с DVCS, разветвление хранилища делает полный клон , что весь репозиторий . Если вы удалите текущую вилку, а затем снова создадите исходное репо, у вас будет совершенно чистый лист для работы.

Шон Эдвардс
источник
Форк в этом случае - это особая функция github, а не core git, хотя он использует основные функции git. Существуют специальные возможности администрирования github, которые можно реализовать с помощью вилок github.
Сет Робертсон
1
Ах я вижу. В основном я использую BitBucket, и там «Fork» является синонимом «clone», когда вы работаете с личными рабочими копиями. Я все равно оставлю здесь свой ответ, но на всякий случай.
Шон Эдвардс
Да, я уже несколько раз удалил свой локальный клон и повторно клонировал его. Я провел эксперимент с другим репо, и похоже, что нет проблем с удалением вилки и созданием новой из того же источника.
pjmorse
NB. Я использую git format-patchдля сохранения коммитов, которые хочу сохранить в первую очередь.
pjmorse
1
Удаление вашего разветвленного репозитория и перекомпоновка не требуется, а использование git format-patchдля сохранения вашей работы является своего рода обходом всех полезных инструментов, которые git имеет для управления ветвями. В будущем использование git rebase -iдля выборочной перезаписи ваших коммитов в верхней части новой восходящей masterветки будет правильным решением.
Марк Лонгэр
0

В своем частном репо добавьте репо форки как удаленное. Перебазируйте / сбросьте свои ветки из удаленных веток. Сделайте принудительный толчок к своему репозиторию github.

Если вам нужны точные команды, дайте мне знать. Также дайте мне знать, хотите ли вы попытаться сохранить локальные коммиты или "сдуть" - это нормально.

Сет Робертсон
источник