Git学习笔记

本人git学习笔记,接受批评指正。

原文:Git学习笔记 - LINUX SB

一、何为Git

1.概述

Git是一款免费、开源的分布式版本控制系统,核心用于追踪文件修改、记录代码版本迭代、实现多人协同开发。与传统集中式工具不同,Git没有绝对依赖的中央服务器,每一台开发者的电脑都拥有完整的版本仓库,断网状态下仍可完成版本提交、分支管理等操作,仅在代码同步、协同开发时需要网络,安全性和灵活性更高。

2.版本控制器的方式(SVN、CVS)

(1)集中式版本控制工具

  • 核心特点:存在唯一中央服务器,所有版本数据统一存储在中央仓库,本地电脑仅保存当前开发的工作文件。
  • 工作限制:必须联网才能拉取代码、提交修改、查看版本记录,一旦中央服务器故障,整个开发团队无法进行版本操作。
  • 适用场景:小型团队、简单项目,版本迭代流程单一的开发场景。

(2)分布式版本控制工具(Git)

  • 核心特点:无绝对中央服务器,每台开发者设备都拥有完整版本仓库,包含所有历史提交记录、分支信息、版本日志。
  • 工作优势:离线可用,本地可独立完成版本提交、回退、分支创建合并;服务器仅作为代码同步的中转站,任意设备故障不影响整体版本数据。
  • 适用场景:大中型团队、多人协同开发、高频迭代、需要版本追溯和多分支并行开发的项目。

3.工作流程

Git本地工作分为三大核心区域,所有文件操作均遵循固定流转规则:

  • 工作区(Workspace):本地项目真实文件夹,日常编写、修改、删除代码的区域(原始文件目录)。
  • 暂存区(Index/Stage):临时缓存区域,用于存放待提交的文件修改,可精准筛选需要提交的代码变更。
  • 本地仓库(Repository):本地版本数据库,永久保存每一次提交的版本记录,可随时回溯任意历史版本。

完整流转链路:工作区修改文件 → git add 提交至暂存区 → git commit 提交至本地仓库(生成唯一版本记录) → 按需 git push 同步至远程仓库

4.使用场景

  • 数据备份:所有代码版本自动留存,避免误删、文件丢失问题。
  • 代码还原:支持任意历史版本回退,快速修复代码bug、撤销错误修改。
  • 协同开发:多人并行开发,通过分支隔离功能,避免代码互相覆盖冲突。
  • 问题追溯:精准定位每一行代码的修改人、修改时间、修改内容,快速排查版本问题。
  • 版本管理:适配项目迭代、版本发布(测试版、正式版),支持标签管理固定版本。

二、Git的本地仓库搭建

本地仓库无需复杂配置,任意空文件夹/项目文件夹均可快速初始化,步骤如下:

  1. 打开需要搭建仓库的项目文件夹(任意本地目录);
  2. 文件夹空白处右键,选择 Git Bash Here 打开终端;
  3. 执行初始化指令,自动生成隐藏的.git文件夹(版本仓库核心目录,默认隐藏无需手动修改)。
1
git init    # 创建当前目录的本地仓库

执行成功后,目录中会生成隐藏的.git文件夹,代表本地仓库搭建完成,当前目录所有文件已纳入Git管理范围。


三、基础操作指令

1.操作过程

git工作目录对于文件的修改(增加、删除、更新)

操作 工作区(workpace) 缓存区(index) 仓库(repository)
创建新文件 > 未跟踪(untracked) >git add 已暂存(staged) >git commit 进入到仓库就成为一次提交记录 commit1
修改已有文件 > 未暂存(unstaged) >git add 已暂存(staged) >git commit 进入到仓库就成为一次提交记录 commit2

2.基础操作指令

指令 作用
git init 在当前目录创建git本地仓库
git add 单个文件名/通配符”.” 添加工作区文件到缓存区
git commit -m “注释内容” 提交缓存区文件到仓库
git status 查看文件修改状态(缓存区、工作区)
git log [options] 查看提交的日志
--all 显示所有分支
--pretty=oneline 显示提交信息为一行
--abbrev-commit 使得输出的commit更简短
--graph 以图片显示
git reset --hard commitID 版本切换,版本回退。commitID可以用git log查看
git reflog 查看已删除的提交记录

(1)git add

  • 用于将工作区的新增、修改、删除操作提交到暂存区,支持单文件、多文件、全文件提交。
1
2
3
4
5
6
7
8
9
10
# 添加单个文件到缓存区
git add index.html
# 添加多个文件到缓存区
git add git/git.md linux index.html
# 添加所有文件到缓存区
git add --all
# 删除工作区文件,并且将这次删除放入暂存区
git rm index
# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]

(2)git commit

  • 将暂存区所有变更固化为正式版本,生成唯一commit版本ID,必须添加备注说明版本修改内容。
1
2
3
4
# 提交文件到本地仓库并备注说明
git commit -m "first commit"
# 提交时显示所有diff信息
git commit -v

(3)git status

  • 实时查看当前文件状态(未跟踪、未暂存、已暂存),排查代码变更情况。
1
2
3
4
# 查看当前仓库状态
git status
# 查看当前仓库状态,简化输出
git status -s

(4)git log

  • git log:查看当前分支正向历史提交记录;git reflog:查看所有操作记录(包含已回退、删除的版本,用于找回丢失版本)。
1
2
3
4
5
6
# 查看日志信息(只查看当前head和之前的日志信息)
git log
# 简洁日志信息
git log --oneline
# 查看所有的提交变更日志
git reflog

(5)git config

  • 首次使用Git必须配置用户名和邮箱,用于标识代码提交人,分为局部配置(当前仓库)和全局配置(所有仓库)。
1
2
3
4
5
6
7
8
# 查看仓库配置信息
git config --list
# 设置仓库的用户名和邮箱
git config user.name lisi
git config user.email 1234@qq.com
# 全局配置用户名和邮箱
git config --global user.name lisi
git config --global user.email 1234@qq.com

3.忽视不需要管理的文件

​ 项目中部分文件无需版本管理(日志、缓存、配置密钥、编译文件),可通过.gitignore文件忽略,Git不会追踪、提交该类文件。

(1)创建方式

  • 项目根目录右键打开Git Bash,执行指令创建文件:touch .gitignore

(2)常用忽略规则(直接写入文件生效)

1
2
3
4
5
6
7
8
9
10
11
# 忽略所有txt后缀文件
*.txt
# 忽略指定文件夹
node_modules/
dist/
build/
# 忽略日志文件
*.log
# 忽略系统隐藏文件
.DS_Store
.git

四、分支

分支是Git核心功能,支持多分支并行开发,主干分支稳定迭代,功能分支独立开发、测试,完成后合并至主干,互不干扰,极大降低团队开发冲突概率。

1.常用分支指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1.分支查看和创建
git branch # 列出所有本地分支
git branch -r # 列出所有远程分支
git branch [分支名] # 在当前分支上添加分支(不切换到新分支)
git branch -f [移动的分支名] [目的的分支名] # 强制从一个分支移动到另一个分支的位置
# 2.删除分支(不能删除当前分支,只能删除其他分支)
git branch -d [分支名] # 删除分支时,需要做各种检查
git branch -D [分支名] # 不做任何检查,强制删除
# 3.切换分支(head表示当前所在分支)
git checkout [分支名] # 切换分支
git checkout -b [分支名] # 创建并切换到新分支
# 4.合并分支
# 一般需要切换当前分支到(head指向)master,再把需要合并的分支合并到master
git merge [分支名] # 当前分支(head指向的分支)与合并分支产生新节点,当前分支(head指向的分支)移动到合并的新节点
# 5.复制分支
git rebase [分支名] # 把当前分支(HEAD指向的分支)复制到另一个分支下
git rebase -i HEAD~<num> # 把当前分支(HEAD指向的分支)的前num个节点复制到第num个节点下
git cherry-pick <num1,num2..> # 把num1,num2节点按其输入顺序复制到当前分支的节点下
# 6.撤销变更
# 在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的。为了撤销更改并分享给别人,我们需要使用 git revert。
git reset HEAD~1 # 当前分支撤销回上一个节点(不生成新节点)
git reset --hard [commit_id] # 将本地仓库回退到本次提交(我选的是最近一次提交的版本id,当然可以是任何一个id)
git revert HEAD # 在撤销的节点c2下产生新的节点c2,c2更改刚好是用来撤销 C2 这个提交的。

2.分支冲突(conflict)

多人协同开发时,多个分支修改了同一个文件的同一行代码,合并分支时Git无法自动判断保留哪份代码,即产生分支冲突(conflict),是团队开发最常见问题。

  • 对于同一个文件,如果有多个分支需要合并时,容易出现冲突。
  • 合并分支时,如果出现冲突,只能手动处理,再次提交,一般的作法,把自己的代码放到冲突代码的后面即可。

3.解决冲突

  1. 发现冲突:执行git merge后终端提示CONFLICT,合并中断;
  2. 打开冲突文件:文件中会出现冲突标记,<<<<<<< 与 ======= 分隔线上方为当前分支(主干)代码,======= 与 >>>>>>> 之间为待合并分支代码;
  3. 手动修改代码:删除冲突标记,保留最终需要的代码(先协商、再确定是保留单方或整合双方代码);
  4. 重新提交:修改完成后,执行git add . → git commit -m “解决xx分支合并冲突”;
  5. 完成合并:冲突解决,分支合并完成。

五、Git远程仓库

本地仓库仅自己可见,通过Gitee/GitHub远程仓库,可实现代码云端备份、多人协同开发、跨设备同步代码。以下以Gitee为例完整实操。

1.远程仓库搭建

第一步:Gitee创建空仓库

  1. 登录Gitee官网(gitee.com),注册并登录账号;
  2. 点击右上角「新建仓库」;
  3. 填写仓库名称、简介,默认私有/公开,不要勾选初始化README(避免冲突),点击创建。

第二步:SSH密钥配置(免密推送代码)

1
2
3
4
5
6
7
# 1. 生成SSH密钥(替换为自己的Gitee邮箱)
ssh-keygen -t rsa -C "你的Gitee邮箱@qq.com"
# 全程回车,无需输入任何内容,自动生成密钥文件
# 2. 查看并复制公钥
cat ~/.ssh/id_rsa.pub
# 3. 验证密钥是否配置成功
ssh -T git@gitee.com

第三步:Gitee绑定公钥

  1. Gitee官网点击头像 → 设置 → SSH公钥;
  2. 标题自定义(如个人电脑),粘贴刚才复制的公钥内容;
  3. 点击确定,完成绑定。

2.远程仓库指令

(1)远程仓库关联管理

1
2
3
4
5
6
7
8
9
10
# 查看远程仓库
git remote
# 查看远程仓库详细信息
git remote -v
# 添加远程仓库
git remote add [仓库命名] [url]
git remote add origin git@gitee.com:mumulei/studyData.git
# 删除远程仓库
git remote remove [仓库命名]
git remote remove origin

(2)远程项目推送/拉取/克隆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 克隆远程仓库数据
git clone [url]
git clone git@gitee.com:mumulei/studyData.git
# 从远程仓库下拉,不合并
git fetch [仓库名称]
git fetch origin
# 从远程仓库下拉并且合并
git pull [仓库命名] [分支名称]
git pull origin master
# 推送到远程仓库
git push [仓库命名] [分支名称]
git push origin master
# 模拟团队其他成员远程提交
git fakeTeamwork

六、其他指令

(1)git diff

1
2
3
4
# 显示暂存区和工作区的差异
git diff
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]

(2)git apply

1
2
3
4
5
6
# 检测补丁是否适用当前工作区或索引并检测错误
git apply --check a.diff
# 应用该补丁,-p1表示忽略/标识的前导目录,与 patch -p1 < a.diff 命令几乎相似
git apply -p1 a.diff
# 修补程序仅应用于索引
git apply --cached -p1 a.diff

(3)git tag

  • 用于标记项目正式版本(v1.0、v2.0),固定版本节点,方便版本发布与回溯。
1
2
3
4
5
6
7
8
# 为当前版本创建标签
git tag v1.0
# 为指定commit版本创建标签
git tag v1.0 commitID
# 查看所有本地标签
git tag
# 推送标签到远程仓库
git push origin v1.0

七、Git免费实操练习平台

推荐新手沉浸式练习Git分支、合并、变基等操作,可视化界面,零成本实操,快速掌握Git核心逻辑:

练习地址:https://learngitbranching.js.org

练习建议:从入门关卡开始,依次完成提交、分支、合并、cherry-pick、rebase等关卡,全程实操,快速吃透Git核心用法。


八、新手常见问题补充

1. 首次推送报错 fatal: no upstream

解决方案:绑定本地分支与远程分支关联关系,执行:git push -u origin master(首次推送只需一次,后续直接git push)

2. 本地代码覆盖远程代码

强制推送(谨慎使用,仅个人仓库可用,团队仓库禁止):git push -f origin master

3. 放弃本地所有修改,同步远程最新代码

1
2
git fetch origin
git reset --hard origin/master

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 hi@0xxx.top
说说