远程仓库:推送与拉取 · Git 与 GitHub
怎么和团队共享提交?
课程目录为什么需要它
你的仓库在你自己的电脑上;团队的那份在 GitHub 这样的服务器上。你把自己的提交推送上去,把队友的提交拉取下来。每天「在团队里用 Git」,大部分就是把这个节奏做对。
直觉理解
远程仓库是另一份副本的地址,起了个名字,通常叫 origin。
git push:把你的新提交发到 origin。git pull:从 origin 取回新提交,合并进你的分支。origin/main是你本地记下的「上次查看时服务器上 main 在哪」。
如果队友先推送了,你的推送会被拒绝:服务器上有你没有的提交。先 pull,解决冲突(如果有),再 push。在共享分支上,绝对不要强行推过去。
定义
远程仓库 Remote
Another copy of the repository, reached by a URL and a short name such as origin.仓库的另一份副本,通过一个网址和一个短名字(比如 origin)访问。
推送与拉取
push uploads your commits; pull downloads others' commits and merges them.push 上传你的提交;pull 下载别人的提交并合并。
示例
推送你的工作
在互动课里运行先在本地提交,再推送。推送之前,别人都看不到。
echo "def pay(): pass" > pay.py
git add pay.py
git commit -m "add payment"
git status
git push
git status逐步执行
- L4你的分支比 origin/main 多 1 个提交。
- L5上传。
- L6现在和 origin/main 一致了。
被拒绝、拉取、再推送
在互动课里运行你干活的时候,队友先推送了。先拉取他们的提交,再推送。
echo "def pay(): pass" > pay.py
git add pay.py
git commit -m "add payment"
git pull
git push
git log --oneline逐步执行
- L3如果现在推送,会被拒绝:服务器上有你没有的提交。
- L4取回并合并队友的提交。改的是不同文件,所以没有冲突。
- L5现在推送成功了。
- L6你的提交、他们的提交,以及把两者连起来的合并提交。
常见错误
在共享分支上 git push --force
强制推送会用你的历史替换服务器上的历史,悄悄删掉队友的提交。应该先 pull。
把密钥推上去
密码一旦推送,就当它已经公开了,哪怕下一次提交删掉了也一样:历史里还留着。立刻换密码,并使用 .gitignore(下一课)。
小测验
1. `git push` 被拒绝,因为远程有你没有的提交。怎么办?
查看答案
答案:B
先把他们的提交拉进来合并,再推送。--force 会删掉他们的工作。
2. `origin/main` 是什么?
查看答案
答案:A
它只在 fetch、pull 或 push 时更新,所以可能是过时的。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出领先还是落后?
执行完这些命令后,git status 对 main 和 origin/main 是怎么说的?
- 改需求别硬推
你干活时,队友推送了
add docs。这里强制推送,会删掉他们的提交。用正确的方式做,让服务器上两个提交都在。 - 从零写共享一个分支
建一个分支
search,提交一个新文件search.py(内容随意),说明写add search,然后用git push -u origin search把这个分支推送到 origin。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Remote | 远程仓库 | Another copy of the repository, such as one on GitHub. |
| Push | 推送 | Upload your commits to a remote. |
| Pull | 拉取 | Download a remote's commits and merge them. |