# Git ## Git的概念 Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 ## 三个区域的概念 * 工作区 就是你平时存放项目代码的地方 * 暂存区 用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息 * 仓库区 存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。 ## 仓库的概念 Git 仓库(Repository)是一个包含项目所有历史版本、元数据和配置信息的目录。它本质上是一个隐藏的`.git`文件夹(位于项目根目录下),其中存储了: - **对象数据库**:保存所有文件的内容快照、提交记录、分支信息等。 - **引用(Refs)**:指向特定提交的指针,如分支(branches)、标签(tags)。 - **配置文件**:存储仓库的设置(如远程仓库地址、用户信息)。 ## 节点的概念 在 Git 中,节点通常指的是版本控制系统中的**提交对象(Commit)**,它是 Git 数据结构中的基本单元。每个提交节点代表项目历史中的一个版本快照,通过有向图的方式形成 Git 的提交历史。 ## 分支的概念 **分支(Branch)** 是版本控制的核心机制之一,它允许你在不干扰主开发线的情况下,并行开发多个特性或修复 bug。 # SourceTree ## SourceTree的概念 SourceTree 是一款由 Atlassian 公司开发的**免费 Git 图形化界面客户端**,旨在帮助开发者更直观、高效地管理 Git 版本控制系统。它通过可视化界面简化了 Git 命令行操作,让复杂的版本控制流程(如分支管理、提交、合并、冲突解决等)变得更易操作,尤其适合 Git 新手或偏好图形化操作的用户。 ## 仓库相关操作 ### 创建本地仓库 点击Create,选中文件夹创建仓库 ![image-20250707164736795](./pictures/image-20250707164736795.png) ### 打开本地仓库 点开上方资源管理器可以打开仓库 ![image-20250707205049305](./pictures/image-20250707205049305.png) ### 克隆远程仓库 1. 先创建远程仓库,点击上方加号创建仓库,取名为GitDemo ![image-20250708082856548](./pictures/image-20250708082856548.png) 2. 复制https的链接 ![image-20250708082947454](./pictures/image-20250708082947454.png) 3. 点击soursetree的Clone,把复制的网址输入进去,并选择要克隆到本地的那个目录 ![image-20250708083410091](./pictures/image-20250708083410091.png) ### 获取 从远程仓库下载所有本地仓库中不存在的提交(commits)和引用(refs),但不会自动合并到当前工作分支。如果需要合并,需要手动marge ```git git fetch ``` ![image-20250708085328450](./pictures/image-20250708085328450.png) 当前还处于上次的分支没有合并 ![image-20250708085714440](./pictures/image-20250708085714440.png) 如果需要合并需要自己手动marge ### 关联远程仓库 1. 创建一个本地仓库 2. 点击远端,添加一个远程仓库 ![image-20250710140922797](./pictures/image-20250710140922797.png) 3. 添加远程URl ![image-20250710141037460](./pictures/image-20250710141037460.png) 4. 点击推送,把本地修改的推送到云端 ![image-20250710141125800](./pictures/image-20250710141125800.png) 5. 去远程仓库发现文件已经推送上去 ![image-20250710141159384](./pictures/image-20250710141159384.png) ## 节点相关操作 ### 提交 当在提交的时候要先拉取一下最新的代码,防止冲突 1. 先在hello.txt里面添加hello weather,然后将其修改的文件暂存到暂存区`git add` ![image-20250708091951015](./pictures/image-20250708091951015.png) 2. 添加要提交的信息,勾上立即推送到变更到origin/master,相当于执行了`git commit && git push ` ### 重置 `git reset` 的三种模式 1. `--soft` 模式 - **操作**:仅移动 HEAD 指针,不改变暂存区和工作区。 - **效果**:提交被取消,但修改仍保留在暂存区(可直接重新提交)。 2. `--mixed` 模式(默认) - **操作**:移动 HEAD 指针,重置暂存区,但保留工作区。 - **效果**:提交被取消,修改回到工作区(需重新 `git add`) 3. `--hard` 模式 - **操作**:移动 HEAD 指针,重置暂存区和工作区。 - **效果**:彻底删除提交,工作区恢复到指定提交的状态(修改会丢失) 软合并为soft 混合合并为mixed 强行合并为hard ![image-20250708100756494](./pictures/image-20250708100756494.png) 1. 当点击混合模式之后,本地仓库会回退到那次修改,但是文件还是存在,需要手动确实是否删除或者保留,我选择直接删除,本地只剩下number.txt,云端上面有两个文件 ![image-20250708101456398](./pictures/image-20250708101456398.png) ![image-20250708101555505](./pictures/image-20250708101555505.png) 当前本地和云端的版本不一致,要强行把本地的推送到云端 ![image-20250708101839909](./pictures/image-20250708101839909.png) 推送完会本地和云端会呈现一致 ![image-20250708101934246](./pictures/image-20250708101934246.png) ### 回滚提交 右键要回滚的版本,选择回滚提交 ![image-20250708102637452](./pictures/image-20250708102637452.png) 点击推送就能把云端的也回滚提交 ![image-20250708102849707](./pictures/image-20250708102849707.png) ## 分支相关操作 ### 新建分支 点击上方的分支就能创建一个分支 ![image-20250708103038424](./pictures/image-20250708103038424.png) ### 切换分支 选择需要切换的分支,直接双击就能切换 ### 合并分支 切换到master分支,选择上面的合并,选择需要合并的分支![image-20250708103311599](./pictures/image-20250708103311599.png) ![image-20250708103337318](./pictures/image-20250708103337318.png) 本地仓库也出现了dev-c.txt ![image-20250708103406873](./pictures/image-20250708103406873.png) ### 删除分支 右键要删除的分支,点击删除 ![image-20250708103454627](./pictures/image-20250708103454627.png) ### 制造冲突 冲突大概就是,两个人修改了相同的一个文件,git不知道那个在前,那个在后,也不知道是否要删除某一处,所有就会发生冲突 1. 先云端修改food.txt添加包子 ![image-20250709082307168](./pictures/image-20250709082307168.png) 2. 本地修改food.txt添加油条 ![image-20250709082358335](./pictures/image-20250709082358335.png) 3. 提交代码到云端显示提交不上去,推送被拒绝是因为远程仓库的`master`分支有本地仓库没有的更新。这一般是由于其他人向相同分支推送了新内容所导致的。 ![image-20250709083313272](./pictures/image-20250709083313272.png) 4. 先尝试拉去一下远端代码 ![image-20250709083423371](./pictures/image-20250709083423371.png) git帮我们标记出了,head是代表本地修改的,=====下面是远端修改的内容 ![image-20250709083501307](./pictures/image-20250709083501307.png) ### 解决冲突 1. 发现冲突,要先去看一下上面的提交id,可以找到这段代码是谁写的,去询问是谁,看代码怎么修改,这边演示以为我的代码为标准,删除远端的代码修改 ![image-20250709084649410](./pictures/image-20250709084649410.png) ![image-20250709084625933](./pictures/image-20250709084625933.png) 2. 去云端看看代码修改情况,发现和本地的一样 ![image-20250709084751683](./pictures/image-20250709084751683.png) ## 其他 ### 书写忽略文件 在sourcetree上面点击`设置`>`高级`>`编辑` * 忽略指定名称文件 ``` //直接写出其名字 config.ini secrets.json ``` * 忽略以什么字符结尾的 ``` //使用通配符 //忽略以.txt文件结尾的 *.txt // 忽略所有 .log 文件 *.log ``` * 忽略整个文件夹 ``` //在文件夹后面加/ # 忽略 logs 目录及其所有内容 logs/ # 忽略 target 目录 target/ ``` ### 停止跟踪 通过修改.gitignore忽视某个文件但是发现这个文件还是会被踪,只对没有被git commit 过的文件有效,也就是说如果你的文件被commit过后你再修改gitignore,这个时候gitignore对这个文件是无效的,这个时候就需要取消对某个文件的跟踪。 添加一个log文件 ![image-20250711124736945](./pictures/image-20250711124736945.png) 2. 这时提交上去,然后添加一个忽略文件,但是修改文件,依然会出现 ![image-20250711130657767](./pictures/image-20250711130657767.png) ![image-20250711130722293](./pictures/image-20250711130722293.png) 3. 需要点击文件选择停止追踪 ![image-20250711131113752](./pictures/image-20250711131113752.png) ### 创建补丁 **创建补丁的原因** 交给客户的版本是2.0版本的,随着公司的发展,项目已经到了3.0。 这时候客户提出了一个bug,我们需要对其进行修复。 因为客户所支付的款项只是到2.0版本的,我们不可能免费给客户升级到3.0版本。 这个时候就可以使用打补丁的方式来提交代码。 项目开发的时候要求一个页面一个代码分支,同时要求代码写完之后要求指定的人来review, 还要求不能向Git分支提交太多次代码,否则分支就会很乱。 这个时候,就可以让开发者将开发完的代码先提交到本地Git仓库,然后将所有的改动都打一个补丁,将补丁发给代码review者。代码review者,将补丁应用到本地的review分支进行代码review。 1. 先将修改的代码,暂存到本地,不提交云端,这里我修改了两处 ![image-20250709091320725](./pictures/image-20250709091320725.png) 2. 点击需要打补丁的节点 选择创建补丁 ![image-20250709091428330](./pictures/image-20250709091428330.png) 3. 点击创建补丁 ![image-20250709091529159](./pictures/image-20250709091529159.png) ### 应用补丁 1. 将分支切换到dev分支 2. 点击上方的`操作`>`应用补丁`并选择补丁的位置 ![image-20250709092357896](./pictures/image-20250709092357896.png) 4. 可以看到补丁已经打到dev分支了,暂存在本地仓库 ![image-20250709092307819](./pictures/image-20250709092307819.png) ### 贮藏 当你现在需要帮同部门的人去改bug,但是自己的还没写完,也可能不想去动自己的本地代码,可以使用贮藏功能 ps 贮藏只会去储藏修改的和被git管理的文件 1. 点击上方的贮藏,添加一个说明语句 ![image-20250711133954769](./pictures/image-20250711133954769.png) 2. 发现工作区间是干净的的,贮藏下面多了一个分支 ![image-20250711134109661](./pictures/image-20250711134109661.png) 3. 当应用贮藏的时候会发现更改的和贮藏的都会保留 ![image-20250711134306193](./pictures/image-20250711134306193.png) ### 丢弃 如上图所示,当需要去除之前写的代码,需要点击丢弃,这里丢弃写的C文件 ![image-20250711134419976](./pictures/image-20250711134419976.png) 丢弃完发现暂存区只剩下C文件 ![image-20250711134517450](./pictures/image-20250711134517450.png) ### 移除 ### 创建标签 在我们开发迭代过程中,会遇到这种情况,当前的版本是1.0.0。但需要找到版本号0.5.0的版本提交时,可能因为时间久远,不能快速定位到当时V0.5.0的提交记录,这个时候我们就需要进行标签管理了。比如我在发布1.0.0时,只需要在这个版本最后一个提交记录上打上标签, ![image-20250709094132166](./pictures/image-20250709094132166.png) ![image-20250709094033231](./pictures/image-20250709094033231.png) ### 删除标签 在左侧标签页可以选择删除标签 ![image-20250709094147028](./pictures/image-20250709094147028.png)