| @@ -0,0 +1,592 @@ | |||
| # SourceTree 速成速查 | |||
| 目的:快速掌握 Git 基础概念和 SourceTree 常用操作,能够完成基础学习中的代码管理考核。 | |||
| ## 1. Git 基础概念 | |||
| ### 1.1 Git 是什么 | |||
| Git 是一个分布式版本控制工具,用来记录代码每一次修改,方便回退、对比、分支开发和多人协作。 | |||
| 一句话: | |||
| > Git 负责记录代码历史,SourceTree 是 Git 的图形化操作工具。 | |||
| ### 1.2 三个区域 | |||
| | 区域 | 含义 | SourceTree 中的表现 | | |||
| | --- | --- | --- | | |||
| | 工作区 | 当前正在编辑的文件 | 未暂存文件 | | |||
| | 暂存区 | 准备提交的文件 | 已暂存文件 | | |||
| | 本地仓库 | 已经提交保存的历史记录 | History/日志中的提交节点 | | |||
| 常用流程: | |||
| ```text | |||
| 修改文件 -> 暂存 -> 提交 -> 推送 | |||
| ``` | |||
| ### 1.3 仓库 | |||
| 仓库是 Git 管理代码历史的目录,里面有一个隐藏的 `.git` 文件夹。 | |||
| - 本地仓库:自己电脑上的仓库。 | |||
| - 远程仓库:服务器上的仓库,例如 Gitea、GitLab、GitHub。 | |||
| 注意: | |||
| > 不要手动删除 `.git` 文件夹,否则仓库历史会丢失。 | |||
| ### 1.4 节点 | |||
| 节点就是一次提交记录,也叫 commit。 | |||
| 每个节点通常包含: | |||
| - 修改内容。 | |||
| - 提交人。 | |||
| - 提交时间。 | |||
| - 提交说明。 | |||
| - 唯一提交号。 | |||
| ### 1.5 分支 | |||
| 分支是独立开发线,用于在不影响主线的情况下开发功能。 | |||
| 常见分支: | |||
| - `master/main`:主分支。 | |||
| - `dev`:开发分支。 | |||
| - `feature_xxx`:功能分支。 | |||
| 一句话: | |||
| > 分支用于并行开发,合并用于把一个分支的修改整合到另一个分支。 | |||
| ## 2. SourceTree 基础概念 | |||
| SourceTree 是 Atlassian 提供的 Git 图形化工具,可以通过界面完成提交、分支、合并、拉取、推送、补丁、贮藏等操作。 | |||
| 常见区域: | |||
| | 区域 | 作用 | | |||
| | --- | --- | | |||
| | 文件状态 | 查看工作区和暂存区文件 | | |||
| | History/日志 | 查看提交节点历史 | | |||
| | 分支 | 查看和切换分支 | | |||
| | 远端 | 查看远程仓库分支 | | |||
| | 工具栏 | 提交、拉取、推送、获取、分支、合并等 | | |||
| ## 3. 仓库相关操作 | |||
| ### 3.1 创建本地仓库 | |||
| 作用:把一个普通文件夹变成 Git 仓库。 | |||
| 操作: | |||
| 1. 打开 SourceTree。 | |||
| 2. 点击 `创建`。 | |||
| 3. 选择本地路径。 | |||
| 4. 点击创建。 | |||
| 结果: | |||
| ```text | |||
| 目录中生成 .git 文件夹 | |||
| ``` | |||
| ### 3.2 打开本地仓库 | |||
| 作用:把已有 Git 仓库加入 SourceTree 管理。 | |||
| 操作: | |||
| 1. 点击 `添加` 或 `打开`。 | |||
| 2. 选择本地仓库目录。 | |||
| 3. 打开后即可查看提交历史和文件状态。 | |||
| ### 3.3 克隆远程仓库 | |||
| 作用:第一次从远程仓库完整下载代码和历史。 | |||
| 操作: | |||
| 1. 点击 `克隆`。 | |||
| 2. 填写远程仓库地址。 | |||
| 3. 选择本地保存路径。 | |||
| 4. 点击克隆。 | |||
| 一句话: | |||
| > 克隆是第一次把远程仓库完整复制到本地。 | |||
| ### 3.4 获取 Fetch | |||
| 作用:只获取远程最新提交信息,不自动修改本地工作文件。 | |||
| 理解: | |||
| ```text | |||
| Fetch = 看远程有没有新东西 | |||
| ``` | |||
| 适用场景: | |||
| - 想先看看远程有没有更新。 | |||
| - 不想立刻合并到本地。 | |||
| ### 3.5 关联远程仓库 | |||
| 作用:让本地仓库知道要连接哪个远程仓库。 | |||
| 操作: | |||
| 1. 打开仓库设置。 | |||
| 2. 添加远程仓库。 | |||
| 3. 名称通常写 `origin`。 | |||
| 4. URL 填远程仓库地址。 | |||
| 常用命令理解: | |||
| ```bash | |||
| git remote add origin 仓库地址 | |||
| ``` | |||
| ## 4. 节点相关操作 | |||
| ### 4.1 提交 Commit | |||
| 作用:把暂存区内容保存成一个提交节点。 | |||
| 操作: | |||
| 1. 修改文件。 | |||
| 2. 在文件状态中勾选或点击暂存。 | |||
| 3. 写提交说明。 | |||
| 4. 点击提交。 | |||
| 提交说明建议: | |||
| ```text | |||
| docs: update markdown note | |||
| fix: correct add function | |||
| feat: add login module | |||
| ``` | |||
| ### 4.2 重置 Reset | |||
| 作用:把当前分支指针移动到某个历史提交。 | |||
| 常见类型: | |||
| | 类型 | 含义 | | |||
| | --- | --- | | |||
| | Soft | 保留修改到暂存区 | | |||
| | Mixed | 保留修改到工作区 | | |||
| | Hard | 丢弃提交后的修改,风险最高 | | |||
| 考核记忆: | |||
| > 重置是改变当前分支指向,Hard Reset 会丢修改,操作前要确认。 | |||
| ### 4.3 回滚提交 Revert | |||
| 作用:生成一个新的反向提交,用来抵消某次提交。 | |||
| 示例: | |||
| ```text | |||
| A -> B -> C | |||
| ``` | |||
| 如果 B 有问题,对 B 执行回滚后: | |||
| ```text | |||
| A -> B -> C -> D | |||
| ``` | |||
| D 是新的反向提交,用来撤销 B 的修改。 | |||
| 重置和回滚区别: | |||
| | 操作 | 是否新增提交 | 是否改历史 | | |||
| | --- | --- | --- | | |||
| | Reset | 不新增 | 会改变分支指针 | | |||
| | Revert | 新增反向提交 | 不破坏已有历史 | | |||
| ## 5. 分支相关操作 | |||
| ### 5.1 新建分支 | |||
| 作用:从当前节点创建一条新的开发线。 | |||
| 操作: | |||
| 1. 点击 `分支`。 | |||
| 2. 输入分支名,例如 `feature/add-calc`。 | |||
| 3. 点击创建。 | |||
| ### 5.2 切换分支 | |||
| 作用:切换到另一条开发线。 | |||
| 操作: | |||
| 1. 在左侧分支列表选择目标分支。 | |||
| 2. 双击或右键检出。 | |||
| 注意: | |||
| > 如果当前工作区有未提交修改,切换分支可能失败,需要先提交、贮藏或丢弃。 | |||
| ### 5.3 合并分支 | |||
| 作用:把另一个分支的修改合并到当前分支。 | |||
| 操作: | |||
| 1. 先切换到接收修改的分支,例如 `master`。 | |||
| 2. 点击 `合并`。 | |||
| 3. 选择要合并进来的分支。 | |||
| 4. 确认合并。 | |||
| 一句话: | |||
| > 站在哪个分支上执行合并,修改就合并到哪个分支。 | |||
| ### 5.4 删除分支 | |||
| 作用:删除不再需要的分支。 | |||
| 操作: | |||
| 1. 右键目标分支。 | |||
| 2. 选择删除分支。 | |||
| 注意: | |||
| - 不要删除当前正在使用的分支。 | |||
| - 删除前确认分支内容已经合并或不再需要。 | |||
| ### 5.5 制造冲突 | |||
| 冲突通常发生在两个分支修改了同一个文件的同一位置。 | |||
| 练习方式: | |||
| 1. 在 `master` 修改 `README.md` 某一行并提交。 | |||
| 2. 在 `feature` 修改同一行并提交。 | |||
| 3. 切回 `master` 合并 `feature`。 | |||
| 4. 出现冲突。 | |||
| ### 5.6 解决冲突 | |||
| 操作: | |||
| 1. 打开冲突文件。 | |||
| 2. 找到冲突标记。 | |||
| 3. 手动保留正确内容。 | |||
| 4. 删除冲突标记。 | |||
| 5. 标记为已解决。 | |||
| 6. 提交合并结果。 | |||
| 冲突标记示例: | |||
| ```text | |||
| <<<<<<< HEAD | |||
| 当前分支内容 | |||
| ======= | |||
| 被合并分支内容 | |||
| >>>>>>> feature | |||
| ``` | |||
| ### 5.7 拉取 Pull | |||
| 作用:获取远程更新并合并到当前分支。 | |||
| 理解: | |||
| ```text | |||
| Pull = Fetch + Merge | |||
| ``` | |||
| 适用场景: | |||
| - 同步远程最新代码。 | |||
| - 推送前先确认本地不是落后的旧版本。 | |||
| 注意: | |||
| > 拉取不会无脑覆盖你的新代码。如果同一位置有冲突,需要你手动解决。 | |||
| ### 5.8 推送 Push | |||
| 作用:把本地提交上传到远程仓库。 | |||
| 操作: | |||
| 1. 本地完成提交。 | |||
| 2. 点击 `推送`。 | |||
| 3. 选择要推送的分支。 | |||
| 4. 确认推送。 | |||
| 注意: | |||
| - 没有提交的工作区修改不能直接推送。 | |||
| - 本地落后远程时,通常需要先拉取或变基。 | |||
| ## 6. 其他常用操作 | |||
| ### 6.1 书写忽略文件 | |||
| `.gitignore` 用于指定哪些文件不需要 Git 管理。 | |||
| 示例: | |||
| ```gitignore | |||
| Debug/ | |||
| Release/ | |||
| *.obj | |||
| *.exe | |||
| *.log | |||
| .vs/ | |||
| ``` | |||
| 注意: | |||
| > `.gitignore` 只对未被跟踪的文件自动生效;已经提交过的文件需要停止跟踪。 | |||
| ### 6.2 停止跟踪 | |||
| 作用:文件已经被 Git 管理,后来不想继续让 Git 管理,但本地文件还保留。 | |||
| 命令理解: | |||
| ```bash | |||
| git rm --cached 文件名 | |||
| ``` | |||
| 适用场景: | |||
| - 误把编译输出文件提交进仓库。 | |||
| - 后来才把文件加入 `.gitignore`。 | |||
| ### 6.3 创建补丁方式一:工作区补丁 | |||
| 作用:把当前未提交修改导出成补丁文件。 | |||
| 适用场景: | |||
| - 不想提交,但想把修改发给别人。 | |||
| - 想把当前修改临时保存成文件。 | |||
| 命令理解: | |||
| ```bash | |||
| git diff > working-tree.patch | |||
| ``` | |||
| 注意: | |||
| > 新建的未跟踪文件需要先暂存,普通工作区补丁才容易包含它。 | |||
| ### 6.4 创建补丁方式二:提交补丁 | |||
| 作用:把某次提交导出成补丁文件。 | |||
| 命令理解: | |||
| ```bash | |||
| git format-patch -1 HEAD | |||
| ``` | |||
| 特点: | |||
| - 会包含提交作者、时间、提交说明。 | |||
| - 适合把某个提交发给别人应用。 | |||
| ### 6.5 应用补丁方式一:git apply | |||
| 作用:只应用补丁里的文件修改,不自动生成提交。 | |||
| 命令理解: | |||
| ```bash | |||
| git apply working-tree.patch | |||
| ``` | |||
| 适用场景: | |||
| - 只想把别人改的内容应用到当前工作区。 | |||
| - 应用后自己检查,再决定是否提交。 | |||
| ### 6.6 应用补丁方式二:git am | |||
| 作用:应用 `format-patch` 生成的提交补丁,并尽量保留原提交信息。 | |||
| 命令理解: | |||
| ```bash | |||
| git am 0001-xxx.patch | |||
| ``` | |||
| 适用场景: | |||
| - 别人发来的是提交补丁。 | |||
| - 希望保留原提交说明和作者信息。 | |||
| 补丁注意事项: | |||
| > 补丁不是完整文件,而是修改差异。应用补丁时,当前代码和补丁生成时的上下文要接近,否则可能失败或生成 `.rej` 文件。 | |||
| ### 6.7 贮藏 Stash | |||
| 作用:临时保存当前未提交修改,让工作区变干净。 | |||
| 适用场景: | |||
| - 当前改了一半,需要临时切换分支。 | |||
| - 不想提交半成品代码。 | |||
| 常见流程: | |||
| ```text | |||
| 贮藏 -> 切换分支处理事情 -> 回来应用贮藏 | |||
| ``` | |||
| ### 6.8 丢弃 Discard | |||
| 作用:丢弃工作区未提交修改。 | |||
| 注意: | |||
| > 丢弃后修改通常很难找回,操作前确认不要这些改动。 | |||
| 适用场景: | |||
| - 文件改错了,想恢复到上一次提交状态。 | |||
| - 临时调试内容不需要保留。 | |||
| ### 6.9 移除 Remove | |||
| 作用:从仓库中删除文件。 | |||
| 区别: | |||
| | 操作 | 含义 | | |||
| | --- | --- | | |||
| | 丢弃 | 放弃未提交修改 | | |||
| | 移除 | 删除文件并让 Git 记录删除 | | |||
| | 停止跟踪 | Git 不再管理文件,但本地保留 | | |||
| ### 6.10 创建标签 Tag | |||
| 作用:给某个提交节点打一个固定标记。 | |||
| 适用场景: | |||
| - 标记版本发布。 | |||
| - 标记验收节点。 | |||
| 示例: | |||
| ```text | |||
| v1.0 | |||
| basic-learn-done | |||
| ``` | |||
| ### 6.11 删除标签 | |||
| 作用:删除不再需要或打错的标签。 | |||
| 注意: | |||
| - 本地标签和远程标签可能需要分别删除。 | |||
| - 删除前确认标签不再需要。 | |||
| ## 7. 附加知识点 | |||
| ### 7.1 变基 Rebase | |||
| 作用:把当前分支的提交移动到另一个分支最新提交之后,让提交历史更直。 | |||
| 示例: | |||
| ```text | |||
| 合并 Merge:保留分叉和合并节点 | |||
| 变基 Rebase:把提交重新排列到最新节点后面 | |||
| ``` | |||
| 适用场景: | |||
| - 本地功能分支想基于最新主分支继续开发。 | |||
| - 希望提交历史更整洁。 | |||
| 注意: | |||
| > 不要随便对已经推送并被别人使用的公共分支做 rebase,容易影响别人历史。 | |||
| ## 8. 综合最终状态 | |||
| 完成一系列操作后,理想状态是: | |||
| - 工作区干净,没有未提交修改。 | |||
| - 当前分支清楚,例如在 `master` 或 `dev`。 | |||
| - 本地提交已经按要求完成。 | |||
| - 远程仓库已经同步最新提交。 | |||
| - 冲突已经解决。 | |||
| - 不需要的临时文件已经忽略或停止跟踪。 | |||
| - 标签、补丁、贮藏等操作能说明用途和区别。 | |||
| ## 9. SourceTree 常用快捷键 | |||
| 说明:SourceTree 不同版本和系统快捷键可能略有差异,实际以菜单栏显示为准。Windows 中常见规律是 `Ctrl` 对应 macOS 的 `Cmd`。 | |||
| | 功能 | 常用快捷键 | 说明 | | |||
| | --- | --- | --- | | |||
| | 新建/克隆仓库 | `Ctrl + N` | 打开新建或克隆相关入口,具体以版本为准 | | |||
| | 打开仓库 | `Ctrl + O` | 打开已有本地仓库 | | |||
| | 查找 | `Ctrl + F` | 在当前视图中搜索提交、文件或内容 | | |||
| | 刷新 | `F5` | 刷新当前仓库状态 | | |||
| | 提交 | `Ctrl + Enter` | 在提交界面中提交已暂存内容,部分版本支持 | | |||
| | 全选文本 | `Ctrl + A` | 编辑提交说明或文本时全选 | | |||
| | 复制 | `Ctrl + C` | 复制选中内容,例如提交号、文本 | | |||
| | 粘贴 | `Ctrl + V` | 粘贴文本,例如提交说明 | | |||
| | 剪切 | `Ctrl + X` | 剪切文本 | | |||
| | 撤销文本输入 | `Ctrl + Z` | 撤销提交说明等文本输入 | | |||
| | 重做文本输入 | `Ctrl + Y` | 恢复撤销的文本输入 | | |||
| | 切换标签页 | `Ctrl + Tab` | 多仓库标签页之间切换,部分版本支持 | | |||
| | 关闭当前标签页 | `Ctrl + W` | 关闭当前仓库标签页,部分版本支持 | | |||
| 更稳的考核记法: | |||
| - SourceTree 主要考操作流程,不主要考快捷键。 | |||
| - 真实快捷键可以看菜单栏右侧显示。 | |||
| - 不确定快捷键时,直接使用工具栏按钮和右键菜单完成操作。 | |||
| ## 10. 考核速记口诀 | |||
| - Git:记录代码历史。 | |||
| - SourceTree:Git 图形化工具。 | |||
| - 工作区:正在改。 | |||
| - 暂存区:准备提交。 | |||
| - 本地仓库:已经提交。 | |||
| - Fetch:只获取远程信息。 | |||
| - Pull:获取并合并。 | |||
| - Push:上传本地提交。 | |||
| - Commit:生成提交节点。 | |||
| - Reset:移动分支指针。 | |||
| - Revert:新增反向提交。 | |||
| - Branch:分支开发。 | |||
| - Merge:合并分支。 | |||
| - Stash:临时保存未提交修改。 | |||
| - Discard:丢弃未提交修改。 | |||
| - Stop Tracking:停止跟踪但本地保留。 | |||
| - Patch:保存或传递修改差异。 | |||
| - Tag:给提交节点打版本标记。 | |||
| ## 11. 资料来源 | |||
| - Atlassian SourceTree 文档:https://confluence.atlassian.com/get-started-with-sourcetree | |||
| - Atlassian Git 教程:https://www.atlassian.com/git/tutorials | |||