如何正确使用Git版本管理工具

  • Git 是什么?Git 是目前世界上最先进的分布式版本控制系统。
  • 那什么是版本控制系统呢?我们都有过用 Word 写论文的经历,有时候我们想删除某个段落,但是又担心后续用到找不回来了,那么怎么办呢?我们通常会将当前文档另存为一个文档,然后接着修改文档,随着修改次数的增加,我们的文档会越来越多,当过了一个月后,我们再想找回某个被删除的的段落,但是记不清楚在哪个文档了,只好一个一个去找,甚是麻烦。
  • 而 Git 可以帮我们自动记录每次的改动,并且可以和其他人共同协作,如果想查看某次改动,只需要在打开 Git 历史记录,岂不是很方便。

一、Git 和 SVN 的比较

1. SVN

  • SVN是集中式的版本控制系统。
  • 版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,活干完了,再推送给中央服务器。
  • 集中式版本控制系统最大的缺点就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个几 MB 的文件就需要好几分钟。

2. Git

  • Git是分布式的版本控制系统。
  • 分布式版本控制系统没有中央服务器,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。如果你和另一个人同时修改了文件A,只需把各自的修改推送给对方,就可以互相看到对方的修改了。
  • 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了没事儿,从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

二、安装Git

Git 的安装比较简单,我们看下如何在 liunx、macos 和 Windows 中安装Git。

1. linux

如果你是用的是 Debian 或者 Ubuntu Linux,可以直接通过以下命令进行安装
sudo apt-get install git
如果是其他 Linux 版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./configmakesudo make install这几个命令安装就好了。

2. macos

如果你在使用 macos 做开发,我们可以通过如下方式进行安装。
  • 使用 homebrew
    首先我们需要安装
    homebrew,具体方法请参考 homebrew 的文档:http://brew.sh/。
    然后,输入如下命令即可安装完成
brew install git
  • 使用 MacPorts
    首先,我们需要安装
    MacPorts,具体方法请参考:https://www.macports.org/install.php。
    然后,输入如下命令即可安装完成
sudo port install git
  • 通过 Xcode
    从 AppStore 安装 Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。

3. Windows

在 windows 中使用 Git,直接去官网下载安装包,按照指引安装即可。官网下载地址:https://git-scm.com/downloads。

4. 安装后的配置

最后,安装完成后,还需要进一步配置你的名字和Email:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

三、初始化版本库

      版本库又名仓库,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建版本库也非常简单。
  • 首先,我们需要找一个目录,比如Users/casey/workspace/gitDemo
  • 然后,执行如下命令即可
git init
      这样,Git 仓库就建好了,我们发现当前目录下多了一个.git的目录,这个目录是 Git 来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把 Git 仓库给破坏了。

四、两步提交法

把一个文件放到 Git 仓库只需要两步,俗称“两步提交法”:
  1. 用命令git add告诉 Git,把文件添加到仓库
git add readme.txt
注意:如果你想添加当前目录所有改动的文件到 Git,可以使用 git add .
  1. 用命令git commit告诉 Git,把文件提交到仓库
git commit -m "add a readme file"
-m参数后面输入的是本次提交的说明,可以输入任意内容,这样你就能从历史记录里方便地找到改动记录。
为什么 Git 添加文件需要addcommit一共两步呢?因为 commit 可以一次提交很多文件,所以你可以多次 add 不同的文件。比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files"

五、时光隧道

1. git status 和 git diff

上文我们已经向 Git 添加并提交了一个 readme.txt 文件。我们现在将内容修改成如下所示:
I modified a readme.txt file
然后我们使用如下命令看下修改的状态
git status

从上面的命令输出结果得知,readme.txt 被修改过了,但还没有准备提交的修改。
如果能看看具体修改了什么内容,那就更好了。这时候就要用到
git diff这个命令了:
git diff readme.txt
git diff顾名思义就是查看 difference,显示的格式正是 Unix 通用的 diff 格式。
从以上结果可以看到,我们在 readme.txt 中添加了一行文本:
I modified a readme.txt file
接着,如果确认内容无误后,我们可以继续使用上一个步骤中的两步提交法,提交修改的内容。
提交后,我们再用
git status命令看看仓库的当前状态:
git status
Git 告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。
小结
  • git status可以查看当前仓库状态
  • git diff可以查看当前修改的提交内容

2. 版本回退

目前,我们已经学会了修改文件,然后把修改提交到 Git 仓库,我们再来修改一次,修改成如下内容:
I modified a readme.txt file again
然后我们再使用两步提交法提交到 Git 仓库。
截止目前,我们已经将 readme.txt 修改两次了,分别称为版本1和版本2。
版本1:add a readme file
I modified a readme.txt file
版本2:add a readme file again
I modified a readme.txt file again
那我们怎么查看修改的历史记录呢?这里要用到一个新的命令:git log
git log
git log命令显示从最近到最远的提交日志。如果嫌输出信息太多,可以试试加上--pretty=oneline参数:
git log --pretty=oneline
好了,我们现在准备把 readme.txt 回退到上一个版本,怎么做呢?
  • 首先,确定回退的版本
    Git 必须知道当前版本是哪个版本,在 Git 中,用
    HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写100个^数不过来,所以写成HEAD~100
  • 然后,使用git reset进行回退
    比如,我们输入如下命令:
git reset --hard HEAD^
我们看下回退的结果:
cat readme.txt 
I modified a readme.txt file
果然被回退到上一个版本了。
我们再用
git log看下当前 Git 仓库的状态。
git log
      最新的那个版本已经看不到了!好比你从现代穿越到古代了,想再回去已经回不去了,肿么办?
      别担心,在 Git 中,总是有后悔药可以吃的。如果我们回退到了上个版本,再想回到最新版本,我们只需找到最新版本的
commit id就可以了。Git 贴心的为我们提供了一个命令git reflog用来记录你的每一次命令:
git reflog
从上述结果可以看到,最新版本的 commit id 是:862c07a。
然后我们再使用如下命令,就可以恢复到最新版本了。
git reset --hard 862c07a
小结:
  • HEAD指向的是当前版本,使用git reset --hard commit_id可以在不同的历史版本中任意穿梭。
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

3. 工作区和暂存区

  • 工作区(Working Directory)
    就是你在电脑里的目录,比如我的 gitDemo 文件夹就是一个工作区
  • 版本库(Repository)
    工作区有一个隐藏目录
    .git,就是Git的版本库。
    Git 的版本库里存了很多东西,其中最重要的就是称为
    stage的暂存区。
  • 暂存区(Stage)
    当我们用
    git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    当我们用
    git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建 Git 版本库时,Git 自动为我们创建了一个 main 分支,所以,现在,git commit就是往 main 分支上提交更改。

4. 撤销修改

我们再修改一次 readme.txt,这次我们不小心输入了一个单次”again“,实际情况可能会修改的非常多。我们想撤销本次修改的所有内容,怎么办呢?
我们可以用
git restore这个命令来撤销本次修改。
git restore readme.txt
执行完这个命令后,我们发现,误写的一个 again 已经去掉了。
      如果说,我们不仅修改了内容,还将修改的内容添加(git add)到暂存区了,但是还没提交,这时想撤销怎么办?
      我们可以用
git restore --staged这个命令来撤销添加到暂存区的操作。
git restore --staged readme.txt
然后再使用git restore命令来撤销修改的内容。
git restore readme.txt
我们可以看到误写的 again 也去掉了。

5. 删除文件

在 Git 中,删除也是一个修改操作。我们先通过两步提交法添加一个test.txt到 Git。
然后我们在文件系统中删除这个 test.txt 文件。
现在你有两个选择:
  • 一是确实要从版本库中删除该文件,那就用命令git rm或者git add删掉,并且git commit。这样 test.txt 就从 Git 仓库中删除了。
  • 二是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。
git restore test.txt

六、远程仓库

上述演示如何在一个仓库中管理文件及文件历史。
      Git 是分布式版本控制系统,同一个 Git 仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
      实际工作中,我们会找一台服务器,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
      如果大家听说过一个叫
GitHub网站,那就不难理解了。这个网站就是提供 Git 仓库托管服务的,所以,只要注册一个 GitHub 账号,就可以免费获得 Git 远程仓库。实际工作中,我们会搭建 GitLab 作为公司的远程仓库。
有了远程仓库,再也不用担心我的硬盘了,我们可以随时随地的修改我们的代码了

1. 添加远程仓库

      假设我们已经在本地创建了一个 Git 仓库,名字叫gitDemo,又想在 GitHub 创建一个 Git 仓库,名字也叫 gitDemo,并且让这两个仓库进行远程同步。
  • 我们可以在本地的 gitDemo 目录下执行如下命令,将本地仓库和远程仓库同步:
git remote add origin git@github.com:eyesmoons/gitDemo.git
  • 下一步,就可以把本地库的所有内容推送到远程库上:
git push -u origin main
由于远程库是空的,我们第一次推送 main 分支时,加上了-u参数,Git 不但会把本地的main 分支内容推送的远程新的 main 分支,还会把本地的 main 分支和远程的 main 分支关联起来,在以后的推送或者拉取时就可以简化命令。

2. 从远程仓库克隆

上次我们讲了先有本地库,后有远程库的时候,如何关联远程库。
现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
当我们在 Github 中创建了一个仓库,我们可以使用如下命令克隆仓库到本地:
git clone git@github.com:eyesmoons/gitDemo2.git

七、分支管理

      分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
      现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

1. 创建和合并分支

  • 我们创建dev分支,然后切换到dev分支:
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
然后,用git branch命令查看当前分支
git branch
git branch命令会列出所有分支,当前分支前面会标一个*号。
现在,我们切换到 main 分支,把 dev 分支的工合并到 main 分支上:
git checkout main
git merge dev
合并完成后,就可以放心地删除 dev 分支了:
git branch -d dev
小结:
  • 查看分支:git branch
  • 创建分支:git branch branchName
  • 切换分支:git checkout branchName
  • 创建并切换分支:git checkout -b branchName
  • 合并某分支到当前分支:git merge branchName
  • 删除分支:git branch -d branchName

2. 解决冲突

      当我们使用git merge合并分支时,有可能出现冲突,这时候需要我们手动解决冲突,然后再重新提交。
      Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,<<<<<<< 和 ======= 之间是远程仓库中的内容,======= 和 >>>>>>> 是我们本地修改的内容。我们修改后保存。
然后再使用两步提交法重新提交修改,即可解决冲突。

3. bug分支

      软件开发中,bug就像家常便饭一样。有了bug就需要修复,在 Git 中,由于分支是如此的强大,所以,每个 bug 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
      当你接到一个修复一个代号101的 bug 的任务时,很自然地,你想创建一个分支 issue-101 来修复它,但是,等等,当前正在 dev 上进行的工作还没有提交。并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
      幸好,Git还提供了一个
stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
git stash
当我们解决完 bug 后,再回到 dev 分支,使用如下命令恢复暂存的内容:
git stash pop
你可以多次 stash,恢复的时候,先用 git stash list 查看,然后恢复指定的 stash,用命令:
git stash apply stash@{0}

往期推荐

通俗易懂的 Hbase 原理揭秘

正则表达式其实很简单

如何使用 Kafka Connector 操作 Kafka

Flink CDC零代码实现数据同步实践

kafka 数据快速接入 Apache Doris

Flink CDC数据接入Apache Doris实践

基于Flink和Doris构建的实时数仓方案实践

EasyRules规则引擎工具类

请使用浏览器的分享功能分享到微信等