从主分支切换到一个新的默认分支 git

60

以下是一个场景:

我们有一个默认分支Master,我们从这里开始工作,创建分支并推送等等...

现在我们从Master创建了一个Develop分支,并将其设置为默认开发分支。

我想知道的是,如何通过命令行知道我的git pull命令是否正在请求来自默认分支的更改?或者指向这个新的默认分支?

我所做的: - 自从创建了一个新的默认分支后,从origin/master git pull 到我的master分支

另外,任何新的分支,是从Master还是Develop创建的?

正如你所看到的

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
PS C:\Users\dir\Documents\GitHub\repo> git log
commit 867cxx

fd956f73dc91d0022b (HEAD -> master, origin/master, origin/develop, origin/HEAD)

更新:在克隆存储库后更改了默认分支。

Translated text:

更新:在克隆存储库后更改了默认分支。


目前我们的默认分支是Master,我们有一个新的默认分支,我该如何指向这个默认分支?这样我就可以从它开始工作了。如果我运行git status,它仍然显示我在master(本地)上。 - Harry
只需运行 git checkout <name-of-new-branch> - Rafael
我明白了 - 所以我不需要做任何特定的更改,只需指向这个分支,随后的拉取命令将从这个默认分支获取最新的更改? - Harry
如果您使用的是Git 1.8.5+,那么当您克隆存储库时,默认分支也将被返回(即HEAD指向的分支),如果更改发生在您克隆存储库之后,我认为您需要手动执行此操作。 - Rafael
是的,我是。而且这个变化发生在克隆存储库之后,这些手动步骤是什么?正如我预测的那样,我必须做出某种形式的更改,但这个更改是什么? - Harry
显示剩余3条评论
4个回答

76

git 2.28版本中,您可以使用以下命令设置全局配置:git config --global init.defaultBranch {branchName}

{branchName}替换为默认分支名称,现在每当您创建一个新的git仓库时,默认分支就是这个。

有关更多详细信息,请参见我的视频:https://www.youtube.com/watch?v=YccHk6QlRss


我在执行 git init(使用版本 2.32.0)后看到了这个提示。 - jsejcksn
这是一篇关于它的博客文章:https://github.blog/2020-07-27-highlights-from-git-2-28/ - General Grievance
1
此答案涉及到 git init 命令的行为,不是本问题的主题。以下是您要查找的问题示例:更改 git init 默认分支名称 - Brent Bradburn

56

从GitHub克隆存储库时,默认分支会存储在HEAD文件中:

$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master

如果在克隆存储库之后在GitHub上更改了默认分支,这不会自动更新,但可以在本地轻松解决:

git remote set-head origin -a
< p > -a将根据远程设置refs/remotes/<name>/HEAD

或显式地设置为命名分支:

git remote set-head origin develop

现在,HEAD指向新位置:

$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/develop

37
据我所知,Git没有“默认分支”的概念。例如GitHub之类的用户界面具有默认分支,这意味着当您打开网页时,默认情况下会看到某个分支(通常是主分支)。但是就Git而言,主分支并不特殊,它只是给第一个分支命名的名称。
要创建新分支,请使用checkout命令和-b标志,如下所示:
git checkout -b develop
git branch命令将列出所有现有的分支,并在当前分支旁边标记一个*。您所做的任何提交都将添加到当前分支中。
在您的问题中,您提到了从远程拉取的问题。相关的概念是“跟踪分支”;请参见https://git-scm.com/book/id/v2/Git-Branching-Remote-Branches中带有该名称的部分。
简而言之,当您执行以下操作时:
git pull origin master

它会从origin仓库的master分支中检索更改,合并到当前检出的任何分支中。如果需要的话,您可以设置远程跟踪,这样Git就已经知道您想要从哪个分支提取更改,基于您当前检出的分支。

例如,如果您有一个远程的develop-remote分支和一个本地的develop-local分支,您可以通过以下方式设置本地分支来跟踪远程分支:

git checkout develop-local
git branch --set-upstream-to origin/develop-remote

此外,它们可能都被简称为develop,但我在这里进行了区分以便更清楚。

最后,需要提到的是,当您执行git pull <url-of-repo>时,远程跟踪会自动建立。

附注:有关远程(例如,origin表示什么)的更多信息,请参见https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes


谢谢,+1 这是一个很好的答案。我了解你提到的一些概念,困惑来自于“移动”到一个新的默认分支。现在我没有改变任何东西,创建了一个新的分支,它默认出现在 origin/develop 下。尽管如此,这是一个很好的答案! - Harry
14
Git有一个默认分支的概念,这不仅仅是界面显示的问题。它是在你用git clone克隆存储库时获取的分支(除非使用--branch参数另行指定)。这个分支来自HEAD符号参考。 - Anders Kaseorg
@AndersKaseorg - HEAD 指当前检出的分支,对吗?每当您检出一个新分支时,它都会更改。 - Oliver Evans
4
就像你有一个本地分支 refs/heads/foo、本地仓库中的远程跟踪分支 refs/remotes/origin/foo 和远程仓库中的分支 refs/heads/foo 一样,你也有一个本地的 HEAD(是指当前检出的分支),在本地仓库中有一个远程跟踪的 refs/remotes/origin/HEAD,以及远程仓库中的 HEAD。本地的 HEADrefs/remotes/origin/HEAD 是在 git clone 命令时从远程仓库的 HEAD 初始化的;refs/remotes/origin/HEAD 在执行 git remote set-head -a 命令时会从远程的 HEAD 更新。 - Anders Kaseorg
1
从git 2.8开始,情况已经不再如此,您可以设置默认分支 https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup - thefern
6
不,这不是真的。当您初始化一个新仓库时, git config --global init.defaultBranch main 将把第一个创建的分支命名为 mainProGit 指出:“master”分支在Git中不是特殊的分支,它与任何其他分支完全相同。几乎每个仓库都有“master”分支的唯一原因是,git init命令默认创建它,而大多数人不会费心去更改它。 - Prihex

3
  1. 在GitHub上,导航到代码库的主页面。

  2. 在您的代码库名称下面,点击⚙️设置。

  3. 在左侧菜单中,点击分支。

  4. 在“默认分支”下,单击默认分支名称右侧的按钮。

  5. 使用下拉菜单,然后单击一个分支名称。

  6. 使用下拉菜单,然后单击一个分支名称。 简单


8
问题是关于 Git 而不是 GitHub,两者是不同的东西。 - Rajan

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