图解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 保持分支状态最新。
  • 推送前检查:确认要推送的内容与远程分支一致,避免冲突。

相关推荐
小桑要读研3 分钟前
二级缓存(缓存到Redis)
java·开发语言·spring
晴子呀16 分钟前
单例模式的几种实现方式
java·开发语言
脸红ฅฅ*的思春期24 分钟前
JAVA安全—JWT攻防&Swagger自动化&Druid泄露
java·安全·自动化·jwt
时雨h35 分钟前
[Java Web] 第四章 XML_Tomcat10_HTTP
java
winner888143 分钟前
Java & Python:从简单案例理解 HTTP 服务开发与调用!
java·python·http·http服务
豆约翰1 小时前
JavaSwing游戏开发之Camera原理
java·game
ktkiko111 小时前
Netty中的NioEventloop(1)
java·开发语言·netty·高并发学习
SamRol1 小时前
SpringBoot入门实现简单增删改查
spring boot·后端·oracle
java1234_小锋1 小时前
讲一下ZooKeeper的持久化机制?
java·zookeeper·java-zookeeper
毋若成1 小时前
【搭建JavaEE】(1)maven仓库安装配置
java·java-ee·maven