ChatGPT解决这个技术问题 Extra ChatGPT

Git 从 GitHub 拉取某个分支

我有一个有多个分支的项目。我一直将他们推到 GitHub,现在其他人正在从事该项目,我需要从 GitHub 中提取他们的分支。它在master中运行良好。但是假设有人创建了一个分支 xyz。如何从 GitHub 提取分支 xyz 并将其合并到我的 localhost 上的分支 xyz

我实际上在这里有我的答案:Push and pull branches in Git

但我得到一个错误“![拒绝]”和一些关于“非快进”的东西。

有什么建议么?

您正在运行的实际命令是什么?
获取可能会因“非快进”消息而失败。您是否修改了远程跟踪分支(origin/xyz),或者分支是否在远程存储库中重绕/重写?您可能需要使用“git fetch origin --force”,但请在使用之前阅读文档。
例如,远程可以是一个带有选定分支的 github URL..(请参阅对 Cabri 的回答的评论)

m
mipadi

但我得到一个错误“![拒绝]”和一些关于“非快进”的东西

那是因为 Git 无法将分支中的更改合并到您当前的 master 中。假设您已签出分支 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!

不,问题在于获取,而不是合并步骤。
通常,远程设置为强制提取,即使它们不会导致快进提交,所以它不应该发生在 fetch 上,除非 OP 使用通常的配置更改了某些内容。快进问题可能在提取或合并期间发生。是什么让您说问题肯定出在获取而不是合并中?
我遵循这些步骤(获取、合并)。 Git告诉我没有什么可做的。当我尝试提交时,它会因对快进的抱怨而崩溃。
@mipadi 我和Jean 有同样的问题,虽然我不能说遥控器是以你提到的非默认方式设置的,但我可以说使用 git fetch -f 解决了我的问题!谢谢!
这会将远程分支 xzy 合并到本地分支 master,这不是原始问题所暗示的; “如何从 GitHub 中提取分支 xyz 并将其合并到本地主机上的分支 xyz 中?”
S
StayOnTarget

只需明确地跟踪您的远程分支,一个简单的 git pull 就可以满足您的需求:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

后者是本地操作。

甚至更适合 GitHub documentation on forking

git branch -f new_local_branch_name upstream/remote_branch_name

如果你得到'Not a valid object name:'origin/remote_branch_name',请先执行'git fetch origin'。
致命:无法强制更新当前分支。
A
Abu Shoeb

一种安全的方法是先创建一个本地分支(即 xyz),然后将远程分支拉入您的本地。

# create a local branch
git checkout -b xyz

# make sure you are on the newly created branch
git branch

# finally pull the remote branch to your local branch
git pull origin xyz

这是可以将远程分支拉到本地分支的语法。

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

git pull origin xyz:xyz

完美的!我只是不知道这种语法:git pull {repo} {remotebranchname}:{localbranchname}。问题,如果那个 pull 不起作用(也许有人更新了分支并且会有合并冲突)我有什么选择?
我对此表示反对,因为它试图将远程分支合并到您当前的分支(例如 master)中。这不是大多数人想要做的,也不是 OP 要求的。 @mohit 的答案是正确的选择。
Phrogz - 看起来这种行为在最新版本的 Git 中发生了变化。我以前用过这个,效果很好。
答案严重误导!!!我在没有注意到@Phrogz 的评论的情况下应用了答案,现在遇到了他/她提到的问题。应该明确表达它尝试合并的分支,或者应该删除答案!!!!
@Phrogz,@Letitbe 您尝试了哪个命令?我可以相应地改变答案。从来没有把它拉进主人的问题。
P
Peter Mortensen

最好的方法是:

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

在 github 上创建新的“dev”分支并尝试上述操作后,我收到以下错误消息:“fatal: origin/dev is not a commit and a branch 'dev' cannot be created from it” 解决方案是“git根据下面 Bradley Flood 的解决方案获取”,然后重新运行 mohit 的答案。
B
Bradley Flood

git fetch 将获取最新的分支列表。

现在您可以git checkout MyNewBranch

完毕 :)

有关详细信息,请参阅文档:git fetch


它工作得很好 git fetch,然后 git checkout remoteBranch
P
Peter Mortensen

我不确定我是否完全理解这个问题,但是拉一个现有的分支是这样完成的(至少它对我有用:)

git pull origin BRANCH

这是假设您的本地分支是在 origin/BRANCH 之外创建的。


这会将分支拉入您当前的本地分支,因此当您在 devgit pull origin feature 时,它会将功能分支拉入 dev。问这个问题的人想创建一个新分支 feature 并拉入这个分支
但首先你需要做 git checkout -b xyz 然后你做 git pull origin xyz
A
Adrien Renaud

简单地说,如果您想从 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

a
anatoly techtonik

这帮助我在将其合并到其他分支之前获得远程分支:

git fetch repo xyz:xyz
git checkout xyz

F
Frádely Diloné

要从 GitHub 中提取分支,您可以使用

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

确保分支名称完全相同。


V
Vicky

我做了

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。我猜他们是等价的。


为我工作。谢谢
K
KARTHIKEYAN.A
git pull <gitreponame> <branchname>

通常,如果您仅将 repo 分配给您的代码,那么 gitreponame 将是 origin。

如果你正在处理两个 repo,一个是本地的,另一个是远程的,你可以从 git remote -v 检查 repo 的列表。这显示了为您当前的代码分配了多少回购。

BranchName 应该存在于相应的 gitreponame 中。

您可以使用以下两个命令来添加或删除 repo

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

P
PKV

你也可以

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

t
titleLogin

你可以试试

git branch -a

git fetch 获取最新的分支列表。

git checkout theBranch //进入分支

git checkout -b "yourNewBranch" // 在你自己的分支“theBranch”中工作