Git分支

本文详细介绍了Git中分支、HEAD指针及远程分支的概念。解释了如何通过Git命令创建、同步和合并分支,以及如何处理合并冲突。同时,还探讨了远程分支与本地分支之间的跟踪关系。

1. Git的分支

  Git的分支,其实本质上仅仅是指向提交对象的可变指针。它会在每次的提交操作中自动向前移动。

由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。创建一个新分支就像是往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗?

2. HEAD指针

  Git 是怎么知道当前在哪一个分支上呢?很简单,它有一个名为 HEAD 的特殊指针。请注意它和许多其它版本控制系统(如 Subversion 或 CVS)里的 HEAD 概念完全不同。在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。

  查看各个分支当前所指的对象

$ git log --oneline --decorate

  如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令。
  如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged
  查看所有包含未合并工作的分支,可以运行 git branch --no-merged

3. 远程分支

3.1 远程引用(Remote references)

  远程引用(Remote references)指的是在远程仓库中的引用(指针),包括分支、标签等。可以通过git ls-remote [remote]git remote show [remote]命令查看远程引用。
  然而,更常用的方式是利用远程跟踪分支。

3.2 远程跟踪分支(Remote-tracking branches)

  远程跟踪分支(Remote-tracking branches)是对远程分支状态的引用
  它们存储在本地,不能移动。只有在本地仓库与远程仓库进行网络通信时,由Git自动移动它们。远程跟踪分支像是你上次连接到远程仓库时,那些分支所处状态的书签
  它们以(remote)/(branch)形式命名。

3.3 跟踪分支(Tracking Branches)

从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 跟踪分支(有时候也叫做“上游分支”)。跟踪分支是与远程分支有直接关系的本地分支。如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。

3.3.1 检出跟踪分支
$ git checkout --track origin/branchname
# 等价于
$ git checkout -b branchname origin/branchname 
3.3.2 显式设置跟踪远程分支
$ git branch --set-upstream-to origin/branchname
# 等价于
$ git branch -u origin/branchname
3.3.3 查看设置的所有跟踪分支
$ git branch -vv

需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。这个命令并没有连接服务器,它只会告诉你关于本地缓存的服务器数据。如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。可以像这样做:

$ git fetch --all
$ git branch -vv

4 同步变化

4.1 git pushgit pull

  语法:

$ git push <远程主机名> <本地分支名>:<远程分支名>

  分支推送顺序的写法是<来源地>:<目的地>, 所以,

  • git pull是<远程分支>:<本地分支>,
  • git push是<本地分支>:<远程分支>。

  当本地分支是跟踪分支时,命令即可省略为 git pushgit pull

4.2 新建分支

  • 新建远程分支
$ git push -u origin newBranch:newBranch     // 新建远程分支

  如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
  如git push origin master省略了远程分支,其中 origin 是远程主机名,master是本地分支,所以,命令表示,将本地的master分支推送到远程主机的master分支。意思也为:“取出我在本地的master分支,推送到远程仓库的master分支中去”。因此它与运行git push origin master:master是一样的效果。

  • 新建本地分支
$ git branch newBranch   //新建本地分支newBranch
$ git checkout -b newBranch   //新建并切换到本地分支newBranch

4.3 删除分支

  • 删除远程分支
$ git push origin :remoteb1

  git push命令如果省略本地分支名,将删除远程分支。如git push origin :remoteb1将删除远程remoteb1这个分支。

  • 删除本地分支
$ git branch -d 本地分支名

5. 分支的合并(get merge

  语法:git merge [要合并进来的分支名]
  如当前所在分支是release,则执行以下

$ git merge b1

  表示,将分支b1合并到当前分支release

5.1 快进(fast-forward)

  当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

5.2 “三方合并”生成一个合并提交

  在这种情况下,你的开发历史从一个更早的地方开始分叉开来(diverged)。因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并
  和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。
  需要指出的是,Git 会自行决定选取哪一个提交作为最优的共同祖先,并以此作为合并的基础。

  项目分叉历史

$ git log --oneline --decorate --graph --all

5.3 冲突

  修改都涉及到同一个文件的同一处,在合并它们的时候就会产生合并冲突。此时 Git 做了合并,但是没有自动地创建一个新的合并提交。Git 会暂停下来,等待你去解决合并产生的冲突。你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。

  使用图形化工具来解决冲突,你可以运行 git mergetool,该命令会为你启动一个合适的可视化合并工具,并带领你一步一步解决这些冲突:

$ git mergetool
<think>好的,我现在需要处理用户关于Git分支管理的查询。首先,用户提到了几个引用内容,我需要仔细看一下这些引用来确保回答准确。 首先,引用[1]提到master分支并不是特殊分支,只是因为git init默认创建,很多人懒得改。这说明在回答时需要强调master分支的普通性,可能还要提到如何修改默认分支名称。 引用[2]讨论了删除分支的情况,特别是使用git branch -D强制删除。这里需要注意区分-D和-d的区别,用户可能在这里有疑问,比如什么时候需要强制删除。 引用[3]展示了用git log带参数查看分支合并历史,比如--graph和--abbrev-commit。这部分应该在教程中介绍如何可视化分支结构,帮助用户理解合并情况。 接下来,用户需要Git分支管理教程,所以需要结构清晰,分步骤讲解。根据系统指令,要使用中文,正确使用LaTeX格式的数学表达式,不过这里可能用不上数学公式,但需要注意行内代码用$...$吗?不过根据示例,代码块是用```包裹的,可能数学表达式才用$,代码部分不需要。但用户的问题是关于Git的,可能涉及命令示例,需要正确展示代码块。 系统级指令要求生成相关问题,所以最后需要列出相关问题。回答中引用的部分要添加引用标识,例如在提到默认分支时加上[^1],删除分支时引用[^2],查看合并历史引用[^3]。 现在开始组织教程的结构: 1. 分支创建与切换:使用git branch和git checkout或git switch,引用相关命令。 2. 分支合并:merge和rebase的区别,如何解决冲突。 3. 分支删除:git branch -d和-D的区别,引用[2]的例子。 4. 查看分支历史:git log参数,如--graph,引用[3]。 5. 远程分支管理:推送、拉取、跟踪远程分支。 6. 默认分支设置:提到引用[1],说明master的普通性及如何修改默认分支。 需要确保每个部分都简明,命令示例正确,并适当加入引用标注。最后生成相关问题,比如分支合并策略、解决冲突的方法、重命名默认分支等。 现在检查是否有遗漏,比如分支管理的最佳实践、rebase的风险,或者如何查看远程分支状态。可能需要简要提及,但保持教程基础,不过于深入。 确认引用正确,每个引用只出现在相关部分末尾,自然地添加标识。例如,在讨论默认分支时引用[^1],删除分支引用,查看历史引用。 最后,确保使用中文,代码块用正确语法,例如: ```bash git branch new-feature ``` 这样用户能清楚看到命令格式。避免使用任何Markdown格式错误,比如正确使用三个反引号和语言标识。同时,生成的相关问题要围绕分支管理的常见疑问,比如创建、合并、删除、冲突解决等。</think>### Git 分支管理教程 #### 1. 分支创建与切换 - **创建分支**:使用 `git branch <分支名>` 命令,例如: ```bash git branch new-feature ``` - **切换分支**:使用 `git checkout <分支名>` 或更直观的 `git switch <分支名>`: ```bash git switch new-feature ``` #### 2. 分支合并 - **合并分支**:通过 `git merge` 将目标分支合并到当前分支。例如,将 `new-feature` 合并到 `master`: ```bash git switch master git merge new-feature ``` 若合并时发生冲突,需手动解决后提交。 - **变基(Rebase)**:另一种整合分支的方式是 `git rebase`,它会将当前分支的提交“移植”到目标分支顶端,使历史更线性: ```bash git switch new-feature git rebase master ``` #### 3. 分支删除 - **安全删除**:若分支已合并到其他分支,可用 `git branch -d <分支名>` 删除: ```bash git branch -d new-feature ``` - **强制删除未合并分支**:若分支未合并但需删除,使用 `-D` 参数[^2]: ```bash git branch -D experimental ``` #### 4. 查看分支历史 使用 `git log` 参数可视化分支合并情况: ```bash git log --graph --pretty=oneline --abbrev-commit ``` 此命令会显示分支拓扑结构和简化的提交哈希值。 #### 5. 远程分支管理 - **推送分支到远程仓库**: ```bash git push origin new-feature ``` - **拉取远程分支**: ```bash git fetch origin git switch -c local-feature origin/new-feature ``` #### 6. 默认分支设置 Git 的默认分支(如 `master` 或 `main`)并无特殊性,仅因 `git init` 默认创建[^1]。可通过以下步骤修改默认分支: 1. 创建并切换到新分支: ```bash git switch -c main ``` 2. 推送并更新远程仓库: ```bash git push -u origin main git branch -d master ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值