Git 各指令的本质,通俗易懂

89 阅读3分钟

你是不是还停留在clone、commit、pull、push...的阶段,是不是对rebase心里没底只敢用merge?

Git相比于svn有什么优势呢?

打个比方:"巴拉巴拉写了一大堆代码,突然发现写的有问题,我想回到一个小时之前",对于这种情况Git的优势就很明显了,因为commit的成本比较小并且本地会保存所有的提交记录,随时随刻可以进行回退。

在这并不是说svn的不能完成这种操作,只是Git的回退会显得更加的优雅。Git相比于中央式工具还有很多优点,就不一一列举了,感兴趣的可自行了解。

** 文件状态**

在Git中文件大概分为三种状态:已修改(modified)、已暂存(staged)、已提交(committed)

  • 修改:Git可以感知到工作目录中哪些文件被修改了,然后把修改的文件加入到modified区域
  • 暂存:通过add命令将工作目录中修改的文件提交到暂存区,等候被commit
  • 提交:将暂存区文件commit至Git目录中永久保存

** 提交相关**

前面我们提到过,想要对代码进行提交必须得先加入到暂存区,Git中是通过命令 add 实现

添加某个文件到暂存区:

git add 文件路径

添加所有文件到暂存区:

git add .

同时Git也提供了撤销工作区和暂存区命令

撤销工作区改动:

git checkout -- 文件名

清空暂存区:

git reset HEAD 文件名

提交:

将改动文件加入到暂存区后就可以进行提交了,提交后会生成一个新的提交节点,具体命令如下:

git commit -m "该节点的描述信息"

3.2 分支相关

创建分支

创建一个分支后该分支会与HEAD指向同一节点,说通俗点就是HEAD指向哪创建的新分支就指向哪,命令如下:

git branch 分支名

切换分支

当切换分支后,默认情况下HEAD会指向当前分支,即HEAD间接指向当前分支指向的节点

git checkout 分支名

同时也可以创建一个分支后立即切换,命令如下:

git checkout -b 分支名

**删除分支 **

为了保证仓库分支的简洁,当某个分支完成了它的使命后应该被删除。比如前面所说的单独开一个分支完成某个功能,当这个功能被合并到主分支后应该将这个分支及时删除。

删除命令如下:

git branch -d 分支名

合并相关

关于合并的命令是最难掌握同时也是最重要的。我们常用的合并命令大概有三个merge、rebase、cherry-pick

merge

merge是最常用的合并命令,它可以将某个分支或者某个节点的代码合并至当前分支。具体命令如下:

git merge 分支名/节点哈希值

rebase

rebase也是一种合并指令,命令行如下:

git rebase 分支名/节点哈希值

rebase优缺点:

  • 优点:会使提交历史看起来更加线性、干净
  • 缺点:虽然提交看起来像是线性的,但并不是真正的按时间排序,比如图3-3中,不管C4早于或者晚于C3提交它最终都会放在C3后面。并且当合并发生冲突时,理论上来讲有几个节点rebase到目标分支就可能处理几次冲突

cherry-pick

cherry-pick的合并不同于merge和rebase,它可以选择某几个节点进行合并

命令行:

git cherry-pick 节点哈希值

git.png