Skip to main content

git的一些回顾,及git flow思想

前言#

研一进了项目组就开始用git,用了很久也只是用一些基本的 git pullgit add .git commit -m ""git push,感觉这些命令就够日常开发工作了。最近重新整理了git,看了一下git pro这本书,懂了一些git的底层原理。在这里记录一下重新对git的一些认识。此外,这篇文章还会简单介绍一种git flow的开发理念。

每一次commit(提交),就是一个版本#

在git仓库中,有三个区域,这是我自己的理解哈,可能用语不是那么专业。——工作区、暂存区、和仓库区。

git area 工作区就是你的当前项目工作空间。当开发者进行了一些修改,执行git add file之后,修改后的文件就会进入暂存区。

开发到一定程度,某个功能开发完毕后,执行git commit后,就会从暂存区移动到仓库区。实际上每次commit就是提交一个版本,git会对所有修改过的文件进行SHA-1算法,压缩成一个40个字符的字符串,每次提交完成后控制台会返回一串字符,实际上就是这个字符串的前七位。然后将文件的快照存储起来。

每个分支实际上就是一个指针,指向某个版本,也就是某次提交的指针。理论上只要知道某次提交后返回的那串字符,就可以找到那个版本。(只要你本地没删底层的东西)

git的merge(合并)与rebase(变基)#

使用git最核心的还是版本控制,vcs。允许开发者设置不同的分支来进行开发。每个分支可能是有不同的功能。当功能开发完毕后,需要合并到主干上,就需要用到这两个命令——merge和rebase。

  1. merge
    比如当前开发者在master上执行下列命令
git checkout -b devecho "this is my test in dev" >> READMEgit add .git commit -m 'change README in dev branch'git checkout mastertouch main.jsgit add .git commit -m 'add new file main.js'git merge dev

以上操作会先建立一个dev分支,在其上修改之后,完成了新功能,想要在master分支上添加新功能。就可以使用merge,将在dev分支添加的功能融合到master中。
注意merge是三方的融合,不只是dev和master的融合。git会先找到dev的祖先,也就是从master中新建的那个版本A,然后融合修改后的dev分支、A版本、修改后的master版本。最后生成一个新版本B,并让HEAD指针指向B。(HEAD指针总是指向当前的分支)
git merge

  1. rebase
    rebase的功能叫做变基,顾名思义,是要改变其基石,也就是之前的指针。功能上是融合A和B两个分支,实际上是丢弃(比如说)B版本上进行的一些提交,把这些提交当做补丁,在A版本上重新提交一次。但是这是两批不同的提交,所以说是会丢弃。
    代码如下
git checkout -b testRebaseecho "this is rebase magic" >> READMEgit add .git commit -m 'add sth in README'git rebase msatergit checkout mastergit merge testRebase

git rebae

如果使用rebase,必须在远程仓库没有的版本(commit后的提交)进行,否则使用了rebase之后会将这些版本,比如A版本丢弃,其他协同开发者的项目可能就是基于A版本的。某人使用rebase后,A版本的内容变基到了别的分支上,内容是一模一样的,但是版本却不同了。其余的开发者就会造成巨大的混乱。
这里引用一下git pro的原文:不要对在你的仓库外有副本的分支执行变基。如果你遵循这条金科玉律,就不会出差错。 否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你。 哈哈,虽然搞笑,但是也能看出来乱用rebase的混乱。

git flow思想#

git flow刚开始我以为是一个软件,也确实下载到了。后来才意识到这是一种思想。使用了git flow之后,越来越觉得以前在项目组开发的时候使用git是多随意,完全就是在master,或者某个特定的分支上进行开发,然后pull、push。实际上这样很不利于项目的维护。下面介绍一下git flow思想。

git flow中,项目存在两个长期分支:master和develop。任何时候在master中拿到的都是稳定的版本。正常的开发都是在develop版本上开发,所以develop分支普遍会超前master很多。
其次,项目会分为几种短期版本:功能版本(feature branch)、补丁版本(hotfix branch)、预发版本(release branch),一旦开发完成,他们就会合并到master或者develop中,然后被删除。

git flow

问题出现#

基本上每个人用一个git账号就够了,但如果在github上用一个账号,在某个gitlab上又需要一个账号,在不同的工作场景怎么切换呢?

切换用户和邮箱#

使用如下命令可查看当前的用户名和邮箱

git config user.name   //查看用户名git config user.email  //查看邮箱

如果是使用https方式clone文件的话,可以直接需改邮箱即可。

git config --global user.email "youremail@111.com"

增加秘钥#

修改邮箱的话,每次都要修改,可以添加配置文件,增加一个秘钥,同时需要在github或者相应的gitlab上添加相应的公钥。

  1. ~/.ssh/目录下,新建config文件
  2. 生成相应的秘钥
ssh-keygen -t rsa -C "rain@163.com"   //这里要填你github相应的邮箱
  1. 在文件内填写Host和IdentityFile配置如下
HostName git-githubHost github.com www.github.comUser LRQIdentityFile ~/.ssh/id_rsa
Host gongsi.comIdentityFile ~/.ssh/gongsi_id_rsa

HostName是仓库网站的别名,随意取
Host是仓库网站的域名
User是仓库网站上的用户名
IdentityFile是私钥的绝对路径

文件夹递归处理问题#

至此就结束了。
今天还遇到一个问题,干脆也写出来。在使用npm安装包的时候,有时候会出现没有access访问权限,是因为默认的新建的文件夹都是没有写权限的,给文件夹加上写权限即可

chmod -R 755 /folder

-R就是目录下的所有文件


2020.01.04 晴
written by Rain