本地Git基础知识文章目录本地Git基础知识初识GitGit核心概念初始配置.bashrc获取本地仓库基础操作指令基础命令**添加文件至忽略列表**分支查看差异变基暂时清空暂存区初识Git为什么需要版本控制器简单来说当我们修改代码后发现程序崩溃想要回到之前的版本时如果没有版本控制工具就只能靠CtrlZ或者祈祷了这时版本控制器就像时光机一样让我们可以自由穿梭在代码的各个版本之间以便我们更好更安全的修改代码版本控制器集中式版本控制SVNCVS分布式版本控制GitGit就是一个分布式版本控制系统由Linux之父Linus Torvalds在2005年创建记录每次文件的改动回到任意历史版本多人协作开发不会互相覆盖代码并行开发功能分支管理互不干扰不同于SVN等集中式版本控制系统Git的分布式架构意味着每个人电脑上都有完整的代码仓库即使服务器挂了你仍然可以本地提交、查看历史离线也能工作有网络时再同步Git会对所有文件内容进行校验和计算使用SHA-1哈希算法保证任何文件改动都会被检测到所以你可以放心只要提交到Git数据就不会丢失或损坏Git GUI Git提供的图形界面工具Git BashGit提供的命令行工具Git核心概念在开始使用Git之前需要理解几个关键概念工作区 → 暂存区 → 版本库(你的文件夹)(准备提交)(永久存储)工作区就是你电脑上能看到的项目文件夹暂存区临时存放你的改动决定哪些改动要提交版本库仓库Git存储所有版本数据的地方Git管理的文件有三种状态已修改(modified)文件改了但还没存到暂存区已暂存(staged)改动的文件已经添加到暂存区等待提交已提交(committed)文件已经安全保存在版本库中初始配置当你第一次安装Git需要先进行一些基本设置才能更好地使用这些配置只需要做一次Git会记住它们Git的每次提交都会记录提交者的信息想象一下团队协作时如果不配置别人就不知道这段代码是谁写的出了问题也不知道找谁。所以第一件事就是告诉Git我是谁”所以我们的第一步就是配置你的基础信息设置用户信息git config –global user.name “”git config –global user.email “”查看配置信息git config –global user.namegit config –global user.email配置有三种级别git config –local只对某个仓库有效git config –global对当前用户所有仓库有效git config –system对系统所有登录的用户有效优先级仓库配置 全局配置 系统配置越具体的配置优先级越高显示config的配置git config –list –localgit config –list –globalgit config –list –system配置文件存在哪里系统配置/etc/gitconfig全局配置~/.gitconfig或~/.config/git/config仓库配置.git/config.bashrc.bashrc是Bash shell 的用户级配置文件默认存放在用户主目录~/.bashrc或C:\Users\你的用户名\.bashrcGit Bash核心作用是每次打开一个新的 Bash 终端窗口 / 会话时自动执行这个文件里的命令帮你定制终端的行为和环境定义别名「等号前后不要有空格」是通用规范#把 ls -l显示详细文件信息简化成 llaliasllls -l#ls -al中-a是显示所有文件包括隐藏文件-l是以长格式显示文件/目录详细信息但不包括隐藏文件-al是显示所有文件的详细详细#常见的隐藏文件以英文句号开头示例.bashrc用户终端配置文件、.gitignoreGit 忽略规则文件、.sshSSH 密钥目录#输出git提交日志aliasgit-loggit log --prettyoneline --all --graph --abbrev-commit#把 rm 增加安全提示避免误删aliasrmrm -i#自定义 Git 快捷命令aliasgpullgit pullaliasgpushgit push配置环境变量#解决乱码问题gitconfig--globalcore.quotepathfalse#添加自定义程序路径让系统能找到你的程序exportPATH$PATH:/home/你的用户名/my_program#设置 Python 虚拟环境默认路径exportWORKON_HOME~/.virtualenvs#设置终端编码避免中文乱码exportLC_ALLen_US.UTF-8配置PATH后你不用输完整路径就能运行自己写的脚本 / 程序定制终端外观#自定义提示符显示「用户名主机名 路径 $」PS1\u\h \w $修改后终端提示符会从默认的$变成xxxxxx ~/code $更直观自动执行初始化命令#自动进入常用工作目录cd~/projects#自动激活 Python 虚拟环境source~/.venv/bin/activate#显示欢迎语/系统信息echo欢迎回来当前目录$(pwd)每次打开终端自动运行指定命令获取本地仓库在电脑任意位置创建一个空目录作为本地Git仓库进入目录右键打开Git Bash窗口执行命令git init创建成功后可在文件夹看到隐藏git目录Git 仓库本质上就是一个「包含了.git 隐藏目录的文件夹」核心结论Git 仓库 文件夹 .git 隐藏目录这些都是初始化成功后.git隐藏目录里的文件⚠️注意这里的config是本地配置由于没有单独配置所以只有【core】核心配置没有【user】段落全局配置在~/.gitconfig文件里reference引用它是一个指向 Git 提交记录commit的 “指针”相当于一个方便人类记忆的别名让你不用记住一串长长的提交哈希值比如a1b2c3d...而是用一个简单的名字比如main、dev来定位到最新的代码版本所以整句话的意思是当前HEAD指针正指向本地main分支的最新提交基础操作指令基础命令git add 添加到暂存区git status 查看状态git commit -m “备注” 提交git commit -amend 修改提交的messagegit commit -am “” 提交这是-a和-m的组合参数用于快速提交mmessage直接附带提交信息不进入编辑器aall自动暂存所有已跟踪文件的修改不包括新文件git mv 文件名 新文件名gitk 打开当前仓库的图形历史视图 --all 查看所有分支的历史git loggit log –all 显示所有分支git log –prettyoneline 将提交的信息显示为一行git log –abbrev-commit 使得输出的commit更简短git log –graph 以图的形式显示git log –decorate (mac新版参数)git reset –hard commitID 版本切换git reset HEAD 把所有暂存区恢复到工作区git checkout — 把工作区恢复成暂存区git reset HEAD — 把部分暂存区恢复到工作区git reflog 记录所有操作当你回退后clear终端后可以用这个命令分析出你回退前的版本号再进行回退git cat-file -t 对象id查看 Git 仓库中「所有底层对象」的内容 / 类型 / 大小.Git 的核心底层原理 → 【万物皆对象】Git 底层命令Git 所有上层命令git add/git commit/git branch最终都是基于它实现的「对象 ID」就是之前在 git branch -av / git log 里看到的 一串 40 位的哈希值commit idGit 里叫 SHA-1 值可以简写前 4-6 位即可Git 能自动识别✅tag → 标签对象打标签时生成比如发布版本 git tag v1.0开发中用的少暂时不用管✅commit → 提交对象每一次 git commit 都会生成 1 个 commit 对象记录「本次提交的版本信息」✅tree → 目录对象所有文件夹 / 目录都是 tree 对象比如你的 docs文件夹、仓库根目录✅blob → 文件对象所有被 Git 追踪的文件内容都是 blob 对象比如你的 README.md、笔记.txt)-t → 全称 --type核心作用查看 Git 对象的【类型】-t(查类型) -s(查大小) -p(查内容)find .git/objects -type fLinux命令搜索目录.git/objects这是 Git 仓库的核心数据库目录—— 「blob 文件对象、tree 目录对象、commit 提交对象、tag 标签对象」所有 Git 对象最终都会以文件的形式保存在这个目录里type→ 筛选「文件 / 文件夹的类型」f→ 是file的缩写代表普通文件 (regular file)如果写-type d→d是directory缩写代表「文件夹」添加文件至忽略列表可以在工作目录里创建一个名为**.gitignore**的文件文 件名固定在里面列出忽略的文件模式# no .a files*.a# but do track lib.a, even though you are ignoring .a files above!lib.a# only ignore the TODO file in the current directory,not subdir /TODO/TODO# ignore all files in the build/directorybuild/# ignore doc/notes.txt, but not doc/server/arch.txtdoc/*.txt#ignore all .pdf files in the doc/ directorydoc/**/*.pdf分支git branch 查看分支git branch -av 是-a-v简称-a是–all指查看所有分支包括远程分支-v是– verbose指显示详细信息git branch 分支名 创建分支git checkout 分支名HEAD指向当前分支 移动分支git checkout -b 分支名 创建并立即切换到新分支git checkout 4a2b3c0 当后面是提交哈希值的情况下也是移动但会进入分离头指 针的状态分离头指针简单来说就是你的当前工作目录没有指向一个具体的分支而是直接指向了某次具体的提交在这种状态下操作主要影响体现在提交与保存方面如果进行新的提交新提交可以正常创建但它们不属于任何分支。切换分支时的风险如果你此时切换到其他分支如git checkout main新提交就会变得很难找到。因为没有任何分支指向它们它们最终可能会被 Git 的垃圾回收机制清理掉它主要用于临时操作而非长期开发临时查看想查看历史中某个旧版本的代码或者验证一个 Bug 是否在特定版本存在。实验性修改只想做一些临时尝试不打算长期保存如果身处该状态但发现修改很重要立即创建一个新分支即可保护它们在 Git 里提交是否安全不取决于它在哪而取决于有没有引用分支/标签指向它git merge 分支名 合并分支git branch -d 分支名 删除分支需要做各种检查git branch -D 分支名 强制删除冲突如果同时修改了同一个文件的同一行就要手动解决冲突开发分支规范master生产分支develop开发分支feature/xxxx分支hotfix/xxxx分支查看差异git diff 查看工作目录和暂存区的差异git diff --cached / git diff --staged 查看暂存区和上次提交的差异git diff abc123 def456 查看两次提交之间的差异git diff HEAD 看当前文件和上一次提交的区别 HEAD~2 / HEAD^^ 查看当前文件和上上次 的区别diff--gita/index.js b/index.js index1234567..89abcde100644--- a/index.js // --- 表示旧版本 b/index.js // 表示新版本 -1,4 1,4 // 表示改动位置 console.log(开始);-letx10;// - 表示删除的行 let x20;// 表示添加的行 console.log(结束);变基把一系列提交从一个基础移动到另一个基础交互式rebase整理提交历史git rebase -i 哈希值. 我们最好选择要进行变基提交的父亲接下来就会出现一个交互界面下面的注释会提示你做变更的命令信息只需要将上面的命令进行修改即可比如下面就是正在修改提交信息的message 在这里我们只修改前面的pick命令接下来会弹出新的交互面执行你要的操作最后保存退出即可暂时清空暂存区当我们临时需要处理其他任务时我们需要把现在的工作区放在一边就可以用如下命令git stash可以看到执行这个命令之后我们的工作区很干净这个时候就可以去处理你的紧急任务了git stash apply该命令可以让之前工作区重新拿出来并且stash列表里不会删除记录git stash pop 这个会让stash列表里的一并清除