本文旨在探讨一下Git 的正确使用姿势以及相关实践。
Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
工作原理 / 流程:
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)。
SVN与Git的最主要的区别?
集中版本控制 SVN
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。
所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS
分布式版本控制 Git
每个人都拥有全部的代码。
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
安装 Git
要开始使用 Git,你需要先安装 Git 的客户端软件。你可以从官方网站(Git - 安装 Git (git-scm.com))下载适合你的操作系统的安装包,或者使用你的包管理器来安装。例如,在 Windows 系统上,你可以下载并运行 Git for Windows 的安装程序。
安装完成后,你可以使用 git --version 命令来检查 Git 的版本:
git --version
git version 2.33.0.windows.2
配置 Git
在使用 Git 之前,你需要配置一些基本的信息,例如你的用户名和邮箱地址。这些信息会被用来标识你的提交。你可以使用 git config 命令来配置这些信息,例如:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
这里使用了 --global 选项,表示这些配置是全局的,也就是对所有的仓库都有效。如果你想针对某个仓库进行特定的配置,可以省略 --global 选项,并在该仓库内执行命令。
本地仓库搭建
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
1、创建全新的仓库,需要用Git管理的项目的根目录执行:
# 在当前目录新建一个Git代码库
$ git init
2、执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
克隆远程仓库
1、另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地。
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url]
添加和提交文件
当你在仓库中创建或修改了一些文件后,你需要将这些变更添加到暂存区(staging area),然后提交到本地仓库(local repository)。暂存区是一个用来保存你即将提交的变更的临时区域,你可以在这里对你的变更进行筛选和组织。
要将文件添加到暂存区,你可以使用 git add 命令,指定文件名或通配符,例如:
git add README.md
git add *.txt
这里会将 README.md 文件和所有以 .txt 结尾的文件添加到暂存区。如果你想将所有的变更都添加到暂存区,可以使用 . 作为参数,例如:
git add .
要将暂存区中的变更提交到本地仓库,你可以使用 git commit 命令,并指定一个提交信息,例如:
git commit -m "Initial commit"
[master (root-commit) 0a1b2c3] Initial commit
2 files changed, 10 insertions(+)
create mode 100644 README.md
create mode 100644 hello.txt
这里会将暂存区中的所有变更提交到本地仓库,并使用 "Initial commit" 作为提交信息。
-
git add 文件可以将工作区的指定文件的修改同步至暂存区;特别地,在仓库根目录下执行git add .可以将所有修改同步至暂存区; -
git commit [-m "提交消息"]可以将暂存区的修改作为一次提交,追加到当前分支的最新提交(即 HEAD)。
推送和拉取变更
当你在本地仓库中提交了一些变更后,你可能想要将这些变更推送(push)到远程仓库(remote repository),以便与其他人共享和备份。远程仓库是一个位于网络上的仓库,通常托管在一些平台上,例如 GitHub、GitLab、Gitee 等。
要将本地仓库中的变更推送到远程仓库,你可以使用 git push 命令,并指定远程仓库的名称和分支的名称,例如:
git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 283 bytes | 283.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/yourname/my-project.git
* [new branch] master -> master
这里会将本地仓库中的 master 分支推送到远程仓库 origin 中的 master 分支。origin 是默认的远程仓库名称,如果你想指定不同的名称,可以在克隆或添加远程仓库时指定,例如:
git clone https://github.com/yourname/my-project.git -o upstream
git remote add upstream https://github.com/yourname/my-project.git
这样就会将远程仓库的名称设置为 upstream。你可以使用 git remote -v 命令来查看当前有哪些远程仓库及其地址。
git push会将本地的版本库的分支推送至远程仓库;git fetch则相反,会从远程仓库下载最新的分支数据到本地;git pull则还会覆写你的工作区。
创建和切换分支
Git 的另一个核心概念是分支(branch),它是一个用来标识某个提交及其历史的指针。分支可以让你在不影响主线(master)的情况下,创建一个独立的开发环境,用来实现某个功能或修复某个问题。当你完成了开发后,你可以将分支合并到主线上,或者丢弃分支。
要创建一个新的分支,你可以使用 git branch 命令,并指定分支的名称,例如:
git branch feature-x
这里会创建一个名为 feature-x 的分支,并指向当前的提交。要查看当前有哪些分支,你可以使用 git branch -v 命令:
git branch -v
* master 0a1b2c3 Initial commit
feature-x 0a1b2c3 Initial commit
这里会显示所有的本地分支及其最新的提交信息。当前所在的分支会用一个星号(*)标记。
git branch 可以创建和管理新的分支。在实践中,修改往往不会直接在主分支上进行,这样可以确保主分支永远拥有稳定的代码。当我们开始一个新功能的研发或是 bug 修复时,会先创建一个新分支,然后在上面进行开发,在确定无误后再将修改提交到主分支,最后删除新建的分支即可。每个人都可以同时在各自的分支上进行开发,并在最后进行合并,这十分利好团队合作。
合并和变基分支
当你在一个分支上完成了开发后,你可能想要将这个分支合并到另一个分支上,例如将 feature-x 合并到 master。Git 提供了两种方法来实现这个目的:合并(merge)和变基(rebase)。
合并是将两个分支的最新提交及其共同祖先的差异应用到目标分支上,从而创建一个新的提交。例如,如果你想要将 feature-x 合并到 master,你可以使用以下命令:
git checkout master
git merge feature-x
这里会先切换到 master 分支,然后将 feature-x 分支合并到 master 分支上。如果没有冲突,合并会自动进行,并创建一个新的提交,称为合并提交(merge commit)。如果有冲突,你需要手动解决冲突,并提交合并结果。
变基是将一个分支上的一系列提交重新应用到另一个分支上,从而创建一条线性的历史。例如,如果你想要将 feature-y 变基到 master,你可以使用以下命令:
git checkout feature-y
git rebase master
这里会先切换到 feature-y 分支,然后将 feature-y 分支上的提交重新应用到 master 分支上。如果没有冲突,变基会自动进行,并创建一些新的提交,称为变基提交(rebase commit)。如果有冲突,你需要手动解决冲突,并继续变基过程。
-
git checkout可以将版本库的特定提交与分支同步到暂存区与工作区,这使得你可以随时随地切换到历史代码现场或者是其他人的最新开发进度 -
git merge则负责实现上面提到的分支的合并。这条指令会生成一条merge commit,其中包括了整个分支上的提交记录,然后将其提交到指定的分支,此时你用git log会看到一个分叉的 Git 提交关系; -
git rebase叫变基,也负责分支修改的合并,不过原理不太一样:它会基于目标分支的最新状态重写当前分支的所有提交(相当于从目标分支合并到当前分支),然后修改主分支的指针,使它直接指向重写后的最新提交,在git log中看来就是一条笔直清爽的线。但使提交记录更整洁是有代价的:它会破坏当前分支的历史记录,此时如果有人已经依赖于当前分支的提交进行开发,则他们的工作很可能会作废,无法再提交,从而带来麻烦。因此 Git 官网给出了一条准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
总结
Git是一个功能强大和灵活的版本控制系统,还有很多高级特性和扩展可以探索。持续学习和探索Git,了解更多的技巧并进行充分的实践,不断提升自己的能力,提高我们的开发效率。