上一篇跑通了本地Git的基本流程,这篇接着学怎么把代码推到GitHub上,以及分支是怎么回事。中间踩了几个坑,都记下来了。
一、注册GitHub账号
GitHub 是一个代码托管网站,相当于"代码的云盘"。你本地用 Git 管理好的代码,可以推送到 GitHub 上存着,别人也能看到。
去 github.com 注册一个账号,用邮箱注册就行。注册完之后你会看到一个章鱼猫(Octocat)的 logo,那就是 GitHub 的标志。
二、在GitHub上创建仓库
登录之后,点右上角的 + 号,选 New repository,进入创建页面。需要填的选项:
Repository name(仓库名):给你的仓库取个名字,比如 practice-git。
Public / Private:
- Public:公开的,所有人都能看到你的代码。学习用的话选这个就行。
- Private:私有的,只有你自己(和你邀请的人)能看到。公司项目一般选这个。
Initialize this repository with:下面有三个勾选项——README、.gitignore、License。学习阶段全部不勾,保持空仓库就行。后面会单独讲 .gitignore 是什么。
填好之后点 Create repository,就建好了。
建好之后页面会显示一段命令,告诉你怎么把本地代码推上来。先别急,往下看。
三、把本地代码推到GitHub
假设你上一篇已经建好了本地仓库,里面有提交记录。现在要把它和 GitHub 上的仓库连起来,然后推送上去。
一共三步:
git remote add origin https://github.com/你的用户名/仓库名.git git branch -M main git push -u origin main逐行解释:
git remote add origin https://github.com/tangtangyi/practice-git.git
- git remote — 管理"远程仓库"。远程仓库就是不在你电脑上的仓库,比如在 GitHub 上的那个。
- add — 添加一个。
- origin — 这是你给远程仓库起的别名。就像你给联系人存名字一样,origin 就是 "practice-git.git · github.com" 这个长地址的简称。以后你不用每次都打完整地址,说 origin 就行。
- 后面的 URL — 就是你在 GitHub 上建的那个仓库的地址。
git branch -M main
- 把主分支的名字从 master 改成 main。GitHub 现在默认主分支叫 main,以前叫 master。改一下名字,保持一致。
git push -u origin main
- git push — 推送,把本地的代码上传到远程仓库。
- -u — 第一次推送时加上这个,意思是"记住这个对应关系"。以后你在这个分支上再 push,直接打 git push 就行,不用每次写 origin main。
- origin — 推到哪里,就是刚才设置的那个远程仓库。
- main — 推哪个分支。
正常成功的输出长这样:
Enumerating objects: 6, done. Counting objects: 100% (6/6), done. Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done. To https://github.com/********/practice-git.git * [new branch] main -> main branch 'main' set up to track 'origin/main'.看到 new branch 和 set up to track 就说明成功了。去 GitHub 刷新页面,就能看到你的文件了。
四、踩坑记录
坑1:push 没有任何输出
执行 git push 之后,命令行直接返回了,没有报错也没有成功提示。这种情况大概率是网络被拦截了。
很多公司的网络有 DLP(数据防泄漏)系统,检测到你在往外部 Git 仓库推代码,会直接掐断连接。表现就是 push 命令静默失败——不报错,但也没推上去。
解决办法:
- 切手机热点再 push
- 或者回家用自己的网络 push
代码在本地不会丢,什么时候推都行。
坑2:GitHub 页面打不开 / 加载很慢
国内访问 GitHub 经常抽风,页面加载不出来或者特别慢。这是正常的,多刷新几次,或者等网络好的时候再操作。
五、分支(branch)
分支是什么?
想象你在写一份文档(main 分支),突然老板说"你试一下用另一种格式排版"。你不会直接在原文档上改,万一改坏了就全完了。你会复制一份出来,在副本上折腾。这个副本就是新分支。
在 Git 里:
- 主分支叫 main(以前叫 master),是你的"正式文档"
- 你可以新建分支来试验新功能,试验完了合并回 main
- 试验失败了,直接丢掉这个分支,main 完全不受影响
分支长什么样?
main: A --- B --- C --- F(bug修复合并回来) \ / dev: D --- E(新功能,还没做完)
字母代表每次提交。你在 B 的时候开了 dev 分支,在 dev 上做了 D 和 E。同时 main 上继续做了 C,然后发现 bug 修了 F。最后把 dev 合并回 main。
常用分支命令
| 命令 | 作用 | 通俗理解 |
|---|---|---|
| git branch | 查看所有分支 | 看看桌上有几份文档 |
| git branch 名字 | 新建分支(不切换) | 复制一份文档放在桌上,但还在看原件 |
| git checkout -b 名字 | 新建分支并切换过去 | 复制+打开副本,一步到位 |
| git merge 名字 | 把另一个分支合并到当前分支 | 副本改好了,把改动合回原件 |
| git branch -d 名字 | 删除分支(安全删除) | 副本没用了,丢掉(没合并的不让删) |
| git branch -D 名字 | 强制删除分支 | 不管合没合并都删 |
举个例子:
# 查看当前分支,带 * 的是你所在的分支 git branch * main # 新建一个叫 dev 的分支,并且切换过去 git checkout -b dev Switched to a new branch 'dev' # 这时候你再 git branch,会看到: # main # * dev # 星号在 dev 前面,说明你现在在 dev 分支上 # 在 dev 上改代码、提交... echo "新功能代码" >> test.txt git add . git commit -m "在dev分支上新增功能" # 改完了,切回 main git checkout main # 把 dev 的改动合并到 main git merge dev # dev 没用了,删掉 git branch -d dev合并冲突(conflict)
如果两个分支改了同一个文件的同一行,Git 不知道该听谁的,就会报冲突。
比如 main 上你把 test.txt 改成了 "版本A",dev 上你把同一行改成了 "版本B",合并的时候 Git 就会说:
CONFLICT (content): Merge conflict in test.txt
这时候打开 test.txt,你会看到类似这样的内容:
<<<<<<< HEAD 版本A ======= 版本B >>>>>>> dev
<<<<<<< HEAD 到 ======= 之间是当前分支(main)的内容,======= 到 >>>>>>> dev 之间是 dev 分支的内容。你手动删掉不要的那部分,保留想要的,然后重新 add + commit 就行了。
实际工作中怎么避免冲突?
- 各改各的文件,尽量别两个人同时改同一个文件
- 合并之前先 pull 一下最新的代码
- 冲突了别慌,看清楚两边改了什么,跟同事沟通一下再决定留哪个
六、远程分支
你 push 到 GitHub 的 main 分支,在 Git 里叫 origin/main,是远程分支。本地的 main 和远程的 origin/main 是两个东西:
- main— 你电脑上的分支
- origin/main— GitHub 上的分支
git push 就是把本地的 main 同步到远程的 origin/main。
反过来,git pull 是把远程的 origin/main 拉下来同步到本地的 main。比如同事往 GitHub 推了新代码,你用 git pull 就能拿到最新的。
七、Git知识地图:还剩下什么要学?
到这里,你已经覆盖了日常开发 80% 的 Git 场景了。剩下的按需学就行:
马上要学的(基础必备):
- .gitignore — 告诉 Git 哪些文件不用管(比如编译产生的临时文件、密码配置文件)
- git reset / git revert — 提交错了怎么撤回
工作中遇到了再学:
- git stash — 临时存一下手头没做完的改动,切分支去干别的事
- git rebase — 让提交历史更干净,比 merge 高级一点
- git cherry-pick — 只拿另一个分支的某一次提交,不是全部合并
- git tag — 给重要版本打标签,比如 v1.0、v2.0
基本用不到的(碰到了再查):
- git submodule、git bisect、git hook
八、常用命令总结(第一篇 + 这篇)
| 命令 | 作用 |
|---|---|
| git init | 新建仓库 |
| git add . | 把所有改动准备好要提交 |
| git commit -m "说明" | 提交并写说明 |
| git log --oneline | 查看提交历史(简洁版) |
| git checkout 编号 -- 文件名 | 把文件恢复到某个历史版本 |
| git remote add origin 地址 | 关联远程仓库 |
| git push -u origin main | 推送到远程仓库 |
| git pull | 从远程拉取最新代码 |
| git branch | 查看分支 |
| git checkout -b 名字 | 新建并切换分支 |
| git merge 名字 | 合并分支 |
| git branch -d 名字 | 删除分支 |
九、写在最后
学 Git 不需要什么基础,会打字就行。关键是动手练,光看教程没用。
第一篇跑通了本地流程,这篇学会了推送到 GitHub 和分支管理。下一篇讲 .gitignore 和提交撤回,把基础补齐。
共勉。