Chapter 05
远程协作
掌握远程仓库操作、推送拉取策略、以及多人协作中的常见场景与解决方案。
远程仓库基础
git remote add 是什么?怎么添加远程仓库?
git remote add 用于将本地仓库与远程仓库建立关联。origin 是远程仓库的默认别名。 git remote add origin https://github.com/user/repo.git添加后可以用
git remote -v 查看所有远程仓库的 URL。 git fetch 和 git pull 有什么区别?
git fetch 只从远程下载最新的提交和引用,但不会修改你的工作目录或当前分支。它是"安全"的——你可以先查看远程变化再决定怎么合并。git pull 等价于 git fetch + git merge,它会下载远程更新并自动尝试合并到你当前分支。如果不注意,可能产生意料之外的合并冲突。 # 只看不动 git fetch origin # 拉取并合并 git pull origin main
git pull 的两种策略是什么?
merge 策略(默认):拉取远程更新后创建一个 merge commit,保留完整的分支历史。历史可能看起来比较"杂乱"。
# 默认行为 = fetch + merge git pull origin mainrebase 策略:把你的本地提交"重新放"到远程提交之上,产生线性历史,更干净。
# 推荐:线性历史 git pull --rebase origin main团队协作中,建议优先使用
--rebase 保持历史整洁。 git push 怎么用?
git push 将本地提交推送到远程仓库。 # 推送到远程 main 分支 git push origin main # 推送并设置上游追踪(首次推送推荐) git push -u origin main # 之后再推送只需 git push
-u(--set-upstream)会建立本地分支与远程分支的追踪关系,之后直接 git push/git pull 即可,无需再指定远程名和分支名。 什么是上游分支(tracking branch)?
上游分支是本地分支与远程分支之间的关联。设置后,Git 知道
git pull 从哪里拉、git push 推到哪里。 # 推送时同时设置上游 git push -u origin main # 单独设置上游 git branch --set-upstream-to=origin/main main # 查看所有追踪关系 git branch -vv
如何拉取别人的远程分支?
先 fetch 下载所有远程分支信息,然后直接 switch 即可。Git 会自动建立追踪关系。
# 下载远程更新 git fetch origin # 自动切换到远程分支并追踪 git switch feature-login也可以手动创建并追踪:
git checkout -b feature-login origin/feature-login
如何删除远程分支?
使用
--delete 参数推送一个"空"来删除远程分支。 git push origin --delete feature-login删除后,其他人
git fetch --prune 可以清理本地过时的远程追踪引用。 欢迎使用远程仓库操作模拟器!
按照步骤提示,练习添加远程仓库、推送和拉取操作。
$
协作场景
推送被拒绝(rejected)怎么办?
当你
git push 时被拒绝,说明远程分支有你本地没有的新提交——通常是因为别人先推了代码。 ! [rejected] main -> main (fetch first)解决方法:先拉取远程更新再推送。
# 方法1:merge(产生merge commit) git pull origin main git push origin main # 方法2:rebase(推荐,保持线性历史) git pull --rebase origin main git push origin main
force push 是什么?什么时候用?
git push --force 会用你的本地历史覆盖远程历史,即使远程有更新的提交。 git push --force origin main极度危险:会丢失别人的提交。只在自己的私有分支或明确知道后果时使用。
# 更安全的替代:只在你确认远程没被别人改过时才覆盖 git push --force-with-lease origin main
警告:慎用 force push
git push --force 会永久覆盖远程分支上的提交历史。如果团队中有其他人的提交在你 force push 之前还没被合并,这些提交将丢失。安全原则:
• 绝不在共享分支(main/develop)上 force push
• 优先使用
--force-with-lease,它会在远程被他人更新时拒绝推送• 只有在自己的 feature 分支上且清楚后果时才使用
Fork 和 Clone 有什么区别?
Clone:将远程仓库复制到本地电脑。你拥有本地副本,但没有推送到原仓库的权限(除非你是协作者)。
典型流程:Fork → Clone 你自己的 Fork → 修改 → 创建 Pull Request 回原仓库。
git clone https://github.com/someone/repo.gitFork:在 GitHub 上将别人的仓库完整复制到你自己的账户下。你对自己 Fork 的仓库有完全权限,可以推送修改。
典型流程:Fork → Clone 你自己的 Fork → 修改 → 创建 Pull Request 回原仓库。
Fork 工作流中如何同步上游仓库?
Fork 之后,原仓库(upstream)会继续更新。你需要手动同步这些更新到你的 Fork。
# 1. 添加上游仓库(只需一次) git remote add upstream https://github.com/original/repo.git # 2. 获取上游最新内容 git fetch upstream # 3. 合并到你的本地分支 git merge upstream/main # 4. 推送到你自己的 Fork git push origin main也可以用 rebase 保持线性历史:
git rebase upstream/main
模拟推送被拒绝的完整解决流程。
当其他人先推送了提交时,你的 push 会被拒绝。
按步骤体验:推送 → 被拒 → pull rebase → 再次推送。
$
