Як витягнути віддалену гілку з чужого репо


265

У мене на GitHub розміщений проект, який хтось розщедрився. На роздріб вони створили нову гілку "foo" та внесли деякі зміни. Як я перетягую їх "foo" у нову гілку, яка також називається "foo" у моїй репо?

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

Припустимо наступне:

  1. Оскільки вони підняли мій проект, обидва наші репозитори поділяють одну і ту ж "історію"
  2. Хоча GitHub показує, що їх проект був роздвоєний у мене, у моєму місцевому сховищі немає жодних посилань на проект цієї людини. Чи потрібно додати їх як віддалений?
  3. У мене ще немає відділення під назвою "foo" - я не знаю, чи потрібно мені спочатку створити це вручну.
  4. Я, безумовно, хочу, щоб це витягнулося в окрему гілку, а не мій господар.

Відповіді:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Це дозволить встановити локальну гілку foo, відстежуючи віддалену гілку coworker/foo. Тож коли ваш колега вніс деякі зміни, ви можете легко їх перетягнути:

git checkout foo
git pull

Відповідь на коментарі:

Класно :) І якщо я хотів би внести свої власні зміни до цієї гілки, чи слід створити другий "бар" гілки з "foo" і працювати там замість прямо на "foo"?

Вам не потрібно створювати нову гілку, хоч я і рекомендую. Ви можете також взяти на себе зобов’язання безпосередньо і змусити fooколегу вивести свою гілку. Але ця гілка вже існує, і ваша гілка fooповинна бути налаштована як вища гілка до неї:

git branch --set-upstream foo colin/foo

припустимо colin, що ваше сховище (віддалене до сховища ваших колег) визначене аналогічно:

git remote add colin git://path/to/colins/repo.git

3
Це було дуже швидко :) Ви можете додати, що він повинен використовувати git://URL-адресу зі сторінки сховища GitHub іншої людини замість //path/to/coworkers/repo.git. (Описуючи, що саме це зробило мою відповідь занадто повільним;))
Марк Лонгейр

Класно :) І якщо я хотів би внести свої власні зміни до цієї гілки, чи слід створити другу "місцеву гілку" з "foo" і працювати там замість прямо на "foo"?
Колін О'Делл

Або це безпечно працювати безпосередньо в моєму "foo" і тягнути / зливати його зміни в подальшому? Яка найкраща практика тут?
Колін О'Делл

1
Ідеально, саме це я шукав :) Дякую за допомогу !!
Колін О'Делл

1
Приємна відповідь за 3 хвилини!
Тієм

103

Ні, вам не потрібно додавати їх як пульт. Це було б незручно і болі робити щоразу.

Захоплення своїх комісій:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Це створює локальну філію, ournameforbranchяку називають точно такою ж, як theirbranchі для них. На прикладі питання останнім аргументом було б foo:foo.

Зауважте, що :ournameforbranchдеталь може бути залишена, якщо придумати ім'я, яке не суперечить одній із власних гілок, набридає. У цьому випадку FETCH_HEADдоступна посилання, що називається . Ви можете git log FETCH_HEADбачити їхні зобов’язання, а потім робити такі речі, як cherry-pickedвишня, вибираючи їх.

Відштовхуючи їх назад:

Часто ви хочете виправити щось своє і відсунути його назад. Це теж можливо:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

Якщо робота в відокремленому стані хвилює вас, будь-якими способами створіть гілку за допомогою :ournameforbranchта заміни FETCH_HEADта HEADвище ournameforbranch.


2
Дякую за це, інша відповідь не працює, якщо і ви, і інша особа мають однакові імена гілок (наприклад, masterгілка за замовчуванням )
Job

2
Варто зазначити, що цей метод не працюватиме, якщо у вас немає таких речей, як ключ SSH, пов’язаний із вашим обліковим записом github, див. Stackoverflow.com/questions/12940626
Przemek D

чи не потрібно вас додавати як співавтора, щоб ви могли перейти до їхнього репо?
Мед

@Honey Безумовно! Натискання передбачає, що у вас є необхідні дозволи на віддаленому кінці для натискання. Якщо ви також отримаєте, це означає, що шлях доступний.
antak

Якщо ви біжите, git branch -m newbranchперебуваючи в такому відірваному стані, git втратить розум і почне говорити, що ваше репо вже не дійсне. git initсхоже, це виправить і поверне вас у більш-менш стан, в якому ви були раніше, з гілкою, названою "newbranch".
Ян Хіксон

14

Якщо відповідь Антака:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

дає вам:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Потім (дотримуючись порад Przemek D) використовуйте

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

Далі - це приємне доцільне рішення, яке працює з GitHub для перевірки PR-відділення з вилки іншого користувача. Вам потрібно знати ідентифікатор запиту на витяг (який GitHub відображається разом із заголовком PR).

Приклад:

Закріплення вашого небезпечного коду # 8
аліса хоче об'єднати-зробити в your_repo:masterзher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Замініть пульт, якщо він відрізняється від origin.
Замініть 8правильний ідентифікатор запиту на витяг.


2
Це потребує більшої кількості коштів. працює pe3rfectly і уникає помилки "фатально: Не вдалося знайти віддалену відмову", яку я отримував з голосовою відповіддю. Дякую!
Майкл Ромрелл

2 рядки легкого коду. Дякуємо, що поділилися цим! Єдине, що солодше, ніж це - це легке злиття оновлень назад у їх запит на витяг.
klewis

4

У GitHub є новий варіант відносно попередніх відповідей, просто скопіюйте / вставте командні рядки з PR:

  1. Перейдіть до нижньої частини PR, щоб побачити кнопку MergeабоSquash and merge
  2. Клацніть посилання праворуч: view command line instructions
  3. Натисніть піктограму «Копіювати» праворуч від кроку 1
  4. Вставте команди у свій термінал

2

Якщо роздвоєне репо захищене, тому ви не можете натиснути прямо на нього, а ваша мета - внести зміни в його колонтитули, тоді вам потрібно ввімкнути їхнє відділення у ваше репо, як:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Тепер у вас є локальна копія foo, не пов’язана з цим висхідним потоком. Ви можете вносити зміни до нього (чи ні), а потім натискати на foo до власного віддаленого репо.

git push --set-upstream origin foo

Тепер foo знаходиться у вашій репортажі на GitHub, і ваш місцевий foo відстежує його. Якщо вони продовжують вносити зміни в foo, ви можете отримати їх та об'єднатись у свій foo.

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