图解Git——远程分支《Pro Git》

远程分支

  • 远程引用:
    • 远程引用是远程仓库中分支、标签等的指针,可以通过 git ls-remotegit remote show 查看。
    • 但在日常开发中,更常用远程跟踪分支(如 origin/main)与远程分支交互,简化了对远程仓库状态的管理和使用。
  • 远程跟踪分支: 它是本地 Git 对远程分支状态的一个记录。它可以帮助我们了解远程分支的最新状态,但它本身是只读的,不能直接操作。
    • 示例:
      • 假设远程仓库有一个分支 main
      • 你本地的远程跟踪分支是 origin/main
      • 初次克隆仓库时,origin/main 和远程的 main 同步,指向相同的提交。
      • 如果团队中的其他人向远程的 main 分支提交了新的代码,而你没有运行 git fetchgit pull,你的 origin/main 不会自动更新。
      • 只有当你运行 git fetch 时,origin/main 才会更新,指向远程 main 的最新状态。

1. 远程分支实例

  1. 克隆后的服务器与本地仓库:
    1. 设你的网络里有一个在 git.ourcompany.com 的 Git 服务器。 如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据, 创建一个指向它的 master 分支的指针,并且在本地将其命名为 origin/master。 Git 也会给你一个与 origin 的 master 分支在指向同一个地方的本地 master 分支,这样你就有工作的基础。
  1. 本地与远程的工作可以分叉:
    1. 本地的 master分支做了些工作,同时有其他人推送提交到 git.ourcompany.com并更新了 master分支。即使这样,如果你不向 origin拉取数据,你的 origin/master 指针就不会移动。
  1. git fetch 更新你的远程跟踪分支:
    1. 运行 git fetch origin 同步远程仓库数据:查找"origin"是哪个服务器(本例中,是 git.ourcompany.com),从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指针到更新后的位置。
  1. 添加另一个远程仓库:
    1. 为了展示多个远程服务器及其分支的管理,可以为项目添加一个内部开发服务器(如 git.team1.ourcompany.com),专用于某个团队。通过 git remote add 命令,将该服务器添加为远程引用,并命名为 teamone,作为简短标识。
  1. 远程跟踪分支 teamone/master
    1. 运行 git fetch teamone来获取远程服务器 teamone 上你本地尚未拥有的数据。
    2. 如果该服务器的数据是当前 origin 服务器数据的子集,Git 不会拉取新数据,但会创建一个远程跟踪分支 teamone/master,指向 teamone 的主分支提交点。

2. 推送(push)

  1. 分享分支------ git push <remote> <branch>
    1. 可以将本地分支推送到具有写权限的远程仓库。
    2. 推送是显式的,未推送的分支不会同步到远程。这样,你可以保留私人分支,仅共享需要协作的主题分支。
    3. 示例:
      1. git push origin serverfix:将本地分支 serverfix 推送到远程分支 serverfix
      2. 此命令是refs/heads/serverfix:refs/heads/serverfix 命令的简写。
  1. 重命名远程分支------ git push origin serverfix:awesomebranch
    1. 若需要不同的远程分支名称,例如将本地分支 serverfix 推送为远程分支 awesomebranch
  1. 凭据缓存------ git config --global credential.helper cache
    1. 如果使用 HTTPS 推送,Git 会要求输入用户名和密码。为了避免每次都输入,可以设置凭据缓存:
  1. 获取远程分支------ git fetch****可同步远程分支
    1. 示例:git fetch origin 会同步 origin/serverfix 指向远程的 serverfix 分支,但不会自动创建本地分支。
  1. 合并或创建本地分支------ git merge origin/serverfix**/** git checkout -b serverfix origin/serverfix
    1. 合并远程分支内容: git merge origin/serverfix
    2. 基于远程分支创建可编辑的本地分支: git checkout -b serverfix origin/serverfix创建本地分支 serverfix 并设置与 origin/serverfix 的追踪关系。

3. 跟踪分支

3.1. 跟踪分支的概念

  • 跟踪分支 是与远程分支有直接关系的本地分支。
  • 当你运行 git pull 时,Git 自动识别:
    • 从哪个远程仓库获取数据。
    • 合并到哪个本地分支。

3.2. 跟踪分支的创建

  • 自动创建:
    • 当克隆一个仓库时,master 分支默认会跟踪 origin/master
  • 手动创建:
    • 命令:git checkout -b <本地分支> <远程分支>
    • 简化命令:git checkout --track <远程分支>
    • 再次简化(如果名字唯一匹配):git checkout <远程分支>
  • 重命名本地分支:
    • 命令:git checkout -b <新分支名> <远程分支>

3.3. 管理跟踪分支

  • 设置已有本地分支的跟踪:
    • 命令:git branch -u <远程分支>
  • 检查所有跟踪分支信息:
    • 命令:git branch -vv
    • 包含分支的跟踪状态(领先、落后)。

3.4. 拉取(pull)

  • 基本原理
    • git pull 是一个复合命令,等效于 git fetch(从远程获取最新更新)+ git merge(将更新合并到当前分支)。
    • 它的作用是将远程分支的变化应用到本地分支上。
  • 详细过程
    1. git fetch:从远程仓库获取最新的提交,并将其存储在本地的远程分支(如 origin/master)。
    2. git merge:将这些远程分支的更新合并到当前分支。
  • 推荐用法
    • 为了更清晰控制更新过程,建议手动执行以下步骤:
      1. 使用 git fetch 仅抓取远程更新,不自动合并。
      2. 根据需要决定如何合并(例如使用 git mergegit rebase)。
  • 示例
    • 单独拉取和查看远程分支的变化:

      git fetch origin
      git log HEAD..origin/master --oneline

    • 合并变化到当前分支:

      git merge origin/master

  • 注意事项

    • 如果分支没有设置跟踪关系,git pull 会提示需要指定远程分支。
    • 避免不必要的冲突,尤其是多人协作时,拉取前可以先查看差异。
  • 查看差异:
    • 方法 1:通过 git fetchgit diff 查看差异
      • 先执行 git fetch origin更新远程分支信息 :这只会更新本地的远程跟踪分支(如 origin/master),不会修改当前分支的内容。
      • 使用 git diff HEAD origin/<远程分支名>:查看本地分支与远程分支的差异
    • 方法 2:通过 git log 查看提交历史的差异
      • 如果只关心新增的提交而不是具体的代码变化,可以使用 git log 查看提交历史:
      • 查看远程分支的新增提交git log HEAD..origin/<远程分支名> --oneline
        • HEAD..origin/<远程分支名>:表示显示当前分支落后于远程分支的提交记录。
      • 查看本地分支的新增提交(远程分支未同步的部分)git log origin/<远程分支名>..HEAD --oneline
        • 这可以帮助确认本地分支的哪些提交尚未推送到远程分支。
    • 方法 3:使用 git status 检查是否同步
      • 在设置了跟踪关系的分支上,git status 会显示当前分支与远程分支的同步情况。
    • 方法 4:检查所有分支的同步状态
      • 使用 git branch -vv 查看所有本地分支的状态:
      • 输出示例:

        master abc1234 [origin/master: ahead 2, behind 3] New feature added
        dev def5678 [origin/dev: behind 1] Bug fixes

      • ahead:本地分支比远程分支多的提交数。
      • behind:本地分支比远程分支少的提交数。
    • 总结
      • 查看修改内容 :用 git fetchgit diff
      • 查看提交记录 :用 git log
      • 检查同步状态 :用 git statusgit branch -vv

3.5. 删除远程分支(git push origin --delete <分支名>

  • 基本原理
    • 远程分支实际上是一个指针,指向仓库中某个提交的引用。
    • 删除远程分支只是移除这个指针,数据会在 Git 服务器上保留一段时间,直到垃圾回收(Garbage Collection,GC)运行。
  • 注意事项
    1. 本地分支保留:该命令只删除远程分支,本地分支仍然存在。
    2. 恢复机制
      • 即使远程分支被删除,其提交记录暂时不会丢失,可以通过 git reflog 找回。
      • 删除是逻辑操作,垃圾回收前数据不会立刻消失。
  • 检查分支状态
    • 使用 git branch -vv 检查本地分支与远程分支的关系,提前确认哪些分支已经同步。

3.6. ⭐远程分支总结

  1. 远程分支概念
    • 远程分支是远程仓库的状态镜像,保存在本地以 <remote>/<branch> 形式表示,如 origin/master
    • 使用 git fetch 更新本地的远程分支状态,但不会修改工作区。
  1. 查看远程分支
    • git ls-remote <remote>:查看远程仓库的所有引用。
    • git remote show <remote>:查看远程分支详细信息。
  1. 推送与拉取
    • 推送git push <remote> <branch> 将本地分支推送到远程分支。
    • 拉取git pull 等效于 git fetch + git merge
    • 建议显式执行 git fetchgit merge 以避免 git pull 的混淆。
  1. 创建跟踪分支
    • git checkout -b <local-branch> <remote>/<branch>:从远程分支创建本地分支并建立跟踪关系。
    • git branch -u <remote>/<branch>:为已有本地分支设置上游分支。
  1. 查看分支状态
    • git branch -vv:查看本地分支与远程分支的跟踪关系及领先/落后状态。
  1. 删除远程分支
    • git push <remote> --delete <branch>:从远程仓库删除分支。

最佳实践

  • 多用 fetch****少用 pull:确保操作的可控性。
  • 定期检查跟踪状态 :通过 git fetchgit branch -vv 保持分支状态最新。
  • 推送前检查:确认要推送的内容与远程分支一致,避免冲突。

相关推荐
CS Beginner12 分钟前
【搭建】个人博客网站的搭建
java·前端·学习·servlet·log4j·mybatis
JavaTree20171 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·后端
lang201509281 小时前
Maven 五分钟入门
java·maven
cj6341181501 小时前
SpringBoot配置Redis
java·后端
用坏多个鼠标1 小时前
Nacos和Nginx集群,项目启动失败问题
java·开发语言
TangKenny2 小时前
基于EasyExcel的动态列映射读取方案
java·easyexcel
安冬的码畜日常2 小时前
【JUnit实战3_19】第十章:用 Maven 3 运行 JUnit 测试(下)
java·测试工具·junit·单元测试·maven·junit5
lemon_sjdk2 小时前
软件开发模式架构选择
java·架构·软件开发·前后端分离
董广明2 小时前
单元测试(JUnit、Mockito、PowerMock )
java·经验分享·junit·单元测试
Lisonseekpan2 小时前
Java Stream 流式编程
java·后端