|
@@ -0,0 +1,228 @@
|
|
|
|
|
+# Git使用指南
|
|
|
|
|
+
|
|
|
|
|
+## 名词解释
|
|
|
|
|
+
|
|
|
|
|
+- **仓库(Repository)**:Git项目的存储位置,包含所有文件和历史记录
|
|
|
|
|
+- **分支(Branch)**:独立的开发线,用于隔离不同的开发工作
|
|
|
|
|
+- **提交(Commit)**:代码的快照,包含修改内容和提交信息
|
|
|
|
|
+- **远端(Remote)**:远程仓库,通常位于服务器上
|
|
|
|
|
+- **克隆(Clone)**:从远程仓库复制一个完整的本地仓库
|
|
|
|
|
+- **推送(Push)**:将本地提交推送到远程仓库
|
|
|
|
|
+- **拉取(Pull)**:从远程仓库拉取更新到本地
|
|
|
|
|
+- **合并(Merge)**:将一个分支的更改合并到另一个分支
|
|
|
|
|
+- **冲突(Conflict)**:当两个分支对同一文件的同一部分进行了不同的修改时产生
|
|
|
|
|
+- **HEAD**:当前分支的最新提交
|
|
|
|
|
+- **暂存区(Staging Area)**:临时保存修改的区域,位于工作区和仓库之间
|
|
|
|
|
+- **工作区(Working Directory)**:本地修改文件的目录
|
|
|
|
|
+- **索引(Index)**:与暂存区同义,用于暂存要提交的更改
|
|
|
|
|
+- **提交哈希(Commit Hash)**:每个提交的唯一标识符,由SHA-1算法生成
|
|
|
|
|
+- **标签(Tag)**:给特定提交添加的标记,通常用于版本发布
|
|
|
|
|
+- **快照(Snapshot)**:Git存储的文件状态,而非文件差异
|
|
|
|
|
+- **重基(Rebase)**:将一个分支的提交应用到另一个分支上
|
|
|
|
|
+- **变基(Rebase)**:与重基同义,用于重新组织提交历史
|
|
|
|
|
+- **分叉(Fork)**:从他人的仓库创建一个自己的副本
|
|
|
|
|
+- **Pull Request**:请求将自己的更改合并到他人的仓库
|
|
|
|
|
+- **工作流(Workflow)**:团队使用Git的流程和规范
|
|
|
|
|
+- **子模块(Submodule)**:在一个仓库中引用另一个仓库
|
|
|
|
|
+- **Gitignore**:指定Git应忽略的文件和目录
|
|
|
|
|
+- **Reflog**:Git操作的日志,用于恢复意外丢失的提交
|
|
|
|
|
+- **Cherry-pick**:从一个分支选择特定的提交应用到另一个分支
|
|
|
|
|
+- **Bisect**:通过二分查找定位引入错误的提交
|
|
|
|
|
+- **Stash**:暂时保存未提交的更改,以便在不同分支间切换
|
|
|
|
|
+- **Subtree**:将一个仓库作为另一个仓库的子目录
|
|
|
|
|
+
|
|
|
|
|
+## 远端与本地分支
|
|
|
|
|
+
|
|
|
|
|
+### 本地分支操作
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 创建新分支
|
|
|
|
|
+git branch <分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 切换分支
|
|
|
|
|
+git checkout <分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 创建并切换到新分支
|
|
|
|
|
+git checkout -b <分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 查看本地分支
|
|
|
|
|
+git branch
|
|
|
|
|
+
|
|
|
|
|
+# 删除本地分支
|
|
|
|
|
+git branch -d <分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 强制删除本地分支
|
|
|
|
|
+git branch -D <分支名>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 远端分支操作
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 添加远程仓库
|
|
|
|
|
+git remote add <远端名称> <远程仓库URL>
|
|
|
|
|
+
|
|
|
|
|
+# 查看远程仓库
|
|
|
|
|
+git remote -v
|
|
|
|
|
+
|
|
|
|
|
+# 从远程仓库拉取更新
|
|
|
|
|
+git pull <远端名称> <分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 推送本地分支到远程仓库
|
|
|
|
|
+git push <远端名称> <本地分支名>:<远程分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 推送本地分支并设置上游分支
|
|
|
|
|
+git push -u <远端名称> <分支名>
|
|
|
|
|
+
|
|
|
|
|
+# 查看远程分支
|
|
|
|
|
+git branch -r
|
|
|
|
|
+
|
|
|
|
|
+# 查看所有分支(本地和远程)
|
|
|
|
|
+git branch -a
|
|
|
|
|
+
|
|
|
|
|
+# 删除远程分支
|
|
|
|
|
+git push <远端名称> --delete <远程分支名>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 分支合并
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 切换到目标分支
|
|
|
|
|
+git checkout <目标分支>
|
|
|
|
|
+
|
|
|
|
|
+# 合并源分支到目标分支
|
|
|
|
|
+git merge <源分支>
|
|
|
|
|
+
|
|
|
|
|
+# 解决冲突后提交
|
|
|
|
|
+git add <冲突文件>
|
|
|
|
|
+git commit
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 日志分析
|
|
|
|
|
+
|
|
|
|
|
+### 查看提交历史
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 查看完整提交历史
|
|
|
|
|
+git log
|
|
|
|
|
+
|
|
|
|
|
+# 查看简洁提交历史
|
|
|
|
|
+git log --oneline
|
|
|
|
|
+
|
|
|
|
|
+# 查看最近N个提交
|
|
|
|
|
+git log -n <数量>
|
|
|
|
|
+
|
|
|
|
|
+# 查看提交历史和更改内容
|
|
|
|
|
+git log -p
|
|
|
|
|
+
|
|
|
|
|
+# 查看特定文件的提交历史
|
|
|
|
|
+git log -- <文件路径>
|
|
|
|
|
+
|
|
|
|
|
+# 查看特定作者的提交历史
|
|
|
|
|
+git log --author="<作者名>"
|
|
|
|
|
+
|
|
|
|
|
+# 查看特定时间段的提交历史
|
|
|
|
|
+git log --since="<开始时间>" --until="<结束时间>"
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 查看更改
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 查看工作区和暂存区的差异
|
|
|
|
|
+git diff
|
|
|
|
|
+
|
|
|
|
|
+# 查看暂存区和HEAD的差异
|
|
|
|
|
+git diff --cached
|
|
|
|
|
+
|
|
|
|
|
+# 查看工作区和HEAD的差异
|
|
|
|
|
+git diff HEAD
|
|
|
|
|
+
|
|
|
|
|
+# 查看两个提交之间的差异
|
|
|
|
|
+git diff <提交1> <提交2>
|
|
|
|
|
+
|
|
|
|
|
+# 查看两个分支之间的差异
|
|
|
|
|
+git diff <分支1> <分支2>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 回退
|
|
|
|
|
+
|
|
|
|
|
+### 回退到之前的提交
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 软回退:保留工作区和暂存区的更改
|
|
|
|
|
+git reset --soft <提交哈希>
|
|
|
|
|
+
|
|
|
|
|
+# 混合回退:保留工作区的更改,清空暂存区
|
|
|
|
|
+git reset --mixed <提交哈希> # 默认选项
|
|
|
|
|
+
|
|
|
|
|
+# 硬回退:丢弃工作区和暂存区的更改
|
|
|
|
|
+git reset --hard <提交哈希>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 回退到远程分支的状态
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 强制本地分支与远程分支保持一致
|
|
|
|
|
+git reset --hard <远端名称>/<分支名>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 撤销修改
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 撤销工作区的修改(未add)
|
|
|
|
|
+git checkout -- <文件路径>
|
|
|
|
|
+
|
|
|
|
|
+# 撤销暂存区的修改(已add但未commit)
|
|
|
|
|
+git reset HEAD <文件路径>
|
|
|
|
|
+
|
|
|
|
|
+# 撤销最近的提交,保留更改
|
|
|
|
|
+git reset HEAD~1
|
|
|
|
|
+
|
|
|
|
|
+# 撤销最近的提交,丢弃更改
|
|
|
|
|
+git reset --hard HEAD~1
|
|
|
|
|
+
|
|
|
|
|
+# 撤销特定文件的提交
|
|
|
|
|
+git checkout HEAD -- <文件路径>
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 危险的回退
|
|
|
|
|
+
|
|
|
|
|
+### 注意事项
|
|
|
|
|
+
|
|
|
|
|
+1. **硬回退的风险**:`git reset --hard` 会永久丢弃未提交的更改,无法恢复
|
|
|
|
|
+
|
|
|
|
|
+2. **推送已回退的分支**:如果已经将分支推送到远程仓库,回退后再次推送需要使用 `--force` 选项,这会覆盖远程分支的历史
|
|
|
|
|
+
|
|
|
|
|
+3. **共享分支的回退**:如果分支被多人共享,回退可能会导致其他开发者的工作丢失
|
|
|
|
|
+
|
|
|
|
|
+4. **标签的影响**:回退操作不会移动标签,标签仍然指向原来的提交
|
|
|
|
|
+
|
|
|
|
|
+### 安全回退策略
|
|
|
|
|
+
|
|
|
|
|
+1. **创建备份分支**:在回退前创建一个备份分支,保存当前状态
|
|
|
|
|
+ ```bash
|
|
|
|
|
+ git branch <备份分支名> HEAD
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+2. **使用revert**:对于已经推送的提交,使用 `git revert` 而不是 `git reset`,这样可以创建一个新的提交来撤销之前的更改,而不是修改历史
|
|
|
|
|
+ ```bash
|
|
|
|
|
+ git revert <提交哈希>
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+3. **沟通协作**:如果分支被多人共享,在回退前应与团队成员沟通,确保所有人都了解更改
|
|
|
|
|
+
|
|
|
|
|
+4. **谨慎使用force推送**:只有在确定不会影响其他开发者的情况下,才使用 `git push --force`
|
|
|
|
|
+
|
|
|
|
|
+5. **定期备份**:定期备份重要的分支和提交,以防止意外丢失
|
|
|
|
|
+
|
|
|
|
|
+## 最佳实践
|
|
|
|
|
+
|
|
|
|
|
+1. **定期提交**:将工作分解为小的、有意义的提交
|
|
|
|
|
+2. **写清晰的提交信息**:提交信息应该简洁明了,描述更改的内容和原因
|
|
|
|
|
+3. **使用分支**:为不同的功能或修复创建独立的分支
|
|
|
|
|
+4. **定期拉取**:定期从远程仓库拉取更新,避免冲突
|
|
|
|
|
+5. **测试后再推送**:在推送前确保代码通过测试
|
|
|
|
|
+6. **使用.gitignore**:忽略不需要版本控制的文件
|
|
|
|
|
+7. **定期清理**:删除不需要的分支,保持仓库整洁
|
|
|
|
|
+8. **学习Git工作流**:了解并遵循团队的Git工作流规范
|
|
|
|
|
+
|
|
|
|
|
+通过遵循这些最佳实践,可以更有效地使用Git,减少错误和冲突,提高开发效率。
|