Git тянуть определенную ветку от GitHub


631

У меня есть проект с несколькими ветками. Я отправлял их на GitHub , и теперь, когда над проектом работает кто-то другой, мне нужно извлечь их ветки из GitHub. Он отлично работает в мастере. Но скажем, что кто-то создал ветку xyz. Как я могу извлечь ветку xyzиз GitHub и объединить ее xyzс моей веткой localhost?

На самом деле у меня есть мой ответ здесь: Push и тянуть ветви в Git

Но я получаю сообщение об ошибке "! [Отклонено]" и что-то о "не быстрой перемотке вперед".

Какие-либо предложения?


3
Какую команду вы используете?
Алекс Н.

1
Это выборка, которая может завершиться ошибкой с сообщением «не перемотка вперед». Вы модифицировали ветку удаленного отслеживания (origin / xyz) или ветка была перемотана / переписана в удаленном хранилище? Возможно, вам нужно использовать « git fetch origin --force», но, пожалуйста, прочитайте документацию, прежде чем делать это.
Якуб Наребски

Ответы:


758

Но я получаю ошибку "! [Отклонено]" и что-то о "не быстрой перемотке вперед"

Это потому, что Git не может объединить изменения из веток в ваш текущий мастер. Допустим, вы отметили ветку masterи хотите объединить ее в удаленной ветке other-branch. Когда вы делаете это:

$ git pull origin other-branch

Git в основном делает это:

$ git fetch origin other-branch && git merge other-branch

То есть, за pullним просто fetchследует merge. Однако, когда pull-ing, Git будет сливаться только в том other-branch случае, если сможет выполнить ускоренное слияние. Быстро вперед слияние слияние , в котором глава филиала вы пытаетесь слиться является прямым потомком главы филиала вы хотите объединить. Например, если у вас есть это дерево истории, то слияние other-branchприведет к ускоренному слиянию:

O-O-O-O-O-O
^         ^
master    other-branch

Тем не менее, это не будет ускоренным слиянием:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Чтобы решить вашу проблему, сначала загрузите удаленную ветку:

$ git fetch origin other-branch

Затем объедините его с вашей текущей веткой (я предполагаю, что это так master) и исправьте все конфликты слияний:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

Нет, проблема с извлечением, а не с шагом слияния.
Якуб Наребски

3
Как правило, удаленные устройства настраиваются таким образом, что выборки выполняются принудительно, даже если они не приводят к ускоренной фиксации, поэтому это не должно происходить при выборке, если OP не изменил что-либо с обычной конфигурацией. Проблема ускоренной перемотки может возникнуть во время выборки или слияния. Что заставляет вас говорить, что проблема определенно в извлечении, а не в слиянии?
Мипади

Я следую за этими шагами (выборка, слияние). Git говорит мне, что делать нечего. Когда я пытаюсь совершить коммит, он стонет от быстрых форвардов.
Жан Джордаан

1
@mipadi У меня была та же проблема, что и у Джин, и, хотя я не могу сказать, что пульт настроен не так, как вы упомянули, я могу сказать, что использование git fetch -fисправило мою проблему! Спасибо!
Cregox

1
Это объединяет удаленную ветвь xzyс локальной ветвью master, что было не тем, что подразумевалось в исходном вопросе; "Как я могу извлечь ветку xyz из GitHub и объединить ее с веткой xyz на моем локальном хосте?"
user5359531

302

Просто отслеживайте свои удаленные ветви явно, и простой git pullбудет делать то, что вы хотите:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Последнее является локальной операцией.

Или еще больше вписывается в документацию GitHub по разветвлению :

git branch -f new_local_branch_name upstream/remote_branch_name

40
Если вы получаете «Неправильное имя объекта:« origin / remote_branch_name », сначала выполните« git fetch origin ».
Мартин Коничек

131

Вы можете вытянуть ветку к ветке с помощью следующих команд.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Когда вы находитесь в основной ветке, вы также можете сначала проверить ветку, например:

git checkout -b xyz

Это создает новую ветку "xyz" из мастера и непосредственно проверяет ее.

Тогда вы делаете:

git pull origin xyz

Это тянет новую ветку к вашей местной xyzветке.


1
Отлично! Я просто не знал этот синтаксис: git pull {repo} {remotebranchname}: {localbranchname}. Вопрос, если этот пул не работает (возможно, кто-то обновил ветку и возникнут конфликты слияния), каковы мои варианты?
Коста

7
Я понижаю это, потому что он пытается объединить удаленную ветку с вашей текущей веткой (например, master). Это не то, что хочет делать большинство людей, и это не то, о чем просил ФП. Ответ @mohit - правильный выбор.
Phrogz

1
Phrogz - похоже, это поведение изменилось в последних версиях Git. Я использовал это раньше, и он работал отлично.
Паван

89

Лучший способ это:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
После создания новой ветки «dev» на github и пробуя вышеописанное, я получил следующее сообщение об ошибке: «fatal: origin / dev не является коммитом и из него не может быть создана ветка dev» «Решение было» git Получить "в соответствии с решением Брэдли Флуда ниже, а затем повторно запустить ответ Мохита.
TomEberhard

46

git fetch захватит последний список веток.

Теперь вы можете git checkout MyNewBranch

Выполнено :)


Для получения дополнительной информации см. Документы: git fetch


37

Я не уверен, что полностью понимаю проблему, но вытаскивание существующей ветки выполняется следующим образом (по крайней мере, это работает для меня :)

git pull origin BRANCH

Это предполагает, что ваша локальная ветвь создана из источника / BRANCH.



8

Проще говоря, если вы хотите вытащить из GitHub ветку the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

Обычно, если у вас есть только репо, назначенный вашему коду, тогда gitreponame будет источником.

Если вы работаете с двумя репозиториями, например, один локальный, а другой для удаленного, например, вы можете проверить список репозитория из git remote -v . это показывает, сколько репо назначено вашему текущему коду.

BranchName должно существовать в соответствующем gitreponame.

Вы можете использовать следующие две команды для добавления или удаления репо

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

Вы также можете сделать

git pull -r origin master

исправить конфликты слияния, если таковые имеются

git rebase --continue

-r для перебазирования. Это сделает вашу структуру ветвей из

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

в

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Это приведет к более чистой истории. Примечание. В случае, если вы уже выдвинули свою ветвь в начало (или любой другой удаленный узел), вам, возможно, придется принудительно продвигать ветку после перезагрузки.

git push -f origin other-branch

1

я сделал

git branch -f new_local_branch_name origin/remote_branch_name

Вместо

git branch -f new_local_branch_name upstream/remote_branch_name

По предложению @innaM. Когда я использовал вышестоящую версию, она говорила «роковая: недопустимое имя объекта:« upstream / remote_branch_name »». Я не сделал git fetch originкак предложенный комментарий, но вместо этого просто заменил upstreamна origin. Я думаю, они эквивалентны.


0

для вытягивания ветки из GitHub вы можете использовать

git checkout --track origin/the-branch-name

Убедитесь, что имя ветви точно такое же.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.