一直以来专注代码,而忽略了学习版本工具。在当下,是一个协作的时代,一个人的力量很难完成一个任务。任务被拆分很多,有的是需要多人并行来加速完成。在软件开发有关分布式协作显得格外重要。
git 的由来
2005 年 4 月 Linus Tovalds 不满当时任何开源的版本控制系统,才亲身开发 git。
版本库,分布式工作的基础
版本库本质上是一个高效的数据存储结构而已
- 文件(blob)
- 目录(tree)
- 版本(commit):
简化分支的创建与合并
git 是什么?
Git 是一个版本控制系统。版本控制系统设计用于跟踪文件随时间变化状态的一款软件
安装 git
创建版本库
git init
在项目目录下运行该命令通常会创建一个隐藏 .git 的隐藏目录,在其中创建一个版本库。
提交两步走
我们通常的提交都是分两步走,通过 add 和 commit 来完成一次提交。
- add : 命令来进行注册,将所有修改纳入下一次的提交,将修改内容纳入到一个缓存区。这个缓存区通常被叫做暂存区
- commit : 创建一次提交
- stash
某些事情进行到中间的时候,也就是新功能开发过程中,突然线上的代码出现bug 需要快速修复。这个时候 stash 就派上用场。可以将工作区和暂存区中修改保存在到存储栈的缓存区。
git stash pop
来将栈顶的修改恢复到项目中
git stash list
通过该命令可以查看存储栈中的内容
stash@{0}: WIP on (no branch): 4dac988 commit noce more
stash@{1}: WIP on (no branch): 4dac988 commit noce more
- diff
在每次 add 之前可以使用 diff 来查看文件修改情况。
格式化日志输出
通过
git log
我们可以查看项目提交的历史,为了便于观察和阅读 log 输出的历史版本。我们可以通过添加参数来控制显示的格式
git log --oneline
git log --graph --oneline
通过 --graph 选项来显示各个提交之间的关系
分支
为什么要需要分支呢?
- 并行开发
- 修复旧版本中的 bug
创建一个分支
git branch features
切换到 features 分支
git checkout features
然后修改 index.js 文件添加console.log("features one dev")
console.log("hello world")
console.log("features one dev")
提交新开发的内容
console.log("hello world")
console.log("features one dev")
console.log("features two dev");
console.log("features three dev")
依次重复上面提交的动作,来完成一次又一次新功能的提交。
d96c3eb (HEAD -> features) commit features three dev
7ef2ada commit features two dev
480d9c5 commit features one dev
8c048fe (origin/master, origin/HEAD, master, dev) first commit
1c639bc (origin/dev) Update README.md
0205991 Initial commit
好现在我们发现在 features one 有 bug,需要修复代码
git branch FeatureOneBug 480d9c5
在 features one 提交基础建立分支,然后在通过 checkout 命令切换到该分支上进行修改
git checkout FeatureOneBug
修改 index.js 文件中有关 features one 的 bug。
console.log("features one dev modified")
修复完毕后提交代码,然后切换回 features
git checkout features
然后将 FeatureOneBug 分支中 index.js 修改合并到 features 分支
git merge FeatureOneBug
merge 命令进行分支合并是 Git 中最重要的操作之一。merge 命令应能自动对分支进行合并,完全不要用户交互。但是这是怎么做到的呢?
冲突
编辑冲突
当 Git 遇到了自己无法解决的冲突,就会显示以下错误,提示用户手动修改后再次提交
console.log("hello world")
<<<<<<< HEAD
console.log("features one dev")
console.log("features two dev");
console.log("features three dev")
=======
console.log("features one dev modified")
>>>>>>> FeatureOneBug
冲突标志
<<<<<<< HEAD
首先是这些被修改的行当前分支的内容
>>>>>> FeatureOneBug
是在另个一分支上修改的内容
解决冲突
可以借助 git mergetool
或其他第三方工具来解决冲突,或者手动方式来解决冲突,解决冲突后提交即可。
快进合并
通过两个示例来解释一下,有两个分支,分别是 a 和 b,developers 都在 b 分支上开发提交版本,a 假设是我们版本分支,没有问题后会将 b 上合并到 a 上
git checkout a
git merge b
自动化不断的进入,内容冲突是 Git 无法识别和处理的冲突,如何通过干预来解决这些内容冲突是我们为了实现自动化部署上需要考虑和话费一些心思来解决的问题。
- 借助工具来尽早地解决内容冲突
- 设计清晰接口,降低代码耦合度