其中github和gitee是基于互联网的,而gitlab是基于局域网的。公司一般使用的是gitlab。
下载安装好git之后,选择一个工作目录,并在该目录右键鼠标,点击git bash here,当然也可以git gui here它是一个图形界面但是由于太丑了,所以一般使用git bash。
git bash的命令和linux是一致的,虽然这里是windows系统。甚至vim也是可以使用的
该操作用于初始化本地库,在终端输入git init后可以在当前目录看到一个.git的文件夹(需要查看隐藏文件)。
注意该文件夹中的内容是不可以修改的创建成功的话就可以进行基本的git操作了。
用于查看当前库的状态:
可以发现出现了三行内容,其中第一行表示的意思是处于master分支中,第二行表示的是还没有提交任何东西,第三行表示的是没有什么需要提交。
这个命令我们在之后的git学习中会频繁的使用到。
使用vim来创建一个test.txt文件,来模拟一下提交过程:
以上是随便写的文件的内容,创建文件之后再使用git status操作:
可以看到test.txt是红色的,表示没有放入暂存区(当前该文件只在工作区存在),并且终端给了提示,使用git add操作将其放入暂存区。
当进行git add操作之后:
此时可以看到test.txt变成了绿色,表示已经将它放入了暂存区,并且给了如下提示:
git rm --cached test.txt
该条指令的作用就是从暂存区删除test.txt,如果删除test.txt会再度变为红色。
该条指令用于从暂存区提交到本地库,通常伴随使用-m选项来写日志
其中提交之后会打印一段话,表示提交成功了,并出现了一个数字b26d1b8,它是版本号的一部分,通常代表版本号。
此时再使用git status可以看到:
第一行表示的是在主分支中,第二条表示的是没有什么可以提交了,并且树时干净的,即没有做任何版本修改。
git reflog输出日志信息,git log也输出日志信息不过更加详细
其中head是一个指针,它指向的是主分支b26d1b8表示的是版本号,master分支指向该版本号。
使用git add和git commit再使用以上方法增加两个版本,这里有一个细节,在修改test.txt并进行commit之后会看到
其中我修改了一行内容,可以发现实际操作是删除了一行并加入了一行,也就是说git是按行对文件操作的,而不能在行内追加。
此时再输出日志信息可以看到:
此时head指针指向的是master分支,master分支指向的是版本3
当处于第三个版本的时候,可以看到test.txt的内容是
如果我们想回退到版本2或者版本1呢?使用以下指令可以回退
git reset --hard 版本号
此时就回退到了版本2,再查看test.txt的内容,发现就是版本2的内容了
那么如果我们此时修改版本2呢?修改后提交的还是版本2吗?显然不是,修改版本2再提交就是第4个版本了:
通过以上的描述我们发现其实是有两个指针的,其中Head指针指向的是分支号,master指针指向的是版本号:
我们还可以在.git/refs/heads/master中看到当前分支以及版本号信息。
要完成一个项目需要做不同的功能,可以将每个功能作为一个分支最终合并分支形成一个完整的项目:
比如在这里,首先将master分支拷贝两个分支branch1和branch2来完成不同的任务,其中branch1完成任务后提交,如果提交后发生了错误,就建立一个新的分支hot-fix来进行紧急修复,修复后再与branch2完成的任务进行合并。
分支的作用有两个:解耦(安全)和并行开发(提高效率)。
使用git branch可以创建分支,使用git branch -v可以查看分支:
*所在的位置就是当前所在的分支。
git merge分为两种情况,一种情况发生冲突,一种情况没有发生冲突,一种是发生了冲突。
发生冲突的意思是两者都对代码的同一个位置进行了修改。
首先来看没有发生冲突的情况:
我们对hot-fix的版本做如上修改。并进行提交到本地库的操作。
然后我们切换到master分支并进行法分支合并,此时可以先查看一下master分支中的内容:
注意,由于master分支是没有做任何修改的,因此合并是不冲突的。冲突的意思是两者都发生了修改:
此时执行git merge指令,注意,当前我们是处于master分支的,是hot-fix分支来找我们进行合并:
合并之后我们发现内容变成了这个样子。
下面来看有冲突合并的例子,即当分支做了修改之后,master的分支代码也进行了修改。
此时还可以分为两种情况,第一种情况是,master和hot-fix没有修改代码的同一个位置,第二种情况是master和hot-fix修改了代码的同一个位置。
注意,修改之后需要进行提交,否则会影响其他分支。
当没有修改代码同一个位置的时候,与没有发生冲突的结果是一样的,这里不作演示了,当修改的是代码的同一个位置的时候:
首先我们将hot-fix分支进行修改。(注意需要提交)
此时我们再切换回主分支,对主分支的倒数第二行增加内容(冲突),再添加一些其他内容,并提交
此时再进行分支合并,可以看到文件的结果变为:
变成了使用<<<<和===以及>>>>来分割的内容,其中既包含主分支的内容,也包含hot-fix分支的内容。
需要程序员手动对代码进行修改之后再进行提交。因为git无法帮助我们自动选择了。
此时我们打开vim将代码修改如下:
然后再进行提交,注意这里还有一个问题,此时如果commit加上文件名就会发生报错:
在commit的时候不能加入文件名就可以提交成功了。
值得注意的是由于是在master进行分支合并,因此是将hot-fix的内容合并到master中,而hot-fix的内容没有发生改变。
远程库操作比较简单,只需要记住三个指令即可:
git clone
git push
git pull
git clone的作用是将别人已经写好并提交的库克隆下来,自己更新迭代之后使用git push提交上去,想得到别人更新迭代的内容只需要git pull即可,这里用一张图来表示执行的顺序:
其中pull作用是拉取修改之后的内容。
git clone与git pull区别
git clone和git pull的区别在于“git clone”是在本地没有版本库时,将远程库整个下载到本地;而“git pull”是在本地有版本库时,从远程库中获取最新commit数据,并合并到本地。
同时在开发时要尽量保证push的内容没有版本冲突。如果不想与本地分支合并,可以使用git fetch操作。git pull=git fetch+git merge
git clone与git fetch区别
而git clone和git fetch的区别在于git clone克隆的是整个远程库。git fetch克隆的是远程库的一个分支。
$ git clone <版本库的url>
$ git pull <远程主机名> <远程分支名>:<本地分支名>
#方法一
$ git fetch origin master #从远程的origin仓库的master分支下载代码到本地的origin maste
$ git log -p master.. origin/master #比较本地的仓库和远程参考的区别
$ git merge origin/master #把远程下载下来的代码合并到本地仓库,远程的和本地的合并
# 方法二
$ git fetch origin master:temp #从远程的origin仓库的master分支下载到本地并新建一个分支temp
$ git diff temp #比较master分支和temp分支的不同
$ git merge temp #合并temp分支到master分支
$ git branch -d temp #删除temp