学习前提

理解本地提交与分支;远程实验只用本地目录。

使用Git 2.35+与Bash兼容终端(Windows可用Git Bash)。每章完整代码都会创建独立临时目录;仅在练习仓库运行。git config仅修改该仓库,示例身份不是你的真实提交身份。临时目录不会自动删除,可在完成后自行清理。

本课完成后你能做什么

通过两个本地副本模拟远程同步,理解上游分支。

先理解机制

remote是远程地址的命名配置,origin只是常见名称。远程跟踪引用origin/main记录上次获知的远程位置,不会随着服务器变化自动更新。fetch更新远程信息,但不会直接把改动合入当前分支。

push传送提交并请求更新远程引用;-u建立本地分支与上游的关联。pull通常组合抓取和整合,具体整合策略应明确。本例用fetch再merge --ff-only把观察与整合分开。

练习用本地裸仓库扮演服务器,无账号、网络或真实发布。实际连接GitHub等服务时使用SSH或HTTPS认证,不把令牌写入远程URL或提交文件。GitHub的PR是托管平台评审流程,不是Git本身的命令。

可运行示例

lab=$(mktemp -d)
cd "$lab"
git init -b main .
git config user.name "Honeysuck Learner"
git config user.email 'learner'@'example.invalid'
git config commit.gpgsign false
git config core.autocrlf false
printf 'Start learning\n' > notes.txt
git add notes.txt
git commit -m "Start learning notes"
git init --bare -b main "$lab/remote.git"
git remote add origin "$lab/remote.git"
git push -u origin main
git clone "$lab/remote.git" "$lab/teammate"
git -C "$lab/teammate" config user.name "Practice Teammate"
git -C "$lab/teammate" config user.email 'teammate'@'example.invalid'
git -C "$lab/teammate" config commit.gpgsign false
printf 'Team review\n' >> "$lab/teammate/notes.txt"
git -C "$lab/teammate" add notes.txt
git -C "$lab/teammate" commit -m "Add team review"
git -C "$lab/teammate" push origin main
git fetch origin
git log --oneline HEAD..origin/main
git merge --ff-only origin/main
cat notes.txt

推演与验证

fetch后本地main尚未移动,HEAD..origin/main可看到Add team review;快进合并后notes.txt包含Team review。两个副本与裸仓库都留在本课临时目录中。

常见错误与边界

推送被拒绝常表示远端有你尚未整合的提交,也可能是权限或分支保护问题。应先检查原因,不能把强制推送当作通用修复。

动手练习

在原副本追加一条笔记、提交并推送,再让teammate抓取和快进。

参考解法与理由

按相反方向重复fetch与merge --ff-only。两边git rev-parse HEAD应相同;如果形成分叉,--ff-only会拒绝,需要先明确整合策略。

进一步阅读