人人都能学编程
English 开始学习
核心 · Git第 5 课 / 共 6 课免费阅读

远程仓库:推送与拉取 · 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
逐步执行
  1. L4你的分支比 origin/main 多 1 个提交。
  2. L5上传。
  3. 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
逐步执行
  1. L3如果现在推送,会被拒绝:服务器上有你没有的提交。
  2. L4取回并合并队友的提交。改的是不同文件,所以没有冲突。
  3. L5现在推送成功了。
  4. L6你的提交、他们的提交,以及把两者连起来的合并提交。

常见错误

在共享分支上 git push --force

强制推送会用你的历史替换服务器上的历史,悄悄删掉队友的提交。应该先 pull。

把密钥推上去

密码一旦推送,就当它已经公开了,哪怕下一次提交删掉了也一样:历史里还留着。立刻换密码,并使用 .gitignore(下一课)。

小测验

1. `git push` 被拒绝,因为远程有你没有的提交。怎么办?

  1. Agit push --force
  2. B先 git pull,再 git push
  3. C删掉仓库重新克隆
查看答案

答案:B

先把他们的提交拉进来合并,再推送。--force 会删掉他们的工作。

2. `origin/main` 是什么?

  1. A你本地记录的、服务器上 main 所在的位置
  2. B你可以编辑的 main 的第二份副本
  3. C永远是 GitHub 上最新的提交
查看答案

答案:A

它只在 fetch、pull 或 push 时更新,所以可能是过时的。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出领先还是落后?

    执行完这些命令后,git status 对 main 和 origin/main 是怎么说的?

  2. 改需求别硬推

    你干活时,队友推送了 add docs。这里强制推送,会删掉他们的提交。用正确的方式做,让服务器上两个提交都在。

  3. 从零写共享一个分支

    建一个分支 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.