参考链接:
一、Git是什么?
Git是一个开源的分布式版本控制系统 ,由Linus Torvalds于2005年为管理Linux内核开发而创建。它的核心设计思想是分布式,即每个开发者的电脑上都拥有项目的完整历史仓库,这使其可以离线工作、操作速度快且数据安全性高。
你可以将Git理解为一个超级强大的"时间机器"和"协作白板"。
-
时间机器 :它能精确记录你的项目(代码、文档)在每一个时刻的样子。你可以随时回到任何一个过去的版本,查看当时写了什么,甚至撤销错误。
-
协作白板:它允许多人在这块"白板"上并行工作,最后将所有修改巧妙地合并在一起,而不会互相覆盖。
其核心设计基于两个关键点:
-
快照,而非差异 :多数版本控制系统(如SVN)记录的是文件的差异 。而Git在每次提交时,会为所有文件创建一个快照。这就像一个迷你文件系统,让版本切换极快且非常可靠。
-
分布式架构 :这是Git的革命性设计。每个开发者的电脑上都有一个完整的仓库副本,包含全部历史。这意味着你可以离线工作,所有操作(提交、查看历史)都在本地瞬间完成,最后再与他人同步。
| 特性 | 集中式版本控制 (如 SVN) | 分布式版本控制 (Git) |
|---|---|---|
| 核心模型 | 单一的中央服务器 | 每个客户端都是完整仓库 |
| 网络需求 | 大多数操作需要联网 | 可完全离线工作 |
| 提交速度 | 依赖网络,较慢 | 本地操作,极快 |
| 数据安全 | 服务器是单一故障点 | 人人有完整备份,更安全 |
二、核心概念与工作流程:
Git 的本质是「分布式版本控制系统」,核心是 "把文件的每一次修改都记录下来,随时能回滚、能协作"。要理解它,先记住 4 个 "存放文件的地方",用「快递打包」类比:

| Git 区域 | 生活类比 | 核心作用 |
|---|---|---|
| 工作区(Workspace) | 你的书桌 | 平时写代码、改文件的地方(草稿纸,改了还没整理) |
| 暂存区(Staging) | 快递打包台 | 把书桌里改好的文件 "挑出来",放到打包台,准备寄走(标记 "要提交的修改") |
| 本地仓库(Repository) | 家里的快递柜(自己的) | 把打包台的文件最终封存,生成 "版本记录"(永久保存,能回滚) |
| 远程仓库(Remote) | 快递公司的仓库(比如 GitHub) | 把自己快递柜的文件,同步到网上,方便和同事共享、备份 |
关键补充:
- 版本(Commit) :每次把暂存区文件存到本地仓库,都会生成一个 "版本快照"(类似给文件拍张照),有唯一的哈希值(一串乱码,比如
a8b7c9),能精准定位这个版本。 - 分布式:每个人电脑上都有完整的本地仓库,哪怕断网也能改代码、存版本;联网后再和远程仓库同步 ------ 不像老式的 "集中式"(必须连服务器才能干活)。
三、Git 基础工作流程:从 "改代码" 到 "同步到网上"(7 步走)
用「写作文并同步到云盘」的场景,一步步讲清楚:
步骤 1:初始化仓库(第一次用)
- 类比:你要写一篇作文,先建一个 "作文文件夹",并告诉 Git:"这个文件夹归你管了"。
- 命令:
git init(在文件夹里执行,会生成隐藏的.git文件夹,这就是本地仓库的核心)。 - 补充:如果是从网上(比如 GitHub)拿现成的仓库,用
git clone 仓库地址(相当于 "把云盘里的作文文件夹下载到本地")。
步骤 2:在工作区修改文件
- 类比:你在作文文件夹里写 / 改作文(比如新建
作文.txt,写了第一段)。 - 此时 Git 状态:工作区有 "未跟踪 / 修改的文件",暂存区、本地仓库都没这个修改。
- 查看状态命令:
git status(会提示 "有未跟踪的文件",红色字体)。
步骤 3:把修改加入暂存区
- 类比:你写完第一段,觉得没问题,把
作文.txt放到 "打包台"(准备最终保存)。 - 命令:
- 单个文件:git add
作文.txt - 所有修改文件:
git add .(.代表当前文件夹所有)
- 单个文件:git add
- 查看状态:
git status会显示绿色字体,说明文件已进暂存区。
步骤 4:把暂存区文件提交到本地仓库
- 类比:把打包台的作文封存,贴个标签(比如 "第一次写完开头"),放进自己的快递柜。
- 命令:
git commit -m "第一次写完作文开头"(-m后面是 "版本备注",必须写,方便以后找)。 - 关键:每次
commit都会生成一个唯一的版本号 ,比如commit a8b7c9d0123456789abcdef。
步骤 5:关联远程仓库(第一次推)
- 类比:告诉 Git,你的作文要同步到哪个云盘(比如 GitHub 的仓库地址)。
- 命令:
git remote add origin 远程仓库地址(origin是远程仓库的 "昵称",默认叫这个)。
步骤 6:把本地仓库的版本推送到远程仓库
- 类比:把自己快递柜里的作文,寄到快递公司的仓库(云盘),方便同学看。
- 命令:
git push -u origin main(main是分支名,现在 GitHub 默认分支叫 main,老版本是 master;-u是第一次推,绑定本地和远程分支)。 - 后续推送:直接
git push就行。
步骤 7:从远程仓库拉取最新版本(协作时)
- 类比:同学改了你的作文,你从云盘下载最新版到本地。
- 命令:
git pull origin main(把远程 main 分支的最新内容,拉到本地并合并)。
git init/clone → 改文件(工作区)→ git add .(暂存区)→ git commit -m "备注"(本地仓库)→ git push(远程仓库) ↓ 需要更新代码时 → git pull(把远程最新拉到本地)→ 继续改文件...
四、核心概念补充
1. 分支(Branch)(平行宇宙)
分支 不是复制文件,而是从某个提交点开始,创建一条新的独立时间线。
- 类比:你写作文时,想试两种开头,不用删原来的,复制一份作文,在副本上改(副本就是 "分支"),改好满意了再合并回原文。

-
主分支 (
main/master):默认分支是main(主分支),通常是存放稳定代码的主线。 -
功能分支 :开发时一般建
dev分支,从提交C分叉出去,你在上面开发新功能(提交D, E),无论怎么折腾,都不会影响主分支。开发完成后,可以合并回主分支。
- 常用命令:
- 新建分支:
git checkout -b dev(新建并切换到 dev 分支) - 切换分支:
git checkout main - 合并分支:在 main 分支执行
git merge dev(把 dev 的修改合并到 main)
- 新建分支:
2. 回滚(Reset/Checkout)
- 类比:你改坏了作文,想回到 "第一次写完开头" 的版本。
- 简单回滚:
git checkout 版本号 文件名(只恢复某个文件到指定版本) - 回滚本地仓库:
git reset --hard 版本号(谨慎用!会清空工作区和暂存区的未提交修改)
3. 冲突(Conflict)
- 类比:你和同学同时改了作文的同一句话,Git 不知道该留谁的,就会提示 "冲突"。
- 解决:打开冲突文件,会看到
<<<<<<< HEAD(你的修改)、=======(同学的修改)、>>>>>>> dev,手动删掉多余的,保留正确内容,再重新add和commit。
五、git常用命令简单介绍
1、仓库创建与克隆(初始化项目)
| 命令 | 作用 | 示例与说明 |
|---|---|---|
git init |
在当前目录新建一个Git仓库 | git init 执行后当前目录会生成一个隐藏的 .git 文件夹 |
git clone <url> |
下载一个已有远程仓库到本地 | git clone https://github.com/user/project.git 这通常是参与项目的第一步 |
2、日常修改与提交(单人工作流)
这是你每天使用最频繁 的命令组合,对应 工作区 → 暂存区 → 仓库 的流程。
| 命令 | 作用 | 示例与说明 |
|---|---|---|
git status |
查看工作区和暂存区的当前状态(最常用) | git status 会显示:哪些文件修改了但未暂存、哪些已暂存待提交 |
git add <文件> |
将工作区的指定修改添加到暂存区 | git add index.html git add src/ (添加整个src目录) git add . (添加所有修改和新增文件) |
git commit -m "信息" |
将暂存区的内容永久提交到本地仓库,创建一个新版本 | git commit -m "修复了登录按钮的点击bug" 提交信息务必清晰,这是好习惯的开始 |
git diff |
查看工作区 与暂存区的差异(具体改了哪些代码) | git diff (查看所有未暂存的修改) git diff --staged (查看已暂存但未提交的修改) |
3、分支管理(多人协作与功能开发)
分支是Git的"杀手锏",让你能安全地并行开发。
| 命令 | 作用 | 示例与说明 |
|---|---|---|
git branch |
列出所有本地分支 | git branch 当前分支前会有一个 * 号 |
git branch <分支名> |
创建一个新分支 | git branch feature-payment |
git checkout <分支名> |
切换到指定分支 | git checkout feature-payment git checkout -b hotfix-login ( 创建并立即切换,非常常用) |
git switch <分支名> |
(Git 2.23+) 切换 分支,比checkout更直观 |
git switch main git switch -c new-feature (创建并切换) |
git merge <分支名> |
将指定分支 合并到当前分支 | git switch main git merge feature-payment (将支付功能分支合并到主分支) |
git branch -d <分支名> |
删除已合并的分支 | git branch -d feature-payment (安全删除) git branch -D <分支名> (强制删除未合并的分支,慎用) |
git log --oneline --graph |
图形化查看分支合并历史 | git log --oneline --graph --all 能非常清晰地看到分支从哪里创建、在哪里合并 |
4、远程协作(团队工作流)
| 命令 | 作用 | 示例与说明 |
|---|---|---|
git remote add <别名> <url> |
将本地仓库与一个远程仓库关联 | git remote add origin https://gitee.com/yourname/proj.git 通常远程仓库的别名默认为 origin |
git push <远程> <分支> |
将本地指定分支 的提交推送到远程仓库 | git push origin main (推送到origin的main分支) git push -u origin main (-u 设置上游,以后可直接git push) |
git pull <远程> <分支> |
拉取 远程分支的最新提交并合并到当前分支 | git pull origin main 相当于 git fetch + git merge,是获取团队更新的主要命令 |
git fetch <远程> |
仅下载 远程仓库的最新数据,不自动合并 | git fetch origin 更安全,让你先查看远程变化再决定是否合并 |
git remote -v |
查看已关联的远程仓库地址 | git remote -v |
5、撤销与回退("后悔药")
| 命令 | 作用 | 示例与说明 |
|---|---|---|
git restore <文件> |
丢弃工作区 中某个文件的修改(尚未git add) |
git restore style.css (让style.css回到最后一次git add或commit的样子) |
git restore --staged <文件> |
将文件从暂存区 移回工作区 (撤销git add) |
git restore --staged style.css (撤销对style.css的暂存,但修改内容还在工作区) |
git commit --amend |
修改最近一次提交的信息或追加文件 | git commit --amend -m "新的提交信息" 注意: 如果已经push,修改后需要强制推送(push -f),团队协作时慎用 |
git reset <提交ID> |
回退到某个提交版本 | git reset --soft HEAD~1 (回退一个版本,但保留工作区和暂存区的修改) git reset --hard abc123 (危险! 彻底回退到abc123,之后的修改全部丢弃) |
六、Git具体命令实际操作
1、Git安装(Git是一个版本控制系统,也是一个工具,跟Java类似)
Mac上自带Git,Windows系统要自己安装。
Windows:https://gitforwindows.org/
Linux:apt-get install git
2、Git命令列表
如何判断Git有没有安装成功?(Git 的安装请看上述的链接1), 在Git Bash命令行列里输入git,如果出现以下提示就说明成功了。

Git所有的操作命令都要以git开头。
3、切换到自己指定的Git仓库目录
提醒:在进行任何Git操作之前都需要在Git Bash中切换到Git仓库目录(你指定的目录),也就是先要切换到项目的文件夹目录下。
Windows用户直接手动建立一个项目文件夹(我在D盘下建立了gitProject文件夹作为测试),在文件夹里新建一个文件,比如说novel02.md(Markdown格式文件)。
Linux用户用命令来建立:
mkdir test (创建文件夹test)
cd test (切换到test目录)
touch a.md (新建a.md文件)
建立好之后,在git bash中使用cd指令,到达自己新建的git路径下。先随便操作一个命令,比如 git status来查看你当前git仓库的一些状态 ,可以看到如下提示(颜色无所谓):意思就是当前这个文件夹还不是一个Git仓库。

4、使用git init将当前文件夹变为git仓库

可以看到初始化成功,这时候Test01文件夹就是一个git仓库了。
紧接着,输入git status 查看工作区和暂存区的当前状态,

默认是在master分支。
这时最主要的提示就是a.md、b.md文件是Untracked files,就是说a.md、b.md这个文件还没被跟踪,还没有提交到git仓库里,而且提示你可以用git add <file> 去操作你想要提交的文件
5、使用 git add 将工作区的指定修改添加到暂存区
上面提示a.md、b.md 文件还没提交到仓库里,这时可以随便编辑一下 a.md 、b.md 文件,然后输入 git add . (添加所有 修改和新增文件),再输入 git status:

此时提示以下文件Changes to be committed,意思就是a.md 、b.md文件等待被提交。
当然你可以使用git rm --cached 这个命令去移除这个缓存。
6、使用git commit 将暂存区的内容永久提交到本地仓库,创建一个新版本
接着我们输入 git commit -m 'first commit',这个命令中 commit 就是提交的意思,-m 代表提交时的备注信息,即对这次提交的说明,执行了以上命令代表我们已经正式进行了第一次提交。
这时再输入git status,会提示 nothing to commit。
输入 git log 命令,会看到如下:

git log 命令可以查看所有产生的commit记录,所以可以看到已经产生了一条commit记录,提交时的备注信息就叫"first commit 创建了两个文件"。
git add 是先把改动添加到一个「暂存区」,你可以理解为一个缓存区域,临时保存你的改动,而git commit才是最后的提交。这样的好处就是防止误提交。
当然也有办法把这两步合并成一步,不过后面再介绍,建议新手按部就班的一步步来。
7、使用git branch 创建一个新分支
branch就是"分支"的意思。分支的概念很重要,尤其是团队协作开发的时候。
假设两个人都在做同一个项目,这个时候分支就是保证两人能协同合作的最大利器。
举个例子,A,B两人都在做同一个项目,但是是不同的模块。这个时候A新建了一个分支叫a,B新建了一个分支叫b,这样A,B做的所有代码改动都各自在各自的分支,互不影响,等到俩人都把各自的模块做完了,最后再统一把分支合并起来。
执行了git init ,初始化git仓库之后会默认生成一个主分支master,也是你所在的默认分支,也基本是实际开发正式环境下的分支,一般情况下master分支不会轻易直接再上面操作的,你们可以输入git branch 查看当前分支情况:

如果我们想在此基础上新建一个分支呢? 只需执行命令git branch a 就新建了一个名字叫 a 的分支。
而且这时候分支a和分支master是一模一样的内容,我们再输入git branch 查看当前的分支情况:

但是可以看到master分支前有个 * 号,即虽然新建了一个 a 的分支,但是当前所在的分支还是在master上。
如果我们想在a分支上进行开发,首先要切换到a分支上去,所以使用以下命令切换分支:
git checkout a
执行之后,再输入 git branch 查看分支情况;

可以看到当前我们所在分支已经到a上去了。也就是说,这时本地文件夹里的内容其实属于a 分支,A同学就可以在自己的本地上在他新建的a分支去进行代码改动了。
bash
# 你在分支 a
$ git checkout a
# 在 Windows 中:
1. 打开 D:\self_study\gitProject\Test01 文件夹
2. 看到的是分支 a 的文件
3. 修改任何文件,都只影响分支 a
-
分支只是指向不同提交的指针
-
所有分支都共享同一个工作目录(就是你看到的文件夹)
-
切换分支时,Git 会自动替换工作目录中的文件内容
git checkout -b a(这个命令是新建一个a分支,并且自动切换到a分支。)
8、git merge
A同学在a分支写了自己的代码,终于完工了他的功能,并且测试也都ok了,准备上线,这时候就需要把他本地的代码合并到GitHub上的主分支master上来,然后发布。
git merge 就是合并分支用到的命令.面对这种情况,需要做两步:
第一步是切换到master分支,如果你已经在了就不用切换了;
第二步是执行 git merge a,意思就是把a分支的代码合并过来。
不出意外的话,这时a分支的代码就顺利合并到master分支来了。但是在实际情况中,会经常出现"意外",也就是说经常会因为出现冲突而导致合并失败。这一点,后面讲。
9、git branch -d
有新建分支,就有删除分支。假如这个分支新建错了,或者a分支的代码已经顺利合并到master分支来了,那么a分支算是没用了(已经测试完的代码就合并到正式程序中去了),需要删除,这时执行git branch -d a就可以把a分支删除了。
10、git branch -D
有时候会删除失败,比如如果a分支的代码还没有合并到master,你执行 git branch -d a是删除不了的,它会智能提示你a分支还要未合并的代码,但是如果你非要删除,那就执行 git branch -D a就可以强制删除a分支。
11、git tag
我们在客户端开发的时候经常会有版本的概念,比如v1.0、v1.1之类的。
不同的版本肯定对应不同的代码,所以我们一般要给代码加上标签,这样假设v1.1版本出了一个新bug,但是又不知道v1.0是否有这个bug,有了标签就可以顺利切换到v1.0的代码,重新打个包测试了。
所以如果想要新建一个标签很简单,比如 git tag v1.0 就代表我在当前代码状态下新建了一个v1.0的标签,输入git tag可以查看历史tag记录。

如果建立了两个标签,v1.0和v1.1,需要切换的话,执行命令git checkout v1.0,这样就顺利的切换到v1.0 tag的代码状态了。
以上是一些最基本的Git操作,而且全是在本地环境进行操作的,完全没有涉及远程仓库,下一部分将以远程GitHub仓库为例,讲解下本地如何跟远程仓库一起同步协作。
七、向GitHub提交代码
1、SSH
SSH(Secure Shell) 是一种网络协议,用于在不安全的网络中安全地进行远程登录和执行命令。它通过加密技术保护数据传输的安全性。
大多数Git服务器都会选择使用SSH公钥来进行授权,所以想要在GitHub提交代码的第一步就是要先添加SSH key配置。
2、生成SSH key
Linux和Mac都是默认安装了SSH,而Windows系统安装了Git Bash也是带了SSH的。我们可以在终端(Windows下在Git Bash里)输入ssh 如果出现以下提示证明你本机已经安装了SSH,否则请自行搜索安装下:

紧接着输入 ssh-keygen -t rsa ,什么意思呢?就是指定rsa算法生成密钥,接着连续三个回车键(不需要输入密码),然后就会生成两个文件 id_rsa 和 id_rsa.pub ,而 id_rsa是密钥,id_rsa.pub 就是公钥。
这两个文件都是隐藏文件(Windows系统提供查看隐藏文件选项)默认在如下目录里生成:
Linux/Mac系统在 ~/.ssh
Windows在 C:\Users\username\.ssh
找到文件后接下来要做的就是把id_rsa.pub的内容添加到 GitHub上。
这样你本地的id_rsa密钥跟GitHub上的id_rsa.pub公钥进行配对,授权成功才可以提交代码。
3、在GitHub上添加SSH key



提示:如何查看 id_rsa.pub文件的内容?
Linux/Mac用户执行命令:
cd ~/.ssh
cat id_rsa.pub
Windows用户,设置显示隐藏文件,使用Notepad++或者EditPlus或Sublime打开复制就可以了。
SSH key添加成功之后,输入ssh -T git@github.com进行测试,如果出现以下提示说明添加成功:

4、Push (推)
如果你本地代码有更新了,那么就需要把本地代码推到远程仓库,这样本地仓库跟远程仓库就可以保持同步了。
代码示例:git push origin master
意思就是把本地代码推到远程master分支。
5、Pull(拉)
如果别人提交代码到远程仓库,这个时候你需要把远程仓库的最新代码拉下来,然后保证两端代码的同步。
代码示例:git pull origin master
意思就是把远程最新的代码更新到本地。
一般我们在push之前都会先pull,这样不容易冲突。
6、提交代码
添加SSH key成功之后,我们就有权限向GitHub上我们自己的项目提交代码了,提交代码有两种方法:
a、Clone自己的项目。
我们以我在GitHub上创建的项目为例,执行如下命令(注意,需要先在本地建立一个文件夹用来放置项目,然后在该文件夹内用Git Bash打开,执行命令):
git clone git@github.com:...... (git@github.com:......是你要复制的一个项目的仓库地址,这一部分的内容获取如下图所示)
这样就把myNovel项目clone到了本地,我们可以把clone理解为高级点的复制,这时候该项目本身就已经是一个git仓库了,不需要执行git init进行初始化,而且甚至都已经关联好了远程仓库,我们只需要在这个myNovel目录下任意修改或者添加文件,然后进行commit,之后就可以执行:
git push origin master
进行代码提交,这是最简单方便的一种方式。
至于怎样获取某个项目的仓库地址呢?(找到自己在github里建立的项目,然后如下图赋值git@github.com:......这段内容,放在git clone 后面)

b、关联本地已有项目
如果我们本地已经有一个完整的git仓库,并且已经进行了很多次commit,这个时候第一种方法就不适合了。
假设我们本地有个Test01的git项目,我们需要的是在GitHub上建一个test的项目,然后把本地Test01上所有代码的commit记录提交到GitHub上的test项目。
第一步就是在GitHub上建一个test项目,这个很简单。
第二步是把本地Test01项目与GitHub上的test项目进行关联,切换到Test01目录,执行如下命令: git remote add origin git@github.com:xxxx/test.git
什么意思?就是添加一个远程仓库,它的地址是 git@github.com:xxxx/test.git ,而 origin是给这个项目的远程仓库起的名字。
这个名字可以随便取,只是大家默认只有一个远程仓库时名字就是origin。
为什么要给远程仓库取名字?因为我们可能一个项目有多个远程仓库,比如GitHub一个,比如公司一个,这样的话提交到不同的远程仓库就需要指定不同的仓库名字了。
查看我们当前项目有哪些远程仓库时可以执行命令:git remote -v
接下来,我们本地的仓库就可以向远程仓库进行代码提交了:git push origin master
就是默认向GitHub上的test目录提交了代码,而这个代码是在master分支。
当然,也可以提交到指定的分支。
提醒:提交代码之前要设置一下自己的用户名和邮箱,因为这些信息会出现在所有的commit记录里,执行以下命令就可以设置;
git config --global user.name "KeneathGuo"
git config --global user.email "keneathguo@gmail.com"
八、新手避坑指南(最容易懵的点)
- "改了文件但 git status 没反应" :文件没被 Git 跟踪(第一次改的新文件),先执行
git add。 - "git push 提示拒绝" :远程仓库有最新版本,先
git pull拉取合并,再推送。 - "commit 后发现写错备注" :
git commit --amend -m "新备注"(修改最后一次 commit 的备注)。 - "不小心 add 了不想提交的文件" :
git reset 文件名(把文件从暂存区撤回到工作区)。
九、总结:Git 的核心逻辑
Git 本质是 "给文件做版本快照",核心是「工作区→暂存区→本地仓库→远程仓库」的流转,分支是 "并行修改" 的工具,远程仓库是 "共享和备份" 的载体。
新手不用追求一次懂完,先按 "改文件→add→commit→push" 的流程练熟,遇到问题再查(比如冲突、回滚)
十、留言
如有问题,敬请指正。