在GitHub上追踪新创建的远程分支

223

我已经建立了一个本地主分支跟踪 Github 项目的远程主分支。现在,我的协作者在同一项目中创建了一个新的分支,我想做以下操作:

  1. 在本地创建一个新的分支
  2. 使这个新分支跟踪新创建的远程分支。

我应该如何正确地执行这些操作?


2
git checkout --track -b <本地分支> <远程>/<被跟踪分支> 也可以使用。 - MLister
16
如果只有一个以<whatever>结尾的远程跟踪分支,你甚至可以只运行 git checkout <whatever> 命令,Git会自动猜测你的意图。或者直接运行git checkout -t <remote>/<whatever>命令。 - Mark Longair
7个回答

302
git fetch
git branch --track branch-name origin/branch-name

第一条命令确保你在本地仓库有远程分支。第二条命令创建一个本地分支并追踪远程分支。它默认假设你的远程名称是origin,分支名称是branch-name

--track选项对于远程分支是启用的,你可以省略它。


3
当我执行此操作时,会出现警告:refname 'branch-name' 不明确。 - Ultrasaurus
20
如果只有一个与该分支名称相同的远程分支,您可以执行git checkout <branchname>,Git将自动检出并设置跟踪分支。我想重申@Mark Longair在此评论中提到的内容:https://dev59.com/E2gu5IYBdhLWcg3winc3#1qKdEYcBWogLw_1b3VQY。 - Ryan Walls
3
我必须执行 git fetch --all,否则新的分支将无法被获取。 - mschrimpf
1
回应 @mschrimpf,对于一个特殊的远程仓库(例如 company_remote),我必须先通过 git fetch company_remote 从该远程仓库获取。 - Zephaniah Grunschlag
答案应该包含你需要执行 git fetch --all 或者 git fetch <specific_remote> 而不是仅仅的 git fetch,因为看起来 git fetch 并没有做任何事情:新创建的远程不会被获取,这可以通过 git branch -a -v 查看。 - Nils Lindemann
显示剩余3条评论

49

如果您没有现有的本地分支,那么它真的很简单:

git fetch
git checkout <remote-branch-name>

例如,如果您获取并且有一个名为origin/feature/Main_Page的新的远程跟踪分支,只需执行以下操作:
git checkout feature/Main_Page

这将创建一个与远程分支同名的本地分支,跟踪该远程分支。如果您有多个具有相同分支名称的远程分支,则可以使用以下方法来消除歧义:

git checkout -t <remote>/<remote-branch-name>

如果您已经创建了本地分支,但不想删除它,请参见如何使现有的Git分支跟踪远程分支?

2
git checkout 1.5-branchremotes/upstream/1.5-branchgit branch -a 的输出中)会导致错误:error: pathspec '1.5-branch' did not match any file(s) known to git. 将其更改为 git checkout upstream/1.5-branch 会导致分离 HEAD 并且不会创建本地分支。我认为这部分答案是错误的。这是使用 git 2.4.3 版本。 - Piotr Dobrogost
第一条命令在我的git 1.9.3版本中有效,即使是针对不同的远程库。但这种行为可能已经改变了。你的第二个命令的结果是我所期望的。如果没有使用-t参数,你并没有指定除了查看远程库上特定版本之外的其他操作。 - kotoole
1
我同意@PiotrDobrogost的观点,我认为你的陈述“这将创建一个具有相同名称的本地分支…”是错误的。当以这种方式调用时,fetch 为远程上的每个分支创建一个远程跟踪分支。这意味着在您的本地repo上命名为<remote>/<branch>的分支。远程跟踪分支是只读的,表示该分支在上次获取时在远程的位置。在该分支ref上调用checkout会将您置于分离的HEAD模式中,就像Piotr所说的那样。请注意,指定要获取的远程分支可避免创建不需要的远程跟踪分支。 - scanny
2
再次明确一下:我建议使用命令git checkout feature-branch。我并不建议使用命令git checkout origin/feature-branch,正如你们两个指出的那样,这将导致一个无用的分离头。 - kotoole
非常简单明了。在Cygwin上,使用Git 2.8.3可以正常工作。 - Felipe Alvarez
使用 git branch -r 命令列出所有分支,包括当前仅存在于远程的分支,以确保分支已被获取。然后进行检出操作。 - Teddy

37

首先,您需要获取远程仓库:

git fetch remoteName

你可以创建一个新分支,并将其设置为追踪想要的远程分支:

git checkout -b newLocalBranch remoteName/remoteBranch

你也可以使用 "git branch --track" 代替 max 指定的 "git checkout -b"。

git branch --track newLocalBranch remoteName/remoteBranch

如果您使用远程分支作为起点进行 checkout -b,那么使用 --track 实际上是不必要的。 - user456814
6
同时,正如这条评论中指出的那样,如果您只是运行 git checkout <分支名> 命令,并且在您运行了 git fetch 后存在一个同名的远程分支,则本地分支将自动设置为跟踪远程分支。 - user456814

9
当分支没有远程分支时,您可以直接将本地分支推送到远程分支。
git checkout master
git push origin master

或者当你有一个开发分支时

git checkout dev
git push origin dev

或者当远程分支存在时

git branch dev -t origin/dev

有其他方法可以推送远程分支。

然后您选择第三个选项。当远程分支存在时,您可以创建一个本地分支并跟踪远程分支 :) 这与Max的版本相同,但更短。 - René Höhle

2
以下是步骤:
1. 首先获取克隆后创建的所有分支。
git fetch

现在,检查一下有哪些远程分支。
git branch -r

检查你在日志历史中的位置。
git log --oneline --all --graph

分配一个新的分支来追踪远程分支。
git branch branch_name origin/remote_branch_name

然后,使用步骤3的命令或者git branch来查看你的日志历史。

1

我总是用这种方式:

git fetch

那么:

git checkout -b branchName origin/branchName

0
git checkout master
git pull origin master

git checkout -b new-branch-name

//Set up tracking for the new local branch to the collaborator's remote branch:
git push -u origin new-branch-name

1
这个问题已经有七个现有答案,其中包括一个得到了近三百票的最佳回答。你确定你的解决方案还没有被提出过吗?如果不是,为什么你认为你的方法比已经得到社区验证的现有建议更好?在Stack Overflow上提供解释总是有用的,但在问题已经得到提问者和社区满意解决的情况下,这一点尤为重要。通过解释你的答案与众不同之处以及何时可能更受欢迎,帮助读者更好地理解。 - Jeremy Caney
我的回答提供了一种解决你描述的情况的方法,但是重要的是要承认Git提供了各种处理不同问题的方法,针对特定的场景进行了定制。我的回答并不意味着一个固定的方法,因为Git的灵活性允许采用多种策略来解决不同的问题。 - Ubaid Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接