远程分支
- 远程引用:
-
- 远程引用是远程仓库中分支、标签等的指针,可以通过
git ls-remote
或git remote show
查看。 - 但在日常开发中,更常用远程跟踪分支(如
origin/main
)与远程分支交互,简化了对远程仓库状态的管理和使用。
- 远程引用是远程仓库中分支、标签等的指针,可以通过
- 远程跟踪分支: 它是本地 Git 对远程分支状态的一个记录。它可以帮助我们了解远程分支的最新状态,但它本身是只读的,不能直接操作。
-
- 示例:
-
-
- 假设远程仓库有一个分支
main
: - 你本地的远程跟踪分支是
origin/main
。 - 初次克隆仓库时,
origin/main
和远程的main
同步,指向相同的提交。 - 如果团队中的其他人向远程的
main
分支提交了新的代码,而你没有运行git fetch
或git pull
,你的origin/main
不会自动更新。 - 只有当你运行
git fetch
时,origin/main
才会更新,指向远程main
的最新状态。
- 假设远程仓库有一个分支
-
1. 远程分支实例
- 克隆后的服务器与本地仓库:
-
- 设你的网络里有一个在
git.ourcompany.com
的 Git 服务器。 如果你从这里克隆,Git 的clone
命令会为你自动将其命名为origin
,拉取它的所有数据, 创建一个指向它的master
分支的指针,并且在本地将其命名为origin/master
。 Git 也会给你一个与 origin 的master
分支在指向同一个地方的本地master
分支,这样你就有工作的基础。
- 设你的网络里有一个在
- 本地与远程的工作可以分叉:
-
- 本地的
master
分支做了些工作,同时有其他人推送提交到git.ourcompany.com
并更新了master
分支。即使这样,如果你不向origin
拉取数据,你的origin/master
指针就不会移动。
- 本地的
git fetch
更新你的远程跟踪分支:
-
- 运行
git fetch origin
同步远程仓库数据:查找"origin"是哪个服务器(本例中,是git.ourcompany.com
),从中抓取本地没有的数据,并且更新本地数据库,移动origin/master
指针到更新后的位置。
- 运行
- 添加另一个远程仓库:
-
- 为了展示多个远程服务器及其分支的管理,可以为项目添加一个内部开发服务器(如
git.team1.ourcompany.com
),专用于某个团队。通过 git remote add 命令,将该服务器添加为远程引用,并命名为 teamone,作为简短标识。
- 为了展示多个远程服务器及其分支的管理,可以为项目添加一个内部开发服务器(如
- 远程跟踪分支
teamone/master
:
-
- 运行 git fetch teamone来获取远程服务器
teamone
上你本地尚未拥有的数据。 - 如果该服务器的数据是当前 origin 服务器数据的子集,Git 不会拉取新数据,但会创建一个远程跟踪分支 teamone/master,指向 teamone 的主分支提交点。
- 运行 git fetch teamone来获取远程服务器
2. 推送(push)
- 分享分支------ git push <remote> <branch>
-
- 可以将本地分支推送到具有写权限的远程仓库。
- 推送是显式的,未推送的分支不会同步到远程。这样,你可以保留私人分支,仅共享需要协作的主题分支。
- 示例:
-
-
git push origin serverfix
:将本地分支 serverfix 推送到远程分支 serverfix。- 此命令是refs/heads/serverfix:refs/heads/serverfix 命令的简写。
-
- 重命名远程分支------
git push origin serverfix:awesomebranch
-
- 若需要不同的远程分支名称,例如将本地分支 serverfix 推送为远程分支 awesomebranch:
- 凭据缓存------
git config --global credential.helper cache
-
- 如果使用 HTTPS 推送,Git 会要求输入用户名和密码。为了避免每次都输入,可以设置凭据缓存:
- 获取远程分支------ git fetch****可同步远程分支
-
- 示例:
git fetch origin
会同步 origin/serverfix 指向远程的 serverfix 分支,但不会自动创建本地分支。
- 示例:
- 合并或创建本地分支------ git merge origin/serverfix**/** git checkout -b serverfix origin/serverfix
-
- 合并远程分支内容:
git merge origin/serverfix
。 - 基于远程分支创建可编辑的本地分支:
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
(将更新合并到当前分支)。- 它的作用是将远程分支的变化应用到本地分支上。
- 详细过程:
-
git fetch
:从远程仓库获取最新的提交,并将其存储在本地的远程分支(如origin/master
)。git merge
:将这些远程分支的更新合并到当前分支。
- 推荐用法:
-
- 为了更清晰控制更新过程,建议手动执行以下步骤:
-
-
- 使用
git fetch
仅抓取远程更新,不自动合并。 - 根据需要决定如何合并(例如使用
git merge
或git rebase
)。
- 使用
-
- 示例:
-
-
单独拉取和查看远程分支的变化:
git fetch origin
git log HEAD..origin/master --oneline
-
-
-
合并变化到当前分支:
git merge origin/master
-
-
注意事项:
-
- 如果分支没有设置跟踪关系,
git pull
会提示需要指定远程分支。 - 避免不必要的冲突,尤其是多人协作时,拉取前可以先查看差异。
- 如果分支没有设置跟踪关系,
- 查看差异:
-
- 方法 1:通过
git fetch
和git diff
查看差异
- 方法 1:通过
-
-
- 先执行
git fetch origin
更新远程分支信息 :这只会更新本地的远程跟踪分支(如origin/master
),不会修改当前分支的内容。
- 先执行
-
-
-
- 使用
git diff HEAD origin/<远程分支名>
:查看本地分支与远程分支的差异。
- 使用
-
-
- 方法 2:通过
git log
查看提交历史的差异
- 方法 2:通过
-
-
- 如果只关心新增的提交而不是具体的代码变化,可以使用
git log
查看提交历史: - 查看远程分支的新增提交 :
git log HEAD..origin/<远程分支名> --oneline
- 如果只关心新增的提交而不是具体的代码变化,可以使用
-
-
-
-
HEAD..origin/<远程分支名>
:表示显示当前分支落后于远程分支的提交记录。
-
-
-
-
- 查看本地分支的新增提交(远程分支未同步的部分) :
git log origin/<远程分支名>..HEAD --oneline
- 查看本地分支的新增提交(远程分支未同步的部分) :
-
-
-
-
- 这可以帮助确认本地分支的哪些提交尚未推送到远程分支。
-
-
-
- 方法 3:使用
git status
检查是否同步
- 方法 3:使用
-
-
- 在设置了跟踪关系的分支上,
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 fetch
和git diff
。 - 查看提交记录 :用
git log
。 - 检查同步状态 :用
git status
或git branch -vv
。
- 查看修改内容 :用
-
3.5. 删除远程分支(git push origin --delete <分支名>
)
- 基本原理:
-
- 远程分支实际上是一个指针,指向仓库中某个提交的引用。
- 删除远程分支只是移除这个指针,数据会在 Git 服务器上保留一段时间,直到垃圾回收(Garbage Collection,GC)运行。
- 注意事项:
-
- 本地分支保留:该命令只删除远程分支,本地分支仍然存在。
- 恢复机制:
-
-
- 即使远程分支被删除,其提交记录暂时不会丢失,可以通过
git reflog
找回。 - 删除是逻辑操作,垃圾回收前数据不会立刻消失。
- 即使远程分支被删除,其提交记录暂时不会丢失,可以通过
-
- 检查分支状态:
-
- 使用
git branch -vv
检查本地分支与远程分支的关系,提前确认哪些分支已经同步。
- 使用
3.6. ⭐远程分支总结
- 远程分支概念
-
- 远程分支是远程仓库的状态镜像,保存在本地以
<remote>/<branch>
形式表示,如origin/master
。 - 使用
git fetch
更新本地的远程分支状态,但不会修改工作区。
- 远程分支是远程仓库的状态镜像,保存在本地以
- 查看远程分支
-
git ls-remote <remote>
:查看远程仓库的所有引用。git remote show <remote>
:查看远程分支详细信息。
- 推送与拉取
-
- 推送 :
git push <remote> <branch>
将本地分支推送到远程分支。 - 拉取 :
git pull
等效于git fetch
+git merge
。 - 建议显式执行
git fetch
和git merge
以避免git pull
的混淆。
- 推送 :
- 创建跟踪分支
-
git checkout -b <local-branch> <remote>/<branch>
:从远程分支创建本地分支并建立跟踪关系。git branch -u <remote>/<branch>
:为已有本地分支设置上游分支。
- 查看分支状态
-
git branch -vv
:查看本地分支与远程分支的跟踪关系及领先/落后状态。
- 删除远程分支
-
git push <remote> --delete <branch>
:从远程仓库删除分支。
最佳实践
- 多用 fetch****少用 pull:确保操作的可控性。
- 定期检查跟踪状态 :通过
git fetch
和git branch -vv
保持分支状态最新。 - 推送前检查:确认要推送的内容与远程分支一致,避免冲突。