Skip to main content

Git的再反省

· 6 min read

本文在于回顾Git的学习,以及一些命令的复习。

什么是Git

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方式。 从概念上来说,其它大部分系统以文件变更列表的方式存储信息,这类系统(CVS、Subversion、Perforce、Bazaar 等等) 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (它们通常称作 基于差异(delta-based) 的版本控制)。 Git 对待数据更像是一个 快照流

首先Git是一个版本控制系统,但是Git对待数据的方式又与其他版本控制工具不同

下文是Advanced Git Kit1一文的学习笔记

git commit

用于提交我们的更改

创建完美的提交

如果我们只要修改发生,就塞进提交里去,提交就会失去很多价值。提交和提交之间的分隔变得很随意,似乎没有理由将更改放入某一个提交而不是另一个提交中。之后再看这些提交,比如当你的同事试图搞清楚修改了什么,就像在家里翻箱倒柜找东西一样,很难找到想要的东西,这并不是一个好的思路。

我们最好做的是只在提交中放入相关的内容中,制定更多的计划和规则。最终我们会得到非常有价值的奖励: 干净的提交历史!这些提交可以帮助我们理解发生了什么,有助于以可理解的方式解释复杂的变化。

关注暂存区

说来简单,但是我们常常忽略暂存区中的内容,一次简单的git add .接受了所有的本地更改并将其标记为下一次提交。太过于简单粗暴了,我们最好停一下看看是否真的是一类提交,而不应该把它拆成两次或者三次的提交。

git add -p index.html该命令指示对文件进行“补丁级别的检查”,Git会帮我们检查文件中的所有更改,然后问我们,对于每个块是否要添加到暂存区。

提供有价值的提交信息

如果没有规范的提交,最后我们就得依靠脑力一步一步回溯这个提交意味着什么。这并没有发挥Git的完全实力一个好的提交最好具备

  • 有一个简明扼要的subject line总结变更
  • 有一个描述性的message body,简洁的解释了最重要的事实
    • 提交后项目发什么了什么变化?
    • 做出这种变化的原因是什么?
    • 有什么需要注意的吗?关于这些变化还有其他人应该知道的吗?

分支策略

几乎所有的版本控制系统都有某种类型的分支支持,分支意味着我们可以创建一个基于父节点的、全新的、独立于主分支的容器,然后在那里工作。通过这种方式我们可以实现不破坏生产代码的情况下做出新的尝试。Git的分支模型非常强大,快速且轻量,在分支之间来回切换的速度和创建或删除分支一样快。

集成变更和结构化发布

当我们考虑如何选择分支的策略时,最好同时想好要如何集成变更和如何构建发布开始。下面我们来了解两种不同的策略

  • 主线开发
  • 状态分支、发布分支和特性分支

第一种选择是将自己的工作和团队的工作集成在一起

第二种选择是收集自己的工作并发布,即多个不同类型的分支进入预发阶段。

主线开发

这种方法的座右铭是"总是集成",只有一个单独的分支,所有人都在主线上开发。这是一种简单的抽象,在现实中很难实现,除非团队里的每一个人能遵守前文提到的完美的提交,且要保证提交相对较小。

状态分支、发布分支和特性分支

这种方法在于创建多个不同的分支,每个分支的职责是不同的。举个例子:新代码和实现代码保存在自己拉出来的分支里,完成流程后合并。

其中又有

  1. 长期分支
  2. 短期分支

合并冲突

不要畏惧发生合并冲突,如果你忘记了合并时错误的原因也可以使用git status重新提醒

如何撤销合并冲突并重新开始

  • 解决冲突
  • 中止或撤销导致冲突的操作

在解决冲突之前,我们最好先知道如何撤销和重新开始(这会让你安心点),只要在后续加上--abort参数,举个例子git merge --abortgit rebase --abort,就可以撤销合并且恢复到冲突发生之前的状态

Rebase和Merge

我们最好先了解这两个命令

  • git merge
  • git rebase

git merge

要将一个分支合并到另一个分支,可以使用git merge命令。假设在ranch-B上有一些新提交,现在我们想把这个分支合并到另一个分支branch-A中。为此,可以这样输入:

$ git checkout branch-A
$ git merge branch-B

git rebase

我们想要将branch-B的更改集成到branch-A中,但这次是用rebase,而不是合并。实际的Git命令非常简单:

$ git checkout branch-A
$ git rebase branch-B

git cherry-pick

前面讨论了rebase和merge。虽然git mergegit rebase之间有一些不同,但这两个命令的目标是相同的: 将一个分支的更改集成到另一个分支。

今天我们来看看git cherry-pick,理解它是怎样允许我们将任何分支中被选中的、单独的提交集成到当前的HEAD分支中。这与git mergegit rebase有很大的区别,两者都只能集成来自指定分支的所有新提交。

将提交转移到另外一个分支

Peferences

Loading Comments...