Git вытащить определенную ветку из GitHub
У меня есть проект с несколькими ответвлениями. Я подталкивал их к GitHub и теперь, когда кто-то работает на них, нужно тянуть на GitHub. Он отлично работает в мастер. Но скажем, у меня есть филиал xyz. Как я могу вытащить ветку xyz из GitHub и объединить ее в ветку xyz на моем локальном хосте?
У меня на самом деле есть свой ответ здесь:
толкать и тянуть ветки в Git
но я получаю ошибку"! [отклонено] " и что-то о "non fast forward".
какие предложения?
10 ответов:
но я получаю ошибку"! [отклонено] " и что-то о "non fast forward"
это потому что Git не может объединить изменения из ветки в текущий мастер. Допустим, вы проверили филиал
master, и вы хотите объединить в удаленной веткеother-branch. Когда вы делаете это:$ git pull origin other-branchGit в основном делает это:
$ git fetch origin other-branch && git merge other-branchто есть, a
pullэто простоfetchзатемmerge. Однако, когдаpull-Инг, ГИТ будет только слияниеother-branchесли он может выполнять вперед слияние. А вперед слияние-это слияние, в котором глава ветви, в которую вы пытаетесь слиться, является прямой потомок руководителя филиала, который вы хотите объединить. Например, если у вас есть это дерево истории, то сливаясьother-branchприведет к быстрому слиянию:O-O-O-O-O-O ^ ^ master other-branchоднако, это было бы не быстро-прямое слияние:
v master O-O-O \ \-O-O-O-O ^ other-branch, чтобы решить вашу проблему, сначала fetch удаленный филиал:
$ 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!
просто отслеживать удаленные ветви явно и просто
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
вы можете потянуть ветку к ветке с помощью следующих команд.
git pull {repo} {remotebranchname}:{localbranchname} git pull origin xyz:xyzкогда вы находитесь на главной ветке, вы также можете сначала проверить ветку, например:
git checkout -b xyzэто создает новую ветвь, "xyz", от мастера и непосредственно проверяет его.
вы тут:
git pull origin xyzэто тянет новую ветку в локальном
xyzфилиала.
Я не уверен, что полностью понимаю проблему, но вытягивание существующей ветви делается так (по крайней мере, это работает для меня :)
git pull origin BRANCHэто предполагает, что ваша локальная ветвь создается из источника/ветви.
git fetchзахватит последний список ветвей.теперь вы можете
git checkout MyNewBranchготово :)
для получения дополнительной информации см. docs:git fetch
это помогло мне получить удаленную ветку, прежде чем объединить ее в другую:
git fetch repo xyz:xyz git checkout xyz
git pull <gitreponame> <branchname>обычно, если у вас есть только РЕПО, назначенное вашему коду, то gitreponame будет origin.
Если вы работаете на двух РЕПО, как один является локальным, а другой для удаленного, как вы можете проверить список РЕПО от git remote-v. это показывает, сколько РЕПО назначено вашему текущему коду.
BranchName должен существовать в соответствующем gitreponame.
вы можете использовать следующие две команды для добавления или удаления РЕПО
git remote add <gitreponame> <repourl> git remote remove <gitreponame>
вы также можете сделать
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
Я
git branch -f new_local_branch_name origin/remote_branch_nameвместо
git branch -f new_local_branch_name upstream/remote_branch_nameкак предложил @innaM. Когда я использовал вышестоящую версию, он сказал"fatal: not a valid object name: 'upstream/remote_branch_name". Я этого не делал
git fetch originв качестве комментария предложил, но вместо того, чтобы просто заменитьupstreamСorigin. Я думаю, что они эквивалентны.
Comments