# GIT ## 1.1 Git的概念 开源的分布式版本控制系统管理 ## 1.2 三个区域的概念 ​ **工作区**:在电脑中可以看到的目录 ​ **暂存区**:临时存储区域,保留文件快照,提交之前保存在此。 ~~~ git add filename # 将单个文件添加到暂存区 git add . # 将工作区中的所有修改添加到暂存区 git status # 查看哪些文件在暂存区中 git commit -m "name" ~~~ ​ **版本库**:每次提交都会保存新的快照,不可变。存放 在.git目录下index文件 ## 1.3 仓库的概念 * 存放所有文件和历史记录 ### 21.4 节点的概念 每次提交产生一个节点 - (提交commit)是仓库中项目某个事件点快照,生成40位哈希值 - 暂存文件 ![](pictures\图片9.png) * 软合并 * 混合合并,新建分支 * 强行合并 ## 1.5 分支的概念 - 开发过程中独立的分流线,本质是一个指向某个可提交的移动指针 - 通过创建分支实现功能开发,然后进行合并 **最好不要在主分支上直接操作** ~~~ bash git branch name #创建分支 git checkout name #切换分支 或/ git switch name git merge new_name #合并分支 git rebase new_name #衍合并分支 ~~~ ### marge 1. 将目标分支的所有提交**打包为单个新的合并**提交 2. 保留原始分支的完整历史记录 3. 创建**新的合并节点**(commit),这个节点有两个父节点 ### rebase 1. 将当前分支的所有提交**按顺序重演**到目标分支的最新提交之后 2. **修改提交历史**:创建全新的提交序列 3. 不会产生合并提交节点 * 只对**本地**未推送的分支使用rebase * 个人分支与主分支同步 出现冲突选择保留与剔除 ### 分支操作 ~~~ bash #相关操作 git branch #查看分支 git branch name #创建分支 git checkout name #切换分支 # 设置上游分支(第一次推送时) git push -u origin 分支名 # 之后就可以简化命令 git pull git push #再次此之前贮藏暂存文件防止冲突 git stash ~~~ 删除分支 ```bash git branch -d 分支名 安全删除(已合并) git branch -D 分支名 强制删除(未合并) ``` ## 1.6 其他 ### 回退版本 ~~~ bash git status git status 哈希值 #回退节点 ~~~ ### 贮藏(Stash) 更改(拉取更新时使用) ~~~ bash # 贮藏所有修改(包括未跟踪文件) git stash -u # 查看贮藏列表 git stash list # 应用最近贮藏(保留贮藏记录) git stash apply # 应用指定贮藏 git stash apply stash@{1} # 应用并删除贮藏(常用 git stash pop # 删除贮藏 git stash drop "stash@{0}" git stash drop 0 ~~~ ### 编写忽略文件(.gitignore) ~~~ bash # 忽略单个文件 config.ini # 忽略整个目录 .vscode/ node_modules/ # 忽略特定类型文件 *.log *.tmp # 忽略特定文件但包含例外 !important.log ~~~ ### 停止追踪 ```bash # 停止跟踪文件,但保留本地文件 git rm --cached # 停止跟踪目录(保留本地目录) git rm -r --cached # 然后提交 git commit -m "停止跟踪" ``` ### 标签 ~~~ bash # 创建轻量标签(无注释) git tag v1.0.0 #删除标签 git tag -d v1.0.0 # 创建附注标签(推荐) git tag -a v1.2.0 -m "稳定版本发布" # 为历史提交打标签 git tag -a v0.9.0 commit_hash -m "历史版本" # 推送标签到远程 git push origin --tags ~~~ ### 补丁 创建补丁 应用补丁 ## 1.7 命令表 ![命令表](pictures/图片1.png) # sourceTree 概念:图形化操作显示 图示 ## 2.1 仓库操作 > 创建本地仓库 > > ![](pictures\图片5.png) > > 选择本地文件夹创建新仓库 > 克隆远程 > > ![](pictures\图片6.png) > > 2. 选择远程url > > ![](pictures\图片26.png) > 关联远程仓库 > > ![](pictures\图片27.png) ## 2.2 节点 ### 提交 ![](pictures\图片28.png) ![](pictures\图片29.png) 未暂存的文件无法提交 ### 重置 > 撤销本地未推送的提交或回退版本**最少选择重置两个节点** > > 双击移动到要重置的节点-->选择重置-->强行重置--->解决冲突-->提交到新的分支上 > > 左边蓝色为新提交分支 > > * 重置之后,需要将以前的分支合并到当前的分支----->并解决冲突就可以了 ![](pictures/图片10.png) ![](pictures/图片30.png) 重置三种模式 | 模式 | 行为 | 1 | | ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | **混合合并** | **保留工作目录中的文件改动**(即本地修改),但重置暂存区到合并前的状态 | 手动控制哪些变更进入暂存区需要仔细审查冲突文件后再决定如何合并
**等效命令**:`git merge --no-commit` + 手动解决 | | **软合并** | **保持所有本地改动** | 保留工作目录和暂存区的所有修改
不自动创建合并提交 | | **强行合并** | **丢弃所有改动过的工作副本** | 彻底丢弃所有未提交的本地修改
强制使用远程分支版本覆盖
**等效命令**:`git reset --hard HEAD` + `git merge` | 1. 混合合并 ![](pictures\图片31.png) 2. 软合并 ![](pictures\图片32.png) ![](pictures\图片33.png) 解决冲突 ![](pictures\图片34.png) 3. 强行合并 ![](pictures\图片35.png) ### 回滚提交 > 撤销某个提交引起的更改 > > 1. 安全撤销 > 2. 精准撤销 > > 它会自己**创建一个节点**,将上次提交的撤销--然后提交 1. 选择分支 2. 右键单击需要撤销的提交 3. 选择回滚提交 ![](pictures\图片11.png) **回滚提交一次只能回滚一个节点**,一次回滚多个节点属于错误操作,会导致出现冲突。 ![](pictures\图片36.png) ``` # 1. 回滚指定提交(生成新节点) git revert 2f3a1b # 2f3a1b 为需要撤销的提交ID # 2. 解决可能的冲突(手动编辑后继续) git add . git revert --continue # 3. 推送到远程仓库 git push origin main ``` ## 2.3 分支操作 ### 新建分支 切换到节点点击图标操作 ![](pictures\图片12.png) ![](pictures\图片37.png) ![](pictures\图片38.png) ### **合并分支** 切换到要合并的主分支,右键索要合并次分支`-->`选择合并 ![](pictures\图片40.png) ![](pictures\图片41.png) ### 删除分支 右键选择删除分支 ![](pictures\图片13.png) #### **删除条件分支** 1. 分支上传到远程分支 2. 分支已经合并 3. 或强行删除分支 否则出现**失败**如下 ![](pictures\图片39.png) ### 切换分支 双击选择要切换的分支 ### 制造冲突 提交合并制造冲突---->出现冲突 ![](pictures\图片14.png) ![](pictures\图片15.png) ### 解决冲突 选择保留内容 ![](pictures\图片16.png) 处理冲突后进行提交 ![](pictures\图片17.png) ### 拉取推送 ![](pictures\图片18.png) | 命令 | 作用本质 | 影响范围 | 典型工作场景 | | :-------------: | :-------------------------------------------------: | :----------------------------------------------------------: | :--------------------------------: | | **`git fetch`** | **单向同步**:从远程下载元数据和对象 | 仅更新 `.git` 中的远程引用 | 安全地检查远程变更而不改变本地代码 | | **`git pull`** | **双向操作**:`fetch` + 自动合并 (`merge`/`rebase`) | 改变工作目录文件和本地分支指针
**自动合并冲突中断工作** | 快速将远程更新整合到本地开发环境 | | **`git push`** | **上传共享**:将本地提交传输到远程仓库 | 更新远程分支指针和提交历史
覆盖他人提交/破坏历史 | 将本地完成的变更发布到中央仓库 | ## 其他 ### 书写忽略文件 * 先停止追踪在忽略意义 * `.gitignore` 文件**只能阻止未追踪文件被添加**,但对**已纳入版本控制的文件完全无效**。 > 假设一个文件已经被追踪,然后你仅仅在.gitignore中添加规则: > > - 该文件会继续存在于Git索引中(即继续被追踪) > - 后续对该文件的修改仍然会被Git检测到 > - 新克隆的仓库仍然会得到这个文件(因为它已在版本历史中) > ```bash # 忽略单个文件 config.ini # 忽略整个目录 .vscode/ node_modules/ # 忽略特定类型文件 *.log *.tmp # 忽略特定文件但包含例外 !important.log ``` ![](pictures\图片42.png) ### 停止跟踪 > ### **核心目的:从版本控制中移除文件** > > 1. **保留本地文件**:文件保留在工作区,但不再被 Git 追踪 > 2. **清理索引区**:从 `.git/index` 中移除文件的跟踪记录 > 3. **激活忽略规则**:让 `.gitignore` 对**已追踪文件**生效 > 4. **优化仓库性能**:减少无效文件占用历史记录 暂存或未暂存都可实现停止追踪 ![](pictures\图片19.png) ### 创建补丁 多选文件创建补丁 ![](pictures\图片25.png) ### 引用补丁 1. **应用分支的1.txt内容与补丁内容完全一致** - **表现**:文件已有"+1"行 - **结果**:补丁应用**成功**(无冲突),文件内容不变(因为补丁要求的变化已存在) 2. **应用分支的1.txt是空的** - **表现**:文件为空(0字节) - **结果**:补丁应用**成功**,文件变为只包含"+1"一行(从空文件追加) 3. **应用分支的1.txt内容与补丁内容部分一致** - **表现**:文件已有其他内容(如"abc"),但**没有**"+1"行 - **结果**:补丁应用**成功**,文件在原有内容末尾追加"+1"行 4. **应用分支没有1.txt这个文件** - **表现**:文件不存在 - **结果**:补丁应用**失败**(因找不到目标文件),需要先创建该文件 ### 贮藏 对已暂存的内容进行贮藏 ![](pictures\图片23.png) ![](pictures\图片43.png) 右键贮藏内容可实现应用和删除 | 使用场景 | 简介 | | ------------------ | ------------------------------------------------------------ | | 紧急切换分支 | 需紧急修复生产环境 bug
当前功能开发未完成无法提交 | | **同步远程更新** | 拉取远程更新前存在未提交修改
需保持工作目录清洁 | | **跨分支重用代码** | 避免重复编码,实现代码跨分支复用
在**A分支**贮藏修改,**切换到B分支**应用分支 | ### 丢弃 **放弃未提交的更改** | 操作 | 效果 | 场景 | | ------------------ | -------------------------------- | ----------------------------------------------------- | | **丢弃工作区修改** | 文件恢复到最近一次提交的状态 | 实验性代码失败后快速回退
误修改重要文件需要还原 | | **丢弃暂存区修改** | 文件保留在工作区但变为未暂存状态 | 误添加了不应提交的文件
需要拆分提交内容时 | | **丢弃未跟踪文件** | 永久删除未被 Git 管理的文件 | 清理编译生成的临时文件
移除错误创建的垃圾文件 | ![](pictures\图片46.png) ### 移除 | 操作 | 内容 | 场景 | | ---------------------- | ------------------ | ------------------------------------------------------------ | | **从版本控制移除文件** | 保留本地 | 误提交敏感文件(`.env`, `*.key`)
无需版本控制的配置文件 | | **彻底删除文件** | **删除 本地+版本** | 清理编译产物或临时文件
移除已废弃的组件 | | 清除未追踪文件 | | 操作不可逆!会永久删除文件系统文件 | ![](pictures\图片47.png) +++ ![](pictures\图片48.png) +++ ![](pictures\图片49.png) ### 创建标签 > 标签(Tag)是 Git 中用于**永久标记重要历史节点**的核心功能,常用于版本发布、里程碑记录等场景。 > > 1. **版本快照锚点**:为特定提交(如 `v1.0.0`)创建不可变引用 > 2. **生产部署基准**:标记已通过测试的稳定版本 > 3. **历史节点保护**:防止关键提交被重置操作丢失 > 4. **文档关联媒介**:链接代码与版本说明文档 跳转到目标节点 然后实现**相应节点**添加标签 ![](pictures\图片20.png) +++ ![](pictures\图片50.png) ### 删除标签 ![](pictures\图片53.png) ![](pictures\图片54.png)![](pictures\图片55.png)