Git 详细说明书:从入门到精通

Git 是当今最流行的分布式版本控制系统,广泛应用于软件开发中。本指南将详细介绍 Git 的基本概念、常用命令和工作流程,帮助您从入门到熟练掌握 Git 的使用。

Git 入门基础

什么是版本控制?

版本控制是一种记录文件内容变化的系统,方便查看特定版本修订情况的软件工程技术。版本控制系统让用户能够追踪文件的修改历史,比较文件的不同版本,以及回溯到之前的版本3

什么是 Git?

Git 是一种分布式版本控制系统,由 Linux 之父 Linus Torvalds 创建。与集中式版本控制系统(如 SVN)不同,Git 使每个开发人员都拥有完整的代码仓库副本,这使得团队成员能够独立地在本地工作而无需持续的网络连接2

Git 工作原理

Git 以快照的形式存储数据,而非差异比较。当你提交更新时,Git 会对当时的文件创建一个快照并保存这个快照的索引,未修改的文件会保留一个链接指向之前存储的相同文件3

安装与配置

Git 安装

可以从 Git 官网(https://git-scm.com/downloads)下载安装程序,按照默认设置进行安装即可4。安装完成后,在开始菜单中找到"Git" -> "Git Bash",打开命令行窗口4

Git 配置

安装 Git 后,需要进行一些基本配置:

# 设置用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"

# 查看配置
git config --list

这些配置信息将被存储在 ~/.gitconfig 文件中3

生成 SSH 公钥

为了安全地连接远程 Git 仓库,通常需要设置 SSH 密钥:

ssh-keygen -t rsa -C "your_email@example.com"

执行此命令后,会在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)文件3

版本库基础操作

创建版本库

版本库(Repository)是 Git 用来存储文件版本的地方。创建版本库非常简单:

# 创建空目录
mkdir learngit
cd learngit

# 初始化仓库
git init

执行 git init 后,当前目录下会生成一个 .git 目录,这个目录是 Git 用来跟踪管理版本库的1

添加和提交文件

工作区中的文件需要先添加到暂存区,然后再提交到版本库:

# 添加文件到暂存区
git add readme.txt
git add .  # 添加所有修改的文件

# 提交到版本库
git commit -m '提交说明'

git add 命令将工作区的修改添加到暂存区,git commit 命令将暂存区的内容提交到当前分支1

查看状态和历史

# 查看仓库当前状态
git status

# 查看文件差异
git diff

# 查看提交历史
git log
git log --pretty=oneline  # 一行显示

git status 命令可以查看工作区和暂存区的状态,git diff 可以查看具体修改内容,git log 可以查看提交历史1

版本控制与撤销操作

版本回退

Git 中用 HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD^^ 表示上上个版本,HEAD~100 表示往上 100 个版本:

# 回退到上一个版本
git reset --hard HEAD^

# 回退到指定版本
git reset --hard 3628164  # 版本号前几位即可

如果想回到未来的某个版本,只要知道该版本的 commit id,就可以通过 git reset --hard 命令恢复1

撤销修改

对于工作区的修改,有不同的撤销方式:

# 撤销工作区的修改
git checkout -- file.txt

# 撤销暂存区的修改(先取消暂存,再撤销修改)
git reset HEAD file.txt
git checkout -- file.txt

git checkout -- file 命令可以丢弃工作区的修改,回到最近一次 git commit 或 git add 时的状态1

删除文件

# 从版本库中删除文件
rm file.txt
git rm file.txt
git commit -m '删除文件'

# 恢复误删的文件
git checkout -- file.txt

使用 git rm 命令从版本库中删除文件,然后提交。如果是误删,可以用 git checkout -- file 命令恢复1

分支管理

创建和切换分支

# 创建分支
git branch dev

# 切换分支
git checkout dev

# 创建并切换分支(一步完成)
git checkout -b dev

Git 中的分支非常轻量,创建和切换分支的操作几乎是瞬间完成的23

分支的合并与管理

# 合并指定分支到当前分支
git merge dev

# 删除分支
git branch -d dev

# 查看分支合并图
git log --graph

合并分支时,Git 会优先使用"Fast forward"模式,但这种模式下,删除分支后会丢掉分支信息。可以使用 --no-ff 参数禁用"Fast forward"模式3

解决冲突

当两个分支对同一文件的同一部分进行了不同修改,合并时就会产生冲突。此时需要手动解决冲突,然后再提交3

# 查看冲突文件
git status

# 手动编辑解决冲突

# 标记为已解决
git add conflicted_file.txt
git commit -m '解决冲突'

可以使用 git mergetool 命令启动图形化的冲突解决工具来帮助解决冲突3

远程仓库管理

添加远程仓库

# 添加远程仓库
git remote add origin git@github.com:username/repo.git

# 查看远程仓库
git remote -v

添加后,远程库的名称就是 origin,这是 Git 的默认叫法13

推送和获取数据

# 推送到远程仓库
git push -u origin master  # 首次推送
git push origin master  # 后续推送

# 从远程仓库获取数据
git fetch origin
git pull origin master

git push 命令将本地分支推送到远程仓库,git fetch 命令从远程获取数据但不合并,git pull 命令获取并合并3

Git 实际工作开发流程

在实际工作中,Git 的基本流程可概括为四步2

  1. 添加(Add) :将修改内容添加到暂存区 git add .
  2. 提交(Commit) :将暂存区内容提交到本地仓库 git commit -m 'description'
  3. 拉取(Pull) :同步远程仓库最新内容 git pull
  4. 推送(Push) :将本地仓库内容推送到远程 git push

这种流程确保了多人协作时的代码同步和冲突解决2

Git 高级特性

标签管理

# 创建标签
git tag v1.0

# 查看标签
git tag

# 删除标签
git tag -d v1.0

标签是版本库的一个快照,是指向某个 commit 的指针,常用于标记版本发布点3

变基操作

# 变基操作
git rebase master

变基(rebase)是将一系列提交按照原有次序依次应用到另一分支上的操作,可以使提交历史更加整洁3

贮藏工作区

# 保存工作现场
git stash

# 查看贮藏的工作现场
git stash list

# 恢复工作现场
git stash apply
git stash drop

# 恢复并删除贮藏
git stash pop

贮藏(stash)可以暂时保存工作区的修改,以便切换到其他分支进行工作3

Git 服务器搭建

搭建 Git 服务器

在 CentOS 上搭建 Git 服务器的基本步骤包括:安装 Git、创建 git 用户(禁止 shell 登录)、初始化裸仓库(git init --bare)、设置 SSH 密钥认证等3

GitLab 部署

对于需要更完善管理的团队,可以部署 GitLab 作为自托管的 Git 服务。GitLab 提供了 Web 界面、用户权限管理、代码审查、CI/CD 等丰富功能3

Git 实用技巧

Git 命令别名

可以为常用命令设置别名,提高工作效率:

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch

设置别名后,可以用 git st 替代 git status3

自动补全

Git 提供了命令自动补全功能,可大大提高命令输入效率。在 Linux 系统中,可通过配置 bash-completion 包启用此功能3

分支使用规范

在团队开发中,常见的分支模型包括:

  • master/main:主分支,用于发布
  • develop:开发分支
  • feature/*:功能分支
  • release/*:发布分支
  • hotfix/*:热修复分支

这种分支管理模型可以有效地隔离开发、发布和缺陷修复工作,提高代码的质量和稳定性2

结论

Git 是一个功能强大、灵活高效的版本控制系统。本指南涵盖了 Git 的基本概念、常用命令和工作流程,从入门到高级应用,为开发人员提供了系统的参考。要成为 Git 专家,除了理解这些基础知识外,还需要在实际项目中不断实践和探索。Git 的学习是循序渐进的过程,掌握本指南中的内容将帮助您在软件开发中更加高效地管理代码和协作。

随着经验的积累,您可以逐步探索更多高级功能,如 Git 钩子、交互式变基、二分查找等,使 Git 成为您强大的开发工具。无论是个人项目还是团队协作,Git 都能提供可靠的版本控制和高效的工作流程管理。

Citations:

  1. https://www.cnblogs.com/love-snow/articles/7306543.html
  2. https://www.cnblogs.com/Can-daydayup/p/18246734
  3. https://www.lanmper.cn/git
  4. https://xugaoyi.com/pages/9a7ee40fc232253e/
  5. https://pythondjango.cn/python/tools/4-git-commands/
  6. https://docs.github.com/zh/get-started/using-git/about-git
  7. https://blog.csdn.net/weixin_43866583/article/details/125644017
  8. https://blog.csdn.net/hello_boyu/article/details/138289823
  9. https://kingyinliang.github.io/PDF/Git%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E7%AE%A1%E7%90%86%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89.pdf
  10. https://www.runoob.com/git/git-basic-operations.html
  11. https://www.progit.cn
  12. https://jim1105.coderbridge.io/2022/08/21/git-commands/
  13. https://blog.csdn.net/weixin_41003780/article/details/123285406
  14. https://github.com/CoderLeixiaoshuai/java-eight-part/blob/master/docs/tools/git/%E4%BF%9D%E5%A7%86%E7%BA%A7Git%E6%95%99%E7%A8%8B%EF%BC%8C10000%E5%AD%97%E8%AF%A6%E8%A7%A3.md
  15. https://comdyn.hy.tsinghua.edu.cn/from-web/software-usage/539-git-manual
  16. https://www.bootcss.com/p/git-guide/
  17. http://www.runoob.com/git/git-tutorial.html
  18. https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E8%8E%B7%E5%8F%96%E5%B8%AE%E5%8A%A9
  19. https://docs.github.com/zh/get-started
  20. https://blog.csdn.net/heima005/article/details/129437310
  21. https://codegym.cc/tw/groups/posts/tw.379.git-ru-men-xin-shou-zong-he-zhi-nan
  22. https://liaoxuefeng.com/books/git/index.html
  23. https://blog.csdn.net/mukes/article/details/115693833
  24. https://cloud.tencent.com/developer/doc/1096
  25. http://www.peter-zhou.com/chapter1/gitlabfu-wu-qi-bu-shu/git-shi-yong-shou-ce.html
  26. https://www.cnblogs.com/upstudy/p/15870787.html
  27. https://github.com/itwanger/toBeBetterJavaer/blob/master/docs/src/pdf/progit.md
  28. https://gist.github.com/luckyli/32f9b92eb13f78614c5e4d340667fe95
  29. https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6
  30. https://www.maxlist.xyz/2018/11/02/git_tutorial/
  31. https://hackmd.io/@aikwdc00/ryiX1OEM8
  32. https://liam.page/attachment/attachment/Git/progit.zh.pdf
  33. https://blog.csdn.net/qq_52700250/article/details/144576241
  34. https://www.gitrc.cn
  35. https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
  36. https://doc.yonyoucloud.com/doc/wiki/project/git-tutorial/index.html