前言
git 作为最常用的版本控制工具,已经成为协同开发中不可或缺的部分。随着 IDE 功能的不断集成发展,我们不知不觉中已经习惯了使用 IDE 中的集成命令,来进行代码提交和版本管理。对于许多开发者来说,IDE 提供的图形化界面简化了操作流程,让版本控制变得更加直观和容易。
然而,这也使得很多人并不了解 git 的底层命令和工作原理,所以本篇文章就使用 git 命令行操作,看看 git 是如何工作的。
工作区域
在 git 中,不同的命令是对不同的 git 工作区域进行操作。
- 工作目录(Working Directory):工作目录就可以理解为磁盘上所有的文件和文件夹,可以进行文件的修改、删除或者新增。
- 暂存区(Staging Area):暂存区是一个临时保存修改的区域,用于在提交本地仓库之前,暂存你的改动。当你使用 git add 命令时,你的修改会被放入暂存区。这样,你可以选择性地提交部分改动,而不是整个工作目录的状态。
- 本地仓库(Local Repository):当你执行 git commit 时,暂存区的内容会被提交到本地仓库中。同时,本地仓库包含了项目的所有版本和分支信息,通过 checkout 可以切换不同分支。
- 远程仓库(Remote Repository):远程仓库指的是 gitee、github 这样的代码托管平台等,当你执行 git push 时,你的本地仓库的更改会被推送到远程仓库。
git init
在需要版本管理的文件下,执行 git init 初始化,在当前目录下就生成了 .get 隐藏文件夹,里面记录了 git 信息。
新建一个名为aqi的文本,然后在里面输入一行 Hello World,此时我执行 git status 查看工作区状态。
git操作
在 git 中,最基本的操作就是 git add 和 commit。git add 负责将文件和变更提交到暂存区,commit 则是将暂存区的变更提交到本地仓库。
git add
提示你aqi这个文件,需要执行 git add 进行跟踪,那么我们执行 add 之后,aqi就被放到了暂存区,再 git status 查看工作区状态。
这时候,在 workspace 工作区中就没有未被跟踪的文件了,而 aqi 就成了暂存区要提交(commit)的变更。
git commit
执行 git commit 将暂存区的变更提交到本地仓库, -m 指定提交信息。
提交完成之后,使用 git log 可以看到提交日志,这时候暂存区已经没有了可以提交的变更。
此时,如果修改aqi,新增一行 Hello qi,再查看工作区状态,提示aqi有可提交的变更。
也就是说,加入暂存区被跟踪的文件,在 workspace 中只要修改,就能被捕捉到变更,这时候就要执行 git add 将这些变更更新到暂存区,然后 git commit 提交到本地仓库。
和第一次 git add 将文件添加到暂存区不同的是,这次只是提交变更到暂存区,所以可以使用 git commit -a 来合并 add 和 commit 命令。
提交变更之后,又多了一条提交日志。我在aqi中又新增一行 “Hello a”,然后 git add 提交到暂存区。
再 git commit提交到本地仓库,这两步操作和合并命令结果是一样的。
至此,本地仓库中已经有了三条提交信息。
分支branch
在讲完 git 的基本操作之后,我们再结合branch,深入探讨一下 git 的工作区域。git 中默认的分支是 master,不同的分支可以进行不同的代码开发和变更,在本地仓库也有各自的提交信息。
git branch
使用 git branch 新建一个dev分支,git checkout 切换到dev分支。
git branch 也可以查看分支信息,星号指向当前所在的分支。此时,dev 是基于本地仓库中 master 分支生成的,所以此时 dev 和 master 分支的提交信息是相同的。
在 dev 分支下,我再添加一行数据,如下图所示:
然后 git status 查看工作区已经有了aqi的变更信息。
这里需要明确的是:文件的变更我是在dev分支进行的,文件变更没有add到暂存区,而是在 workspace 中。当我切换到 master 分支上,查看 aqi,居然看到了在dev分支是的变更。
这也就意味着,workspace区域是分支之间共享的。 在 master 分支下,我执行 git add 将 workspce 中的变更提交到暂存区。然后我再 checkout 切换到dev分支。
当我再次查看aqi,虽然在master分支将变更更新到了暂存区,但是dev分支仍可以看到变更的数据。
所以,暂存区也是分支之间共享的。这次我在 dev 分支上,直接 git commit 到本地仓库。
这时候再 checkout 到master分支,就看不到aqi中的第四行数据了。总结:对于所有分支而言,工作区和暂存区是公共的,已add未commit的内容不属于任何一个分支。只有commit到本地仓库,变更才会归属到具体的分支。
我们在 dev 和 master 分支下分别执行 git log。
如上图,dev 相对于 master 而言,已经多了一条提交信息。此时将 git log 界面展示,如图:
dev 是在3时基于 master 生成的,所以 dev 也有1 ~ 3的提交信息。此时,master 分支的 HEAD 指向3,dev 分支的 HEAD 指向4,两个分支的 aqi 文件此时内容也是不一样的。
冲突
在 master 分支上,我在aqi中,新增了一行数据“Hello master”。然后我 git add 更新到了暂存区。
这时候,我想 checkout 到 dev 分支,就会切换失败,提示在 checkout 之前,要将暂存区的变更 commit 或者 stage。
我们按照提示,将变更提交到本地仓库,然后就成功 checkout 到了dev分支。
为什么之前分支修改了 aqi 文件之后,不需要 commit 就能切换到另一个分支,而这次在 master修改了就得先 commit 才能 checkout?
原因就是当时 master 和 dev 分支的HEAD指向的都是3,所以此时两个分支的 aqi 文件都是一样的,不会造成冲突。但是这次修改时,master 分支的 HEAD 指向3,而 dev 分支的 HEAD 指向的是4, 而暂存区的变更是共享的,你在 3 的基础上做的变更,想要共享到4上,岂不是会造成冲突。
在 master 提交之后, 在界面化查看分支情况。
master 和 dev 分支都有了不同的提交信息。
结语
本篇文章脱离图形化界面,在命令行中使用 git 完成各种操作。同时也基于 git 的基本操作命令,通过实际操作对 git 中工作区域进行了一个解析。在 git 中除了常见的 add、commit,也有 merge、rebase、stage 等操作,这些命令的具体用法也值得探究一下。