Git 详 谈

什么是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 的核心概念和最佳实践,你将能够更好地管理项目版本,协同开发并保持代码的高质量。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值