GitRead.md 6.6 KB

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:将一个仓库作为另一个仓库的子目录

远端与本地分支

本地分支操作

# 创建新分支
git branch <分支名>

# 切换分支
git checkout <分支名>

# 创建并切换到新分支
git checkout -b <分支名>

# 查看本地分支
git branch

# 删除本地分支
git branch -d <分支名>

# 强制删除本地分支
git branch -D <分支名>

远端分支操作

# 添加远程仓库
git remote add <远端名称> <远程仓库URL>

# 查看远程仓库
git remote -v

# 从远程仓库拉取更新
git pull <远端名称> <分支名>

# 推送本地分支到远程仓库
git push <远端名称> <本地分支名>:<远程分支名>

# 推送本地分支并设置上游分支
git push -u <远端名称> <分支名>

# 查看远程分支
git branch -r

# 查看所有分支(本地和远程)
git branch -a

# 删除远程分支
git push <远端名称> --delete <远程分支名>

分支合并

# 切换到目标分支
git checkout <目标分支>

# 合并源分支到目标分支
git merge <源分支>

# 解决冲突后提交
git add <冲突文件>
git commit

日志分析

查看提交历史

# 查看完整提交历史
git log

# 查看简洁提交历史
git log --oneline

# 查看最近N个提交
git log -n <数量>

# 查看提交历史和更改内容
git log -p

# 查看特定文件的提交历史
git log -- <文件路径>

# 查看特定作者的提交历史
git log --author="<作者名>"

# 查看特定时间段的提交历史
git log --since="<开始时间>" --until="<结束时间>"

查看更改

# 查看工作区和暂存区的差异
git diff

# 查看暂存区和HEAD的差异
git diff --cached

# 查看工作区和HEAD的差异
git diff HEAD

# 查看两个提交之间的差异
git diff <提交1> <提交2>

# 查看两个分支之间的差异
git diff <分支1> <分支2>

回退

回退到之前的提交

# 软回退:保留工作区和暂存区的更改
git reset --soft <提交哈希>

# 混合回退:保留工作区的更改,清空暂存区
git reset --mixed <提交哈希>  # 默认选项

# 硬回退:丢弃工作区和暂存区的更改
git reset --hard <提交哈希>

回退到远程分支的状态

# 强制本地分支与远程分支保持一致
git reset --hard <远端名称>/<分支名>

撤销修改

# 撤销工作区的修改(未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. 创建备份分支:在回退前创建一个备份分支,保存当前状态

    git branch <备份分支名> HEAD
    
    1. 使用revert:对于已经推送的提交,使用 git revert 而不是 git reset,这样可以创建一个新的提交来撤销之前的更改,而不是修改历史 bash git revert <提交哈希>
  2. 沟通协作:如果分支被多人共享,在回退前应与团队成员沟通,确保所有人都了解更改

  3. 谨慎使用force推送:只有在确定不会影响其他开发者的情况下,才使用 git push --force

  4. 定期备份:定期备份重要的分支和提交,以防止意外丢失

最佳实践

  1. 定期提交:将工作分解为小的、有意义的提交
  2. 写清晰的提交信息:提交信息应该简洁明了,描述更改的内容和原因
  3. 使用分支:为不同的功能或修复创建独立的分支
  4. 定期拉取:定期从远程仓库拉取更新,避免冲突
  5. 测试后再推送:在推送前确保代码通过测试
  6. 使用.gitignore:忽略不需要版本控制的文件
  7. 定期清理:删除不需要的分支,保持仓库整洁
  8. 学习Git工作流:了解并遵循团队的Git工作流规范

通过遵循这些最佳实践,可以更有效地使用Git,减少错误和冲突,提高开发效率。