Как вытащить удаленную ветку из чужого репо - PullRequest
228 голосов
/ 04 мая 2011

У меня есть проект, размещенный на GitHub, который кто-то подписал. На своей вилке они создали новую ветку "foo" и внесли некоторые изменения. Как мне перенести их "foo" в новую ветку, которая также называется "foo" в моем репо?

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

Допустим следующее:

  1. Поскольку они раздвоили мой проект, оба наших репозитория имеют одинаковую «историю»
  2. Хотя GitHub показывает, что их проект был разветвлен от моего, мой локальный репозиторий не имеет ссылок на проект этого человека. Нужно ли добавлять их в качестве удаленного?
  3. У меня пока нет ветки с именем "foo" - я не знаю, нужно ли мне сначала создавать это вручную.
  4. Я определенно хочу, чтобы это вытащили в отдельную ветку, а не моего хозяина.

Ответы [ 6 ]

296 голосов
/ 04 мая 2011
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

Ответ на комментарии:

Круто :) А если бы яхотел бы внести свои собственные изменения в эту ветку, должен ли я создать вторую локальную ветку "bar" из "foo" и работать там вместо того, чтобы напрямую работать с моей "foo"?

Вам не нужносоздать новую ветку, хотя я рекомендую это.С тем же успехом вы можете взять на себя обязательство foo, и ваш коллега потянет вашу ветку.Но эта ветвь уже существует, и ваша ветвь foo должна быть настроена как восходящая ветка к ней:

git branch --set-upstream foo colin/foo

при условии, что colin - это ваш репозиторий (удаленный от вашего репозитория коллег), определенный вАналогичным образом:

git remote add colin git://path/to/colins/repo.git
79 голосов
/ 10 марта 2017

Нет, вам не нужно добавлять их в качестве удаленного. Это было бы громоздко и мучительно каждый раз.

Получение их коммитов:

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.

6 голосов
/ 04 сентября 2017

Если ответ антака:

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>
2 голосов
/ 16 октября 2018

Если разветвленное репо защищено, и вы не можете прямо войти в него, и ваша цель состоит в том, чтобы внести изменения в их foo, тогда вам нужно вставить их ветку foo в свой репо следующим образом:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/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
0 голосов
/ 15 января 2019

GitHub имеет новую опцию относительно предыдущих ответов, просто скопируйте / вставьте командные строки из PR:

  1. Прокрутите до нижней части PR, чтобы увидеть Merge или Squash and merge button
  2. Нажмите на ссылку справа: view command line instructions
  3. Нажмите значок Копировать справа от шага 1
  4. Вставьте команды в свой терминал
0 голосов
/ 11 ноября 2018

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

Пример:

Исправление небезопасного кода #8
Алиса хочет объединить 1 коммит в your_repo:master из her_repo:branch

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

Заменить пульт, если отличается от origin.
Заменить 8с правильным идентификатором запроса на получение.

...