git(带流程图)

Git 全面学习笔记

一、Git 基础概念

1.1 什么是 Git?

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。它能记录文件的历史变更,方便多人协作开发,同时支持离线工作,核心特点包括:

  • 分布式:每个开发者都拥有完整的代码仓库副本,无需依赖中央服务器

  • 版本控制:追踪文件每一次修改,可随时回滚到历史版本

  • 分支管理:轻量级分支操作,支持并行开发与功能隔离

1.2 核心工作区域

Git 工作流程涉及四个核心区域,文件在这些区域间流转:

  1. 工作区 (Working Directory):实际操作的文件目录,日常编辑的文件存放于此

  2. 暂存区 (Stage/Index):通过 add 临时存放待提交的修改,相当于 "变更缓冲区"

  3. 本地仓库 (Local Repository):存储完整的版本历史,通过 commit 命令将暂存区内容提交至此

  4. 远程仓库(Remote Repository):托管在服务器上的仓库(如 GitHub、GitLab),用于团队协作共享

二、Git 环境配置

2.1 安装 Git

  • Windows:从 Git 官网 下载安装包,勾选 "Git Bash Here" 方便右键调用
  • macOS:使用 Homebrew 安装 brew install git,或通过官网下载
  • Linux:Debian 系列 sudo apt-get install git,RedHat 系列 sudo yum install git

2.2 基础配置(首次使用必做)

bash 复制代码
# 配置用户名(与远程仓库账号一致)
git config --global user.name "Your Name"
# 配置邮箱(与远程仓库绑定邮箱一致)
git config --global user.email "your.email@example.com"
# 查看配置信息
git config --list

三、Git 仓库操作(初始化与克隆)

命令 作用 示例
git init 在当前目录初始化本地仓库 git init my-project
git clone <url> 克隆远程仓库到本地 git clone github.com/username/re...
git clone <url> <name> 克隆并自定义本地仓库名 git clone github.com/username/re... my-repo

四、文件状态管理与撤销操作

4.1 查看文件状态

bash 复制代码
# 查看详细状态(显示已修改/未跟踪/已暂存文件)
git status
# 简化状态显示(红色:修改未暂存;绿色:已暂存)
git status -s
# 查看文件修改详情
git diff

4.2 add 暂存与 commit 提交

bash 复制代码
# 将单个文件添加到暂存区
git add filename.txt
# 将当前目录所有修改添加到暂存区
git add .
# 将暂存区内容提交到本地仓库(必须填写提交信息)
git commit -m "feat: 新增用户登录功能"
# 跳过暂存区,直接提交已跟踪文件的修改
git commit -a -m "fix: 修复登录表单验证bug"
# 修改最近一次提交(适用于补充修改或修正提交信息)
git commit --amend

4.3 撤销操作

bash 复制代码
# 撤销工作区修改(未暂存的文件,谨慎使用!会丢失未提交修改)
git checkout -- filename.txt
# 撤销暂存区修改(将文件从暂存区放回工作区)
git reset HEAD filename.txt
# 删除文件并暂存删除操作
git rm <文件名>
# 保留文件并暂存删除操作
git rm --cached <文件名>
# 移动/重命名文件并暂存修改
git mv <旧文件名> <新文件名>
# 撤销提交(只撤commit,保留add)
git reset HEAD~ --soft
# 撤销提交(撤commit和add,保留代码)
git reset HEAD~
# 撤销提交(全部撤回上次提交)
git reset HEAD~ --hard

4.4 reset 命令与 HEAD 引用

4.4.1 HEAD 引用说明
  • HEAD:指向当前分支的最新提交

  • HEAD~:上一个提交,HEAD~~ 上上个提交,以此类推

    • 可简写为HEAD~n:往前第 n 个提交
4.4.2 git reset 的三种模式
bash 复制代码
# --soft:仅移动 HEAD,暂存区和工作区不变
git reset --soft <提交ID/HEAD引用>
# --mixed(默认):移动 HEAD,重置暂存区,工作区不变
git reset <提交ID/HEAD引用>
# --hard:移动 HEAD,重置暂存区和工作区(慎用,会丢失未提交修改)
git reset --hard <提交ID/HEAD引用>

五、提交流程与历史查看

5.1 完整提交流程

  1. 查看修改:git status

  2. 暂存文件:git add <文件名>git add .

  3. 提交到本地仓库:git commit -m "提交说明"

  4. 补充提交(修正上一次提交):git commit --amend

正向详细流程图(不涉及reset等回退):

stateDiagram-v2 [*] --> 未跟踪 : 新建文件 [*] --> 暂存未修改 : git clone克隆/git fetch拉取代码 state 工作区 { 已修改 未跟踪 } state 暂存区 { 暂存未修改 已暂存 } state 本地仓库 { 已提交 } # 暂存区 → 仓库 已提交 --> 暂存未修改 : 提交后自动转变 已暂存 --> 已提交 : git commit -m '说明' 已修改 --> 已提交 : git commit -a -m '说明' # 工作区 → 暂存区(单向箭头,无交叉) 已修改 --> 已暂存 : git add <文件> 未跟踪 --> 已暂存 : git add <文件> 暂存未修改 --> 已修改 : 手动编辑

正向简要图(不涉及reset):

stateDiagram-v2 direction LR [*] --> 未跟踪 : 新建文件 [*] --> 暂存未修改 : 克隆/拉取代码 已提交 --> 暂存未修改 : 提交后自动转变 已暂存 --> 已提交 : git commit -m '说明' 已修改 --> 已提交 : git commit -a -m '说明' # 工作区 → 暂存区(单向箭头,无交叉) 已修改 --> 已暂存 : git add <文件> 未跟踪 --> 已暂存 : git add <文件> 暂存未修改 --> 已修改 : 手动编辑

5.2 查看提交历史

bash 复制代码
# 查看完整提交历史(按时间倒序,最新在前)
git log
# 简化显示(只显示版本号前7位和提交信息)
git log --oneline
# 显示所有分支的提交
git log --all
# 显示分支合并图
git log --graph
# 查看指定文件的修改历史
git log -p filename.txt
# 查看指定作者的提交记录
git log --author="Your Name"

六、分支管理与冲突解决

6.1 分支基本操作

bash 复制代码
# 查看所有分支(当前分支前带 *)
git branch
# 查看本地+远程所有分支
git branch -a
# 创建新分支
git branch 分支名
# 切换到指定分支
git checkout 分支名
# 创建并切换到新分支(简化写法)
git checkout -b 分支名
# 删除本地分支(需先切换到其他分支)
git branch -d 分支名
# 强制删除未合并的分支(谨慎使用!)
git branch -D 分支名

6.2 分支合并

bash 复制代码
# 1. 切换到目标分支(如主分支)
git checkout main
# 2. 合并指定分支到当前分支(无冲突则直接合并)
git merge feature/login

6.3 冲突解决

  1. git status 查看哪些文件发生冲突

  2. 合并冲突时,文件中会出现 <<<<<<< HEAD(当前分支内容)、=======>>>>>>> 分支名(待合并分支内容)标记

  3. 手动编辑冲突文件,保留需要的代码并删除冲突标记

  4. 暂存修改:git add .

  5. 完成合并:git commit -m "merge: 合并登录功能分支,解决冲突"

七、stash 临时保存工作区

7.1 核心命令

bash 复制代码
# 临时保存工作区修改(可添加备注)
git stash save "备注信息"
# 查看所有 stash 记录
git stash list
# 恢复最近一次 stash 且保留记录
git stash apply

# 可以存多次
# 恢复指定 stash 且保留记录
git stash apply stash@{n}
# 恢复最近一次 stash 并删除记录
git stash pop
# 删除最近一次 stash 记录
git stash drop
# 删除所有 stash 记录
git stash clear

7.2 使用场景

  • 切换分支前,保存当前未提交的修改,避免分支切换冲突
  • 临时拉取远程最新代码,不影响本地正在开发的内容

八、git rebase -i 交互式变基

8.1 核心功能(优化提交历史)

bash 复制代码
# 操作最近 n 个提交(n 为具体数字)
git rebase -i HEAD~n
  • 压缩提交:将多个提交合并为一个 ,把行首 pick 改为 squashs
  • 编辑提交:修改历史提交的信息 / 内容,把行首 pick 改为 edite,修改后执行 git commit --amendgit rebase --continue
  • 删除提交:移除不需要的历史提交,删除对应行或把 pick 改为 dropd
  • 调整顺序:直接拖动提交行调整顺序,保存后 Git 按新顺序执行

8.2 注意事项

  • 优势:生成线性提交历史,比 merge 更易追踪
  • 禁忌:不要对已推送到远程仓库的提交执行变基

九、远程仓库协作

9.1 远程仓库管理

bash 复制代码
# 查看已配置的远程仓库
git remote
# 查看远程仓库详细信息(包含URL)
git remote -v
# 添加远程仓库(通常命名为 origin)
git remote add 远程名 URL
# 重命名远程仓库
git remote rename <旧别名> <新别名>
# 修改远程仓库URL
git remote set-url 新URL
# 删除远程仓库
git remote rm 远程名

9.2 拉取与推送

bash 复制代码
# 从远程仓库拉取最新代码(不自动合并)
git fetch origin main
# 拉取并合并远程分支到本地当前分支(常用)
git pull origin main

# 首次推送分支到远程仓库(设置上游分支)
git push -u 远程名 分支名
# 后续推送已关联的分支
git push

# 推送本地所有分支到远程
git push --all origin
# 拉取远程分支并创建本地分支
git checkout -b <本地分支名> <远程别名>/<远程分支名>

十、.gitignore 语法与配置

10.1 基础语法规则

  • 注释行:以 # 开头

  • 匹配单个文件:直接写文件名,如 test.txt

  • 匹配目录:以 / 结尾,如 logs/

  • 通配符匹配:

    • *:匹配任意多个字符,如 *.log(所有 log 文件)

    • **:递归通配符,如 **/log/(所有 log 目录)

    • ?:匹配单个字符,如 file?.txt(file1.txt、file2.txt 等)

    • []:匹配括号内任意一个 字符,如 file[12].txt

  • 反向匹配:以 ! 开头,表示不忽略该文件 / 目录,如 !important.log

10.2 .gitignore 示例

plaintext 复制代码
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略 dist 构建目录
dist/
# 忽略特定文件
.env
.DS_Store(macOS系统文件)
Thumbs.db(Windows系统文件)

十一、常见问题与解决方案

11.1 .gitignore 相关问题

  • 问题 1:已提交到仓库的文件,添加到 .gitignore 后不生效解决方案:清除文件缓存并重新提交

    bash 复制代码
    git rm --cached <文件名>
    git commit -m "停止跟踪某文件"
  • 问题 2:需要局部配置 .gitignore,不影响团队共享配置解决方案:在 .git/info/exclude 文件中添加忽略规则,仅对当前本地仓库有效

  • 问题 3:忽略规则不生效解决方案:检查规则语法,或执行 git rm --cached <文件名> 清除缓存

11.2 忘记提交就切换分支

问题:工作区有未提交修改,切换分支时提示 error: Your local changes would be overwritten by checkout解决方法:

  • 方案 1:提交修改后切换分支:git add .git commit -m "temp: 临时提交"git checkout 目标分支
  • 方案 2:用 stash 暂存:git stash → 切换分支完成操作 → 切回原分支 → git stash pop(恢复修改)

11.3 误删本地分支

问题:不小心删除了未合并的本地分支解决方法:

  1. 执行 git reflog 查看操作记录,找到删除分支的最后一次提交 ID
  2. 恢复分支:git checkout -b 恢复的分支名 <commit-id>

11.4 其他注意事项

  • git reset --hard 慎用,会彻底丢失未提交的工作区修改
  • 不要对已推送至远程的提交执行 rebase,避免影响团队协作
相关推荐
Jonathan Star6 小时前
git commit --amend 是 Git 中用于修改最后一次提交的核心命令
前端·chrome·git
超哥归来7 小时前
关闭vscode中git的行历史提示
ide·git·vscode·编辑器
修炼者7 小时前
如何让git识别不到你的文件
git·github
小猪佩奇TONY7 小时前
常用软件工具的使用(1) ---- git 的安装和基础操作
大数据·git·elasticsearch
小猪佩奇TONY7 小时前
常用软件工具的使用(2) ---- git 命令进阶 和 github
git·github
写代码的【黑咖啡】7 小时前
版本控制工具介绍及常用命令:Git 与 SVN 入门指南
git·svn
-借我杀死庸碌的情怀-7 小时前
强制重置本地分支到远程初始状态
git
愈努力俞幸运7 小时前
git,vscode,pycharm
git·vscode·pycharm
jiafuLi20187 小时前
TortoiseGit 和本地 Git 共享 SSH 密钥和用户配置
运维·git·ssh