什么是Git?
Git是一个开源分布式版本控制系统。它旨在快速高效地处理从小型到大型的项目。它是为了协调开发人员之间的工作而开发的。由 Linus Torvalds 于 2005 年为管理 Linux 内核开发而创建。如今,Git 已成为最流行的版本控制工具之一,广泛应用于软件开发项目中。
一、Git 的核心概念
1.1 版本控制系统
版本控制系统(Version Control System, VCS)是管理文件变更的工具,帮助开发者记录文件的不同版本,回溯历史版本并协同工作。VCS 分为集中式和分布式两种:
- 集中式版本控制系统(CVCS):如 SVN、CVS,使用单一的中央服务器存储所有版本,客户端从服务器获取最新版本。
- 分布式版本控制系统(DVCS):如 Git,每个客户端都保存完整的版本库,允许离线工作。
1.2 Git 的工作原理
Git 通过快照(snapshot)而非差异(diff)来记录版本。每次提交(commit),Git 都会拍摄当前项目的快照,并存储该快照的引用。未修改的文件会引用之前的快照,从而提高效率。
1.3 基本术语
- 工作区(Working Directory):包含项目的实际文件。
- 暂存区(Staging Area):一个包含即将提交的文件快照的区域。
- 版本库(Repository):包含所有提交记录的数据库。
二、Git 的基本操作
2.1 安装 Git
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。Git 各平台安装包下载地址为:Git下载
2.2 配置 Git
安装后,需要配置 Git 的用户名和邮箱:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
2.3 初始化仓库
在项目目录下初始化 Git 仓库:
git init
拷贝一份远程仓库,也就是下载一个项目和它的整个代码历史:
git clone [url]
2.4 基本命令
2.4.1 添加文件到暂存区
使用 git add
命令将文件添加到暂存区:
git add <file>
或者添加所有变化:
git add .
2.4.2 提交更改
使用 git commit
将暂存区的更改提交到版本库:
git commit -m "Commit message"
2.4.3 查看状态
使用 git status
查看当前工作区和暂存区的状态:
git status
2.4.4 查看提交历史
使用 git log
查看提交历史:
git log
2.5 分支操作
2.5.1 创建分支
使用 git branch
创建新分支:
git branch <branch-name>
2.5.2 切换分支
使用 git checkout
切换分支:
git checkout <branch-name>
2.5.3 合并分支
使用 git merge
合并分支:
git checkout <target-branch>
git merge <source-branch>
2.6 远程仓库
2.6.1 添加远程仓库
使用 git remote add
添加远程仓库:
git remote add origin <repository-url>
2.6.2 推送到远程仓库
使用 git push
推送本地提交到远程仓库:
git push origin <branch-name>
2.6.3 拉取远程更新
使用 git pull
拉取远程仓库的更新:
git pull origin <branch-name>
三、Git 的进阶操作
3.1 Git 的内部机制
3.1.1 对象模型
Git 的对象模型包括三种主要对象:blob(文件数据)、tree(目录信息)和commit(提交记录)。每个对象都由唯一的 SHA-1 哈希值标识。
3.1.2 索引文件
Git 使用索引文件(index)来记录暂存区的内容。索引文件包含文件的路径、文件的模式及对应的 blob 对象的哈希值。
3.2 Git 的分支管理
3.2.1 Rebase
使用 git rebase
重新应用提交历史:
git checkout <branch-name>
git rebase <base-branch>
3.2.2 Cherry-pick
使用 git cherry-pick
选择性地应用提交:
git cherry-pick <commit-hash>
3.3 Git 的冲突解决
当合并分支或应用变更时,可能会产生冲突。Git 会标记冲突区域,需手动编辑文件并解决冲突,然后重新暂存并提交:
git add <file>
git commit -m "Resolve conflict"
3.4 Git 的标签管理
使用 git tag
创建标签:
git tag <tag-name>
推送标签到远程仓库:
git push origin <tag-name>
四、Git 的最佳实践
4.1 编写优雅的提交信息
- 使用简明、描述性的提交信息。
- 提交信息应包含动词,如 "Fix"、"Add"、"Update" 等。
4.2 频繁提交
- 频繁提交可捕捉细微变更,便于回溯历史和调试。
- 确保每次提交都有明确的目的和完整性。
4.3 使用分支
- 使用分支隔离开发工作,如功能分支、修复分支等。
- 定期合并和同步分支,避免长时间未合并导致的冲突。
4.4 备份和同步
- 定期推送代码到远程仓库备份。
- 使用 CI/CD 工具自动化测试和部署。
五、整理
git的操作往往都不是一个命令能解决的,就比如下图所示,单单代码提交和同步代码,就涉及到6个命令的组合。
看完了git命令大全,这节列举了实际操作中的不同场景,为大家一一解答如何组合不同git命令,进行git的操作流程。
- 代码提交和同步代码
- 代码撤销和撤销同步
代码撤销和撤销同步:
一、已修改,但未暂存
$ git diff # 列出所有的修改
$ git diff xx/xx.py xx/xx2.py # 列出某(几)个文件的修改
$ git checkout # 撤销项目下所有的修改
$ git checkout . # 撤销当前文件夹下所有的修改
$ git checkout xx/xx.py xx/xx2.py # 撤销某几个文件的修改
$ git clean -f # untracked状态,撤销新增的文件
$ git clean -df # untracked状态,撤销新增的文件和文件夹
二、已暂存,未提交
这个时候已经执行过git add,但未执行git commit,但是用git diff已经看不到任何修改。 因为git diff检查的是工作区与暂存区之间的差异。
$ git diff --cached # 这个命令显示暂存区和本地仓库的差异
$ git reset # 暂存区的修改恢复到工作区
$ git reset --soft # 与git reset等价,回到已修改状态,修改的内容仍然在工作区中
$ git reset --hard # 回到未修改状态,清空暂存区和工作区
git reset --hard 操作等价于 git reset 和 git checkout 2步操作
三、已提交,未推送
执行完commit之后,会在仓库中生成一个版本号(hash值),标志这次提交。之后任何时候,都可以借助这个hash值回退到这次提交。
$ git diff <branch-name1> <branch-name2> # 比较2个分支之间的差异
$ git diff master origin/master # 查看本地仓库与本地远程仓库的差异
$ git reset --hard origin/master # 回退与本地远程仓库一致
$ git reset --hard HEAD^ # 回退到本地仓库上一个版本
$ git reset --hard <hash code> # 回退到任意版本
$ git reset --soft/git reset # 回退且回到已修改状态,修改仍保留在工作区中。
四、已推送到远程
$ git push -f orgin master # 强制覆盖远程分支
$ git push -f # 如果之前已经用 -u 关联过,则可省略分支名
慎用,一般情况下,本地分支比远程要新,所以可以直接推送到远程,但有时推送到远程后发现有问题,进行了版本回退,旧版本或者分叉版本推送到远程,需要添加 -f参数,表示强制覆盖。
六、总结
Git 是一个功能强大且灵活的版本控制工具,掌握其基本操作和进阶技巧能够极大提高开发效率和代码质量。通过理解 Git 的核心概念和最佳实践,你将能够更好地管理项目版本,协同开发并保持代码的高质量。