前言
上一篇文章Gitea与Git配置主要写了Gitea和Git的配置,比如安装Git、配置用户名邮箱、生成SSH密钥、连接远程仓库等。
这篇文章就不继续折腾SSH了,主要讲Git最基础的一套使用流程。
很多人刚开始用Git时,基本只会三板斧:
git clonegit pullgit push能用,但是一到自己改代码、提交代码、推送代码时就容易乱。比如:
add到底是干什么的commit是不是已经上传了- 为什么提交前要看
status - 为什么
pull有时会冲突 - 哪些文件不应该提交上去
所以这篇不打算把Git所有命令都讲一遍,只围绕一个最常见的问题:
我改完代码以后,怎么正确提交并推送到远程仓库?先记住一条线
Git日常使用可以先记住这条线:
工作区 -> git add -> 暂存区 -> git commit -> 本地仓库 -> git push -> 远程仓库

这条线看懂了,add、commit、push就没那么容易混。
工作区就是你正在编辑的项目目录。你用VS Code改了文件,这些改动一开始都在工作区里。
git add是把准备提交的内容放进暂存区。暂存区可以理解成“这次准备提交的清单”。
git commit是把暂存区里的内容保存成一次本地提交。
git push才是把本地提交上传到Gitea、GitHub这类远程仓库。
所以一定要记住:
commit = 本地存档push = 上传远程很多新手会以为自己commit以后别人就能看见,其实不是。只commit不push,代码还在自己电脑里。
一套最常用的日常流程
平时改完代码后,可以按这个顺序来:
git statusgit diffgit add .git commit -m "提交说明"git pullgit push简单解释一下:
git status:先看当前有哪些文件改了git diff:再看具体改了什么git add .:把要提交的内容放进暂存区git commit -m "提交说明":提交到本地仓库git pull:推送前先拉一下远程最新代码git push:把本地提交推送到远程仓库
后面就按这条线展开讲。
第一步:先看状态
不知道下一步该干什么时,先敲:
git status
git status会告诉你几件事:
- 当前在哪个分支
- 哪些文件改了
- 哪些文件已经
add了 - 哪些文件还没有被Git跟踪
比如看到文件在Changes not staged for commit下面,说明这个文件改了,但还没有加入暂存区。
看到文件在Changes to be committed下面,说明这个文件已经add了,下一步可以commit。
这个命令很适合用来确认现场。尤其是准备提交前,先看一眼可以避免把奇怪的文件一起提交上去。
第二步:看改了什么
只知道“文件改了”还不够,最好再看看具体改了哪些内容。
git diffgit diff默认查看工作区里还没有add的改动。
如果文件已经add进暂存区了,想看这次准备提交的内容,可以用:
git diff --cached只看某个文件:
git diff 文件名我个人建议提交前尽量看一眼diff,尤其是写代码时临时加过console.log、测试地址、乱七八糟的注释,很容易忘记删。
第三步:选择要提交的内容
确认改动没问题后,就可以把文件加入暂存区。
提交某一个文件:
git add login.js提交当前目录下所有改动:
git add .git add .很方便,但也最容易把不该提交的东西带进去。比如日志文件、临时文件、编译产物、.env配置文件。
如果你同时改了两个文件:
login.jsREADME.md但这次只想提交登录相关代码,就不要直接git add .,而是:
git add login.jsgit commit -m "修复登录失败问题"这样README.md的改动还留在工作区,不会被这次提交带上。
第四步:提交到本地仓库
文件加入暂存区后,就可以提交了。
git commit -m "添加登录页面"commit保存的是暂存区里的内容,也就是你前面git add进去的那些改动。
一个提交最好只做一件事。比如修bug就修bug,改文档就改文档,别把“修复登录问题”和“顺手调整首页样式”混成一个提交。
提交说明也别总写:
git commit -m "update"这种写法当时很爽,三天后自己看日志也不知道这个update到底更新了什么。
可以写得具体一点:
git commit -m "添加登录页面"git commit -m "修复登录失败提示"git commit -m "更新登录接口地址"提交说明不一定要特别长,但至少要让人知道这次提交主要做了什么。
第五步:推送前先拉一下
提交完成后,很多人会直接:
git push如果只有你一个人在改这个仓库,通常没问题。
但如果远程仓库里已经有人提交了新内容,你本地还不知道,直接推送可能会被拒绝。所以比较稳妥的习惯是推送前先拉一下:
git pullgit pushgit pull其实做了两件事:
git pull = git fetch + git mergefetch是把远程的新提交下载下来,merge是把远程分支合并到你当前分支。
所以pull为什么会冲突?因为它本质上做了合并。
如果远程有人改了同一段代码,你本地也改了同一段,Git当然不知道该保留谁的。
第六步:推送到远程仓库
确认本地提交没问题,也拉取过远程更新后,就可以推送:
git push推送成功后,远程仓库页面上就能看到你的提交。
如果是第一次推送一个新分支,可能需要写完整一点:
git push -u origin 分支名-u是设置上游分支,设置之后以后就可以直接git push。
分支协作的完整流程我会放到下一篇讲,这篇先记住一件事:push才是上传远程,commit只是提交到本地。
改错了怎么撤回
写代码时改错文件很正常,关键是先看清楚改动在哪个阶段。
如果文件还没有add,想恢复到上一次提交时的样子:
git restore 文件名撤销当前目录下所有未暂存修改:
git restore .这个命令会直接丢掉你的未提交修改,执行前最好先用git diff看一下。
如果文件已经git add了,但还没commit,想把它从暂存区拿出来:
git restore --staged 文件名这只是取消暂存,文件内容还在。
简单记:
git restore --staged 文件名 = 从暂存区拿出来git restore 文件名 = 丢掉工作区修改哪些文件不要提交
项目里总有些东西不应该交给Git管,比如依赖目录、编译产物、日志、环境变量文件。
常见的.gitignore大概长这样:
node_modulesdist.env*.log.env这种文件尤其要注意,里面经常放密钥、数据库密码之类的东西,不要随便提交。
如果文件已经被提交过,再写进.gitignore是没用的,因为Git已经认识它了。要先取消跟踪:
git rm --cached 文件名目录的话:
git rm -r --cached 目录名然后再提交一次。
.gitignore不是删除文件,它只是告诉Git以后别继续跟踪这些文件。
简单认识一下分支
分支听起来像是团队协作才用的东西,其实一个人写项目也很有用。
比如主分支main现在是能正常运行的版本。你突然想大改登录逻辑,如果直接在main上改,改一半发现跑不起来了,就很尴尬。
这时可以开个新分支:
git switch -c feature-login查看当前有哪些分支:
git branch切回主分支:
git switch main分支的意义就是:
我可以在一条独立的线上折腾,折腾好了再合回主分支。至于多人协作时怎么创建功能分支、怎么推送分支、怎么发Pull Request、怎么合并回main,下一篇《Git协作流程》会继续讲。
发生冲突怎么办
冲突通常出现在pull、merge、rebase这些操作时。
冲突文件里一般会出现这种东西:
<<<<<<< HEAD这是你本地的内容=======这是远程分支的内容>>>>>>> origin/main它的意思是:同一个位置,两边都有修改,Git不知道该选哪边。
你要做的是手动改成最终想要的内容,然后把这些冲突标记删掉。
如果是普通pull或merge产生的冲突,处理完后:
git add 冲突文件git commit如果你用的是:
git pull --rebase冲突处理完后继续:
git add 冲突文件git rebase --continue不想继续这次rebase,可以取消:
git rebase --abort冲突本身不可怕,它只是Git不敢替你做选择。解决完以后,最好重新跑一下项目,确认代码逻辑真的没问题。
看历史用log
提交多了以后,可以用git log看历史:
git log默认输出比较长,平时我更常用这个:
git log --oneline输出大概是:
a1b2c3d 修复登录失败问题e4f5g6h 添加用户设置页面前面那串是提交ID,后面是提交说明。
如果想看分支关系,可以用:
git log --oneline --graph --all刚开始不一定要看懂所有线条,至少能看出来提交历史是怎么往前走的。
常用命令速查
查看当前状态:
git status查看具体改动:
git diff查看暂存区里的改动:
git diff --cached加入暂存区:
git add 文件名git add .提交到本地仓库:
git commit -m "提交说明"拉取远程更新:
git pull推送到远程:
git push撤销未提交修改:
git restore 文件名取消暂存:
git restore --staged 文件名查看历史:
git log --oneline创建并切换分支:
git switch -c 分支名切换分支:
git switch 分支名总结
这篇先不用死记很多高级命令,重点记住一条线:
工作区 -> git add -> 暂存区 -> git commit -> 本地仓库 -> git push -> 远程仓库以及一套日常流程:
git statusgit diffgit add .git commit -m "提交说明"git pullgit push先用status看现场,用diff确认改动,再add、commit、pull、push。
把这套流程用顺以后,再去理解分支、合并、Pull Request,就不会觉得Git那么玄学了。