Як почистити вилку Github, щоб я міг робити чисті запити на витягування?


83

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

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

Я начебто хочу підірвати свою вилку і зробити нову вилку вгору за течією, але я вважаю, що це теж складно.

Зізнавшись у своїх гріхах Git, як отримати звільнення від github?


1
Любіть своє визнання та прохання про звільнення :-)
Джон Керн,

Що, є люди, для яких git не є релігією? ;-)
pjmorse

Відповіді:


102

Крок 1: Витягніть зміни вгору за течією
Рекомендується додати репозиторій вище за течією як "вище за течією", як це пояснено на сторінці Fork a Repo :

git pull --rebase upstream master

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

Крок 2: (Необов’язково) Об’єднайте свої коміти в 1 коміт

git reset --soft upstream/master

Ця команда "скасує" всі ваші коміти, але не змінить файли. Таким чином, ви можете здійснити всі зміни в одному коміті.

git commit -a

Крок 3: Перевірте та протестуйте свої зміни

Щоб показати зміни, використовуйте графічний інтерфейс, як вбудований gitk, Sourcetree , TortoiseGit або Tower (платний) тощо.

Крок 4: Натисніть

git 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, а не основним git, хоча він використовує основні git-функції. Існують спеціальні адміністративні можливості github, які ви можете зробити за допомогою github-форків.
Сет Робертсон,

1
А, бачу. Я в основному використовую BitBucket, і там "Fork" є синонімом слова "clone", коли ви працюєте з особистими робочими копіями. Я все одно залишу тут свою відповідь, хоча про всяк випадок.
Шон Едвардс,

Так, я вже кілька разів видаляв свій локальний клон і повторно клонував. Я провів експеримент з іншим репо, і схоже, немає проблем із видаленням форка та створенням нового з того самого джерела.
pjmorse

Примітка. Я використовую git format-patchдля збереження комітів, які я хочу зберегти першими.
pjmorse

1
Видалення розгалуженого сховища та переформатування непотрібне, а використання git format-patchдля збереження вашої роботи - це своєрідне побічне крокування всіх корисних інструментів, які має git для управління гілками. Надалі git rebase -iправильним способом є вибіркове переписування ваших комітів у верхній частині нової masterгілки.
Mark Longair

0

У своєму приватному репо додайте репо форкі в якості пульта. Перебазуйте / скиньте свої гілки з гілок пульта. Зробіть силовий натиск до вашого репозиторію github.

Якщо вам потрібні точні команди, дайте мені знати. Також дайте мені знати, чи хочете ви спробувати зберегти місцеві коміти, чи це "здуття" нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.