Skip to content

Commit 710ae1f

Browse files
增加git相关内容
1 parent 12fc20a commit 710ae1f

1 file changed

Lines changed: 161 additions & 0 deletions

File tree

  • docs/docs/编程外的基础

docs/docs/编程外的基础/Git.mdx

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ import MarkmapHooks from '@site/src/components/MarkmapHooks';
107107
108108
- git reset --hard HEAD^:回退到上一版本
109109
- git reset --hard commit_id:回退到指定版本
110+
- git reset --hard HEAD~1 + push -f :撤销最近一次 Push
111+
- git reset --soft HEAD~1 : 只撤销 Push 但保留代码
110112
111113
## 标签管理
112114
@@ -132,6 +134,7 @@ import MarkmapHooks from '@site/src/components/MarkmapHooks';
132134
133135
`} />
134136

137+
135138
## Git commit 规范
136139

137140
Git commit 的规范是为了更好地管理代码,方便后续的代码维护和版本回退。
@@ -144,6 +147,164 @@ Git commit 的规范是为了更好地管理代码,方便后续的代码维护
144147
145148
> Gitmoji 提供 VS Code 插件,可以在提交时选择对应的表情符号,然后填写提交信息。
146149
150+
### .gitignore
151+
152+
.gitignore 文件用于指定 Git 应该忽略的未跟踪文件。这能防止敏感信息(如 API Key)或编译产物(如 node_modules)进入版本库。
153+
154+
建议包含的内容:
155+
156+
- 系统文件: .DS_Store (macOS), Thumbs.db (Windows)。
157+
158+
- 依赖包: node_modules/, vendor/。
159+
160+
- 编译产物: dist/, build/, *.exe, *.log。
161+
162+
- 环境配置: .env, .env.local。
163+
164+
推荐工具: [gitignore.io](https://www.toptal.com/developers/gitignore) 可以根据你的开发环境(如 Java, Node, Python)自动生成完整的模板。
165+
166+
### .gitattributes
167+
168+
.gitattributes 用于定义特定文件或目录的路径属性。它最常见的用途是解决跨平台协作时的换行符问题。
169+
170+
常见配置项:
171+
```bash
172+
// 统一换行符: 强制所有文本文件在 Git 库中以 LF 存储,防止 Windows 用户提交 CRLF 导致冲突。
173+
* text=auto eol=lf
174+
175+
// LFS (Large File Storage): 指定哪些大文件通过 Git LFS 管理。
176+
*.psd filter=lfs diff=lfs merge=lfs -text
177+
178+
// 语言统计: 告诉 GitHub/GitLab 忽略某些文件夹的语言统计。
179+
docs/* linguist-documentation
180+
```
181+
182+
### .gitkeep
183+
184+
Git 默认不追踪空文件夹,如果你想在仓库中保留一个空文件夹(如 logs/),可以在里面放一个空的 `.gitkeep`
185+
186+
187+
## 常见 Git 事故修复方案:
188+
189+
事故发生前,养成好习惯来预防是成本最低的:
190+
191+
* **先拉后推:** 养成 `git push` 前先执行 `git pull --rebase` 的习惯。
192+
* **原子化提交:** 每个 commit 只解决一个问题。禁止将逻辑修改与格式优化混在一起。
193+
* **分支隔离:** 严禁直接在 `main``master` 分支开发,所有新特性应在 `feature/` 分支进行。
194+
195+
在多人协作中,除了基础的操作外,提交记录的整洁度和冲突处理能力是衡量开发者水平的重要标准,以下是一些常见 Git 事故修复方案:
196+
197+
### 提交历史不整洁
198+
199+
**场景描述**
200+
在开发功能时产生了多次琐碎提交(如:`fix typo`, `add logic`, `update test`)。在推送到主分支前,需要将这些记录合并为一个完整的提交。
201+
> **注意:** 仅在尚未推送到远程仓库时进行此操作,严禁对已共享的公共分支记录进行变基。
202+
203+
**解决方案**
204+
使用交互式变基:`git rebase -i`
205+
206+
**操作步骤**
207+
208+
1. 执行 `git rebase -i HEAD~3`(针对最近 3 次提交)。
209+
2. 在编辑器中,将第 2、3 行开头的 `pick` 改为 `squash` (或简写为 `s`)。
210+
3. 保存并退出,在随后的弹窗中编辑合并后的提交说明(Commit Message)。
211+
212+
213+
### 修复不完美提交
214+
215+
**问题描述:** 修复BUG,已经 push 到了远程,但发现之前的代码并没真的修复,还差一些细节。目前还没有其他人提交。现在本地已经真正修复完了。
216+
217+
**解决方案:** 修改最近一次提交。
218+
219+
* **操作步骤:**
220+
1. 暂存修改: 在本地完成真正的修复后,执行 `git add .`
221+
2. 合并提交: 执行 `git commit --amend --no-edit`
222+
`--amend` 表示将当前的修改合并到上一次提交中。
223+
`--no-edit` 表示沿用上一次的提交信息(不用重新写 Commit Message)。
224+
3. 强制推送: 执行 `git push origin <分支名> --force-with-lease`
225+
226+
远程仓库的那条“没修好”的记录会被这条“真正修好”的记录直接替换。
227+
228+
* **注意:** 如果该分支有其他人在协作,强制推送前务必打招呼,否则会造成他人的提交历史错乱。
229+
230+
### 处理多人协作冲突
231+
232+
**场景描述**
233+
A 和 B 同时修改了同一文件。B 先推送,A 在推送时被拒绝。
234+
235+
**解决方案**
236+
使用 `git pull --rebase` 保持提交线性的整洁。
237+
238+
**推荐理由**
239+
240+
* **Merge:** 会产生额外的“Merge branch...”节点,使分支图谱出现交叉。
241+
* **Rebase:** 将本地提交“移至”远程最新提交之后,保持一条直线。
242+
243+
**操作步骤**
244+
245+
1. 执行 `git pull --rebase`
246+
2. 若遇冲突,Git 会提示冲突文件。打开文件手动修复。
247+
3. 解决后执行 `git add <file>`
248+
4. 执行 `git rebase --continue`,重复此步骤直到合并完成。
249+
250+
### 应忽略的内容误推至远程
251+
252+
**问题描述:**`.env`、API Key 或 SSH 私钥不小心 `git push` 到了公共仓库。
253+
**解决方案:** 仅删除当前提交是不够的,必须从历史记录中彻底抹除。否则 `.git` 文件夹会包含该文件,导致仓库体积激增,拉取缓慢。。
254+
255+
* **推荐工具:** [git-filter-repo](https://github.com/newren/git-filter-repo) (官方推荐) 或 BFG Repo-Cleaner。
256+
* **操作步骤:**
257+
1. **立即撤销泄露密钥的有效性**(这是最安全的操作,假设密钥已泄露)。
258+
2. 安装工具后执行:`git filter-repo --path secret.txt --invert-paths`(从所有历史中删除指定文件)。
259+
3. 强制推送到远程:`git push origin --force --all`
260+
261+
* **预防:** 在项目根目录配置 `.gitignore`** 对于密钥泄露,**修改代码是补救,更换密钥是根治**。一旦信息进入过互联网,就应视为已泄露。
262+
263+
### 推错分支
264+
265+
**问题描述:** 在错误的分支上进行了提交并已推送到远程(本应推到 feature,误推到了 main)。
266+
267+
**解决方案:** 转移提交并重置原分支。
268+
269+
* **操作步骤:**
270+
1. 先在当前错误分支创建新分支保存进度:`git branch feature-correct`
271+
2. 切回 `main` 分支:`git checkout main`
272+
3. 强制重置 `main` 到上一个版本:`git reset --hard HEAD~1`
273+
4. 强制推送回远程:`git push origin main --force`
274+
275+
### 线上 Bug 紧急回退
276+
277+
**场景描述**
278+
A 修复 Bug 后已推送,B 随后也提交了代码。现发现 A 的修复方案有误,需撤销 A 的修改,但必须保留 B 的代码。
279+
280+
**解决方案**
281+
使用 `git revert` 生成反向提交。
282+
283+
**对比差异**
284+
285+
* **Reset:** 物理抹除记录,会造成他人本地仓库与远程不一致。
286+
* **Revert:** 创建一个新提交来抵消旧提交。这是多人协作中安全的回退方式。
287+
288+
**操作步骤**
289+
290+
1. 获取错误提交的哈希值(如 `abc1234`)。
291+
2. 执行 `git revert abc1234`
292+
3. 推送生成的“抵消”提交。此时 A 的错误被撤销,B 的代码完好无损。
293+
294+
### 临时切换任务
295+
296+
**场景描述**
297+
功能开发到一半,需紧急切换到 `master` 分支修复 Bug,但当前代码尚不具备提交条件。
298+
299+
**解决方案**
300+
使用 `git stash` 将修改暂存至堆栈。
301+
302+
**操作步骤**
303+
304+
1. 执行 `git stash`,工作区恢复干净。
305+
2. 切换分支修复 Bug 并提交。
306+
3. 切回原分支,执行 `git stash pop` 恢复之前的进度。
307+
147308
## GitHub Actions
148309

149310
GitHub Actions 是一种工作流,是 CI/CD 最常用的工具。

0 commit comments

Comments
 (0)