一、Git是什么?
Git是一个免费的、开源的"分布式版本控制系统"。
1.1分布式VS集中式
分布式(Git)
每一台克隆代码的电脑,都拥有一份完整仓库(全部历史、所有分支);
本地可以离线提交、建分支、回滚版本,不需要联网;
Git/GitHub远程仓库只是其中一份"备份/交换中心";
所有人本地都有完整数据,容错更高。
集中式(SVN)只有一台中心服务器保存完整代码;
本地电脑只有当前文件,没有完整历史;
断网无法查看历史、提交版本;服务器崩了所有历史有丢失风险。
1.2版本控制
简单来说,版本控制就是给文件保存无数个历史版本,随时回溯、对比改动。
没有版本控制时,你写代码只能手动复制xxx1.c、xxx2.c......,文件杂乱,分不清改了什么,删错内容无法恢复。
有了版本控制功能:每一次commit就是一份快照;可以查看每一行代码是谁改的、什么时候改的;改错了能一键回退到任意历史版本;多人开发可以区分不同修改,解决代码冲突。
二、Git安装
三、Git基础操作
首先了解工作区、暂存区、远程仓库
工作区:你本地的
.git目录 = 版本库(仓库)
objects:永久保存所有历史版本快照
index:暂存区
refs/heads:保存各个分支指针
1.使用Git上传代码到Gitee全流程
1.1打开Git终端
(1)鼠标右键-->Git Bash Here

(2)找到你要上传的代码文件夹,然后鼠标右键-->Git Bash Here
1.2Git全局设置
先分清两个概念:1.全局(--global):作用在电脑所有Git仓库
2.本地(不加--global):只作用当前这一个项目文件夹
1.最常见的两条全局配置(身份信息)
bashgit config --global user.name "你的名字" git config --global user.email "你的邮箱"作用:
每次你git commit提交代码时,Git需要记录是谁提交得的。
不设置:提交会报错或者身份空白,Gitee/GitHub无法识别提交者头像。
加--global:一次设置,本机所有项目共用这套名字邮箱。
注意:Gitee/Github尽量用账号绑定的邮箱,不然提交记录不会显示在个人贡献面板。
2.其他常用全局配置举例如果你的开发环境是Windows,那么你在git commint的时候大概率会显示一个warning
bashwarning: CRLF will be replaced by LF in Makefile. The file will have its original line endings in your working directory warning: CRLF will be replaced by LF in main.c. The file will have its original line endings in your working directory warning: CRLF will be replaced by LF in stack.c. The file will have its original line endings in your working directory warning: CRLF will be replaced by LF in stack.h. The file will have its original line endings in your working directory这是因为Windows和Linux/Git的换行符不同。 CRLF:Windows换行符\r\n; LF:Linux/Git标准换行符\n。
因此Git 提示:存入仓库时自动把文件里 Windows 换行\r\n转换成 Unix 换行\n; 你本地工作区文件保持原样不变。
C 语言、Makefile 在 Linux 环境编译对换行符很敏感,这条自动转换其实是好事,避免上传后编译报错。
如果是Windows开发环境(标准配置)
检出文件时自动转为 CRLF,入库统一存 LF(默认推荐)
bashgit config --global core.autocrlf true② 如果你只在 Linux/WSL 开发,不需要转换
bashgit config --global core.autocrlf input彻底关闭自动转换(不建议,容易 Makefile 编译异常)
bashgit config --global core.autocrlf false你有 Makefile! 千万不要关闭换行自动转换 ,如果仓库里存了 CRLF,放到 Linux 编译会报奇怪错误:
/bin/sh: ^M: command not found当前 Git 自动转 LF 的行为正好规避这个坑。默认拉取推送行为
git config --global pull.rebase true
设置默认分支名(新版git init默认main)
git config --global init.defaultBranch main
设置编辑器 git config --global core.editor notepad
配置文件存放在哪里?
Windows:C:\Users\用户名\.gitconfig
Linux/Mac:~/.gitconfig
如何查看项目的配置文件?
git config --list
1.3初始化本地仓库(项目根目录执行)
bash
git init
执行git init后,Git自动完成:
1.在当前文件夹新建一个隐藏目录.git,这个.git文件夹就是整个Git仓库本体;没有.git = 普通文件夹,Git不管理任何文件。
Windows注意:.git默认是隐藏文件夹,文件管理器开启「显示隐藏项目」才能看见。
2.在.git内部生成一整套仓库基础结构:
bash
.git
├── config # 当前仓库【本地配置】(优先级高于全局git config)
├── HEAD # 标记当前处在哪个分支(初始指向 master/main)
├── objects/ # 核心!存放所有文件快照、提交记录(Git对象数据库)
├── refs/ # 存放分支标签指针(master、main都在这里)
├── index # 暂存区(git add 就是往这个文件写入信息)
└── description # 仓库描述(Gitee/GitHub基本不用)
1.4将文件加入暂存区
bash
#添加单个文件
git add xxx.c
#添加d多个文件
git add xxx.c xxx.h xxxx.c
#添加当前目录下所有新建/修改文件(最常用)
git add .
这一步的作用就是将工作区的文件改动,存入暂存区。暂存区对应.git/index文件。
注意:git add .不会删除已经被你手动删除掉的文件,如果有文件删除,需要git add -u
bash
# 取消所有暂存
git reset HEAD .
1.5查看状态
bash
# 查看工作区、暂存区当前状态
git status
# 精简板
git status -s
典型输出场景
场景一:干净状态(无任何改动)
含义:工作区、暂存区和本地最新提交完全一致,没有可提交内容。
场景二:修改文件,但还没git add(仅工作区改动)红色,改动只在工作区, commit不会带上这份修改,必须执行git add。
场景三:已经git add,文件在【暂存区】绿色,代表已经加入暂存区,可以执行git commit。
1.5生成提交快照
bash
git commit -m "本次的提交描述,实现/修改什么'
必须先执行git add,把变更放入暂存区。git commit只读取暂存区内容,工作区没add的修改不会被保存!
1.6关联远程仓库(链接复制Gitee仓库地址)
bash
git remote add origin https://gitee.com/xxxxxxx/xxxxx.git
1.7推送代码并绑定分支
bash
# 首次,绑定分支
git push -u origin master
git push:把本地分支的提交,上传到远程仓库
origin:远程仓库别名(通过git remote add配置的)
master:你本地要推送发分支名
-u = --set-upstream,作用:建立追踪关系(绑定上下游分支)
1.8后续日常修改代码推送
以后改完代码,简化流程:
bash
# 1. 将改动加入暂存区
git add .
# 2.生成版本快照(提交到本地仓库)
git commit -m "清晰描述本次修改内容"
#3. 推送到远程仓库
git push
不需要写git push -u origin master,首次-u已经绑定上下游分支,直接git push即可。
拓展小提示
多人协同标准流程
多人同时操作同一个远程仓库,远程代码可能被其他人更新。
如果你本地版本落后,直接git push会被远程拒绝。
完整协作推送流程
bash# 1. 拉取远程最新代码,合并到本地 git pull # 2. 修改你的代码 # 3. 添加变更到暂存区 git add . # 4. 本地生成提交 git commit -m "本次修改说明" # 5. 推送到远程仓库 git pushgit pull底层等价于两条命令组合:git fetch(仅仅下载远程所有新提交,不合并)+git merge(把远程改动合并进本地分支)
两种情况:
1.无冲突:pull自动合并完成,直接继续add/commit/push
2.出现代码冲突(CONFLICT):两个人修改了同一文件的同一处代码,Git不知道保留谁的代码。
2.1将Gitee远程仓库克隆到本地全流程
2.1找到仓库地址
打开Gitee仓库主页,复制HTTPS地址。示例:https://gitee.com/xxxxxxx/xxxxx.git
2.2打开Git Bash Here,切换到你想要存放项目的目录
bash
cd D:\code
2.3执行克隆命令
bash
git clone https://gitee.com/xxxxxxx/xxxxx.git
不想仓库名叫Gitee/GitHub上的名字,可以后面加上文件夹名:
bash
git clone https://gitee.com/xxxxxxx/xxxxx.git my_code
如果只克隆单个分支(不用下载全部分支)
bash
git clone -b master https://gitee.com/xxxxxxx/xxxxx.git
执行后Git自动完成一系列操作:
1.在当前目录新建文件夹
2.git init初始化本地仓库
3.git remote add origin 仓库地址 自动关联远程
4.下载远程所有代码、所有提交记录、分支
5.自动检出默认分支代码到工作区
如果克隆提示权限失败
HTTPS方式:第一次推送代码时,需要输入Gitee账号+私人令牌。
SSH方式:需要提前配置公钥
2.4克隆完成后,后续日常开发流程(和前面一致)
修改代码之后上传流程:
bash
# 多人协作优先拉取
git pull
# 修改代码
git add .
git commit -m "功能修改描述"
git push
常见问题
1.克隆需要账号密码?
2.克隆只会下载默认分支吗?
会下载仓库所有分支完整历史,可以切换其他分支。


