|
8 | 8 |
|
9 | 9 | ### 1。Git 的分布式特性
|
10 | 10 |
|
11 |
| -Git 是一个分布式版本控制系统,与集中式版本控制系统(如 SVN)不同,每个开发者的本地仓库都是完整的副本,包含了项目的完整历史记录。这种设计使得开发者即使在没有网络连接的情况下也可以进行大部分操作。Git 在处理版本控制时,不依赖于中央服务器,开发者可以随时推送、拉取代码,且不影响其他开发者的工作。 |
| 11 | +Git 是一个分布式版本控制系统(DVCS),与集中式系统(如 SVN)不同: |
| 12 | + |
| 13 | +- 每个开发者的电脑都有完整的仓库副本(包括所有历史记录和分支) |
| 14 | +- 这就像整个团队每个人都拥有完整的项目时光机,而不仅是服务器上有 |
| 15 | +- 优势: |
| 16 | + ✅ 离线工作:没网络也能提交代码、查看历史 |
| 17 | + ✅ 安全冗余:即使服务器损坏,任何本地仓库都可恢复项目 |
| 18 | + ✅ 高效协作:本地操作更快,网络交互只在同步时需要 |
| 19 | + |
| 20 | +> 🌟 **新手理解提示**: |
| 21 | +> 想象成:每个开发者都有完整的项目备份,而不是只能连接中央服务器查看 |
12 | 22 |
|
13 | 23 | ### 2。分支管理与协作
|
14 | 24 |
|
15 |
| -在 Git 中,分支允许开发者并行工作。每个开发者可以在自己的本地仓库中创建一个分支,进行独立开发,直到完成后再合并到主分支。分支的协作方式使得开发者能够在不干扰他人的情况下进行功能开发、bug 修复或实验性修改。常见的分支类型包括: |
| 25 | +在 Git 中,分支允许开发者并行工作。分支就像代码的平行宇宙,让多人同时进行不同任务: |
16 | 26 |
|
17 |
| -- **主分支(master/main)**:项目的主干分支,通常保持稳定状态。 |
18 |
| -- **功能分支(feature)**:为实现某个特定功能而创建的分支,完成开发后会合并回主分支。 |
19 |
| -- **修复分支(hotfix)**:用于紧急修复生产环境中的问题。 |
20 |
| -- **开发分支(develop)**:团队协作中用于集成各种功能分支的分支。 |
| 27 | +| 分支类型 | 创建场景 | 生命周期 | 合并目标 | |
| 28 | +|------------|---------------------------|------------------|----------------| |
| 29 | +| main/master | 项目初始分支 | 永久存在 | - | |
| 30 | +| feature | 新增登录功能 | 功能完成后删除 | develop/main | |
| 31 | +| hotfix | 紧急修复线上支付漏洞 | 修复后立即删除 | main + develop | |
| 32 | +| develop | 集成多个功能的测试分支 | 长期存在 | main | |
| 33 | + |
| 34 | +> 💡 **新手提示**: |
| 35 | +> |
| 36 | +> 1. 使用 `git branch` 查看所有分支 |
| 37 | +> 2. 使用 `git checkout -b 新分支名` 创建并切换分支 |
| 38 | +> 3. 分支名只是约定,实际可用任意名称 |
21 | 39 |
|
22 | 40 | ### 3。合并远程分支与本地分支
|
23 | 41 |
|
24 |
| -当开发者从远程仓库拉取更新(`git pull`)时,可能会遇到合并远程分支与本地分支的情况。Git 提供了几种方式来处理分支的合并: |
| 42 | +#### 何时需要合并? |
| 43 | + |
| 44 | +- 当多人修改了同一文件 |
| 45 | +- 当你拉取代码时其他人已推送新版本 |
| 46 | +- 当你完成功能需要合并到主分支 |
| 47 | + |
| 48 | +#### 两种合并方式 |
25 | 49 |
|
26 | 50 | - **Git Merge**:通过 `git merge` 命令将不同分支的修改合并。此操作会生成一个新的合并提交,保留两个分支的历史记录。合并时,如果两个分支在同一部分文件有不同修改,Git 会提示冲突,需要手动解决。
|
27 | 51 |
|
@@ -53,31 +77,128 @@ git add conflicted-file
|
53 | 77 | git commit -m "Resolved merge conflict"
|
54 | 78 | ```
|
55 | 79 |
|
| 80 | +⚠️ 注意:冲突时不要慌,这只是正常的协作信号! |
| 81 | + |
56 | 82 | ### 5。推送与拉取操作
|
57 | 83 |
|
58 | 84 | **推送(Push)**:将本地仓库的更改提交到远程仓库。推送操作要求本地分支与远程分支保持同步,且在推送之前需要先拉取(git pull)远程仓库的更新,以避免冲突。
|
59 | 85 |
|
60 | 86 | ```bash
|
| 87 | +# 将本地的 feature-branch 推送到远程 origin 仓库 |
61 | 88 | git push origin feature-branch
|
| 89 | + |
| 90 | +# 首次推送需设置上游跟踪分支(新手常见问题) |
| 91 | +git push -u origin feature-branch |
62 | 92 | ```
|
63 | 93 |
|
64 | 94 | **拉取(Pull)**:将远程仓库的更改拉取到本地仓库。拉取时 Git 会自动进行合并,或者如果使用 git pull --rebase,则会使用 rebase 方式进行合并。
|
65 | 95 |
|
66 | 96 | ```bash
|
| 97 | +# 基本拉取(相当于 git fetch + git merge) |
67 | 98 | git pull origin main
|
| 99 | + |
| 100 | +# 使用 rebase 方式拉取(保持历史线性) |
| 101 | +git pull --rebase origin main |
68 | 102 | ```
|
69 | 103 |
|
70 |
| -### 6.Git 工作流建议 |
| 104 | +💡 提示:推送前先拉取可减少冲突! |
| 105 | + |
| 106 | +### 6。Git 工作流建议 |
| 107 | + |
| 108 | +#### 标准功能开发流程 |
71 | 109 |
|
72 |
| -为了更高效地进行团队协作,Git 团队工作流通常包括以下几个步骤: |
73 |
| -**1** 在主分支上拉取最新的代码。 |
74 |
| -**2** 创建功能分支并开发新特性。 |
75 |
| -**3** 完成开发后,先拉取主分支的最新更新。 |
76 |
| -**4** 合并主分支到功能分支,解决冲突后再推送。 |
77 |
| -**5** 提交 Pull Request 进行代码审查与合并。 |
78 |
| -**6** 删除已合并的分支。 |
79 |
| -这种工作流确保了团队成员之间的协作高效、代码合并清晰,并且避免了频繁的冲突。 |
| 110 | +```bash |
| 111 | +# 1. 从主分支开始 |
| 112 | +git checkout main |
| 113 | + |
| 114 | +# 2. 获取最新代码 |
| 115 | +git pull origin main |
| 116 | + |
| 117 | +# 3. 创建功能分支 |
| 118 | +git checkout -b feature-login |
| 119 | + |
| 120 | +# ...开发完成后... |
| 121 | + |
| 122 | +# 4. 提交到本地仓库 |
| 123 | +git add . |
| 124 | +git commit -m "添加登录功能" |
| 125 | + |
| 126 | +# 5. 同步主分支最新状态 |
| 127 | +git checkout main |
| 128 | +git pull origin main |
| 129 | + |
| 130 | +# 6. 合并更新到功能分支 |
| 131 | +git checkout feature-login |
| 132 | +git merge main |
| 133 | + |
| 134 | +# 7. 推送到远程 |
| 135 | +git push origin feature-login |
| 136 | + |
| 137 | +# 8. 在代码平台创建 Pull Request (PR) |
| 138 | +``` |
| 139 | + |
| 140 | +## 常见新手问题 |
| 141 | + |
| 142 | +### Q1: 如何知道当前在哪个分支? |
| 143 | + |
| 144 | +```bash |
| 145 | +git status # 第一行显示 On branch... |
| 146 | +git branch # 带*号的是当前分支 |
| 147 | +``` |
| 148 | + |
| 149 | +### Q2: 推送时提示冲突怎么办? |
| 150 | + |
| 151 | +```bash |
| 152 | +# 1. 先拉取最新代码 |
| 153 | +git pull origin 分支名 |
| 154 | + |
| 155 | +# 2. 解决冲突(见第4节) |
| 156 | + |
| 157 | +# 3. 重新推送 |
| 158 | +git push origin 分支名 |
| 159 | +``` |
| 160 | + |
| 161 | +### Q3: rebase 和 merge 有什么区别? |
| 162 | + |
| 163 | +| 操作方式 | 历史记录 | 复杂度 | 适用场景 | |
| 164 | +|----------|------------------------|------------|----------------------| |
| 165 | +| merge | 保留分支合并痕迹 | 简单安全 | 公共分支合并 | |
| 166 | +| rebase | 变成直线历史 | 需要理解原理 | 整理本地提交历史 | |
| 167 | + |
| 168 | +### Q4: 如何撤销错误的提交? |
| 169 | + |
| 170 | +```bash |
| 171 | +# 撤销最近一次提交(保留修改) |
| 172 | +git reset --soft HEAD~1 |
| 173 | + |
| 174 | +# 完全丢弃最近提交(慎用!) |
| 175 | +git reset --hard HEAD~1 |
| 176 | +``` |
| 177 | + |
| 178 | +### Q5: 如何找回误删的分支? |
| 179 | + |
| 180 | +```bash |
| 181 | +# 1. 查看最近操作记录 |
| 182 | +git reflog |
| 183 | + |
| 184 | +# 2. 找到删除前的commit ID |
| 185 | +# 3. 重建分支 |
| 186 | +git branch 分支名 commit-id |
| 187 | +``` |
80 | 188 |
|
81 | 189 | ## 总结
|
82 | 190 |
|
83 |
| -Git 的分布式版本控制提供了灵活、高效的协作机制。开发者通过分支和合并操作,可以在不同分支上并行工作,同时确保代码的整合性。理解 Git 的工作原理,尤其是如何在不同分支间协作与合并,是使用 Git 进行版本控制的重要技能。 |
| 191 | +掌握 Git 分布式协作需要理解三个核心: |
| 192 | + |
| 193 | + 1. **仓库结构**:工作区 → 暂存区 → 本地仓库 → 远程仓库 |
| 194 | + 2. **分支本质**:轻量级可移动的提交指针 |
| 195 | + 3. **协作流程**:拉取 → 开发 → 合并 → 推送 |
| 196 | + |
| 197 | +➡️ 新手练习建议: |
| 198 | + |
| 199 | + 1. 在安全环境(个人项目)练习合并冲突 |
| 200 | + 2. 使用 `git status` 随时查看状态 |
| 201 | + 3. 小步提交(每次提交只做一个小修改) |
| 202 | + |
| 203 | +!!! tip "📚 **推荐练习**" |
| 204 | + 在 [Learn Git Branching](https://learngitbranching.js.org/) 进行交互式练习 |
0 commit comments