前进的路上从来不缺牛逼的人!!!!!!!!!
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下
集中式和分布式的区别:
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
开始学习git
1》安装
1. linux上安装git
先输入git 看看系统是否安装git 如果没有 命令:yum install git
2. windows上安装git
下载地址:https://git-scm.com/download/win 直接安装就ok
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config命令的 --global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
相当于给自己的git起个名字 注册个邮箱
2》版本库
1. 新建
一个空目录,进去目录里,执行git init 这时目录下会有一个.git目录,则代表新建版本库成功,如果找不到可能是被隐藏了,这个问题自己解决
2.简单练习下添加文件并提交到自己的版本库
1) 新建一个文件 test.txt
2) git add test.txt 把文件添加到暂存区(可以理解为文件到版本库中需要经过的缓存区)
git add . 是把目录下所有文件添加到暂存区
3)git commit -m "写一个这次提交的简单说明" 这样我们就把文件提交到了版本库里
3》为我们自己犯下的错买单命令
1. git status 使用场景
1)我们修改完文件还没有添加到暂存区时(修改完后好长时间了忘记修改什么了) 这时我们可以使用git status查看我们都修改哪个文件了 modified: 文件名
2) 我们修改完文件并且添加到了暂存区 这时用git status查看 Changes to be committed则有提示我们应该把暂存区的文件提交到版本库了
3)我们修改完文件后执行了git add 和 git commit后 用git status 查看有提示nothing to commit, working directory clean 说明我们的工作区是干净的 没有需要提交的
2. 版本回退 命令 git log git rest --hard
1) 在工作区里每次的git commit -m '这次提交的简要说明' 都会生成一个版本 我们可以通过git log查看 包括的信息(commit:提交的一个唯一码id Author:提交者 Date:提交日期 还有-m的简要说明信息)
2)如果要回退到任意版本 执行命令 git rest --hard (commit码的前六位或更多位) 如果要回退到上一个版本 执行快捷命令 git rest --hard HEAD^ 如果又想回去了 则执行命令git reflog 则可看到每次执行命令的id 再用git rest --hard (commit码的前六位)再回到自己想到的步骤里
3. 撤销修改 命令:git checkout -- file
1)我们在工作区修改了文件 想要撤回 两种情形,第一,在工作区修改了文件还没添加到暂存区,这是想要撤销修改则用命令git checkout -- file就会撤回到修改前 第二,在工作区修改了文件并添加到了暂存区 还没提交版本库 这时文件又做了修改 想要撤回 用命令git checkout -- file 则会撤销到和暂存区里一样 总之,这个命令是让这个文件回到最近一次git commit
或git add
时的状态
2)如果我们在工作区里修改了文件 并且添加到了暂存区里 这时我们想要撤回 先用命令git rest --hard HEAD file把文件从暂存区里撤回,再用git checkout -- file把修改也撤回
经过这样撤销 世界都会太平
4. 删除文件 git rm file
1) 删除文件 git rm file git commit -m '提交说明' 则会删除工作区里以及版本库里的文件
2)删除容易 关键是恢复 如果我们用rm file 删除了文件 这时可以用 git checkout -- file从版本库里恢复文件 如果用命令git rm file git commit -m '提交说明' 把文件从版本库里也删除了 则只能用版本回退命令撤回 git rest --hard (commit码的前六位或更多位)
4》 远程仓库
1. 何为分布式版本控制,就是我们本地都有自己的版本库。为了更好的代码管理,我们需要一个版本库24小时一直运行着,这市就产生了远程仓库(也是一个版本库)我们讲解以github为主,如果要想自己搭建版本库参考链接https://blog.csdn.net/yilukuangpao/article/details/53560472
2. 首先注册一个github账号,在自己电脑里运行 ssh-keygen -t rsa -C "youremail@example.com"生成公钥和私钥,在github上找到设置里的ssh keys 把自己本地的公钥id_rsa.pub放到上边 创建一个版本库“Create a new repo”在自己本地版本库里运行git remote add origin git@github.com:yonghuming/banbenku.git 这句命令是把自己本地版本库和远程库链接起来了,并且起了个名字origin(这个可以自己定义,默认用origin) 接下来就可以用git push -u origin master 把本地的版本库推送到远程仓库(注意:-u为第一次推送需加,不要太在意这个参数,就是把本地仓库内容推上去,并且把本地master主分支和远程关联起来)
3. 也可以先建远程仓库,然后在本地执行git clone git@github.com:yonghuming/banbenku.git克隆本地库
5》分支管理
1. 创建与合并分支
创建分支命令:git branch dev
查看所有分支:git branch (分支前带星号*的就是当前分支)
切换分支: git checkout dev
删除分支:git branch -d dev
创建并切换分支: git checkout -b dev
合并分支:正常会切换到master分支 执行 git merge dev即把dev分支和master分支进行了合并
合并时有一个快速合并git merge dev 直接合并,实际操作是直接把指针指向dev的最新一次commit,另外一个是不用快速合并git merge --no-ff -m '提示信息' dev 这样合并实际操作是相当于在master上做了一次git commit,git log可以看到比快速合并多一次commit信息
2. 解决冲突
有冲突是很正常的,解决冲突需要手工解决,冲突是由于两个人同时操作了一个文件,在合并时发现同一个文件修改了两个地方,git不知道你是要保留那处修改,所以Git会抛出一个冲突,让用户自己决定,手工修改完后,再次提交就OK
为防止在开发中出现冲突,尽可能多人不要同时修改一个文件,自己开发自己的模块就ok,有关联的要相互沟通谁来开发,并且每天早上要把最新代码拉取,半天或一天进行一次提交合并。
3. 分支使用及一些问题
1)修改bug分支,场景:现在正在开发项目中的某一个模块,离开发ok还差一段时间,现在还不能提交。这时接到一个bug修复任务,需要及时修复。这时我们的做法如下
1> 思路:需要先把现在dev的开发环境进行封存(如果不封存的结果就是你把bug分支修改完成后,并且合并到了主分支,然后再回到dev分支时,会发现原来修改的内容都不见了,新建的文件是存在的),然后再开一个分支进行bug修复。
2>实现过程:封存开发环境:git stash
新建bug分支开发:git checkout -b bug
在bug分支上修改完后:git add file git commit -m '修复bug'
切换到master分支进行合并:git checkout master git merge bug
bug分支就是为了修改bug而建,修复完后删除bug分支:git branch -d bug
再次切换到dev分支进行解封继续开发:git checkout dev
解封:git stash apply 删除stash这次记录:git stash drop 两个命令的结合命令为:git stash pop
额外命令:查看stash:git stash list
2)新功能分支,场景:经理派发了一个功能,你开了一个分支gn在开发,当一切ok时git add . git commit -m 'ok' 准备切换到主分支合并时 产品经理后来觉得这个功能不合适,不要了。我们就白干了,火恼的想打人了,可是为了几个破钱也得忍者啊。这是用git branch -d gn删除gn分支时 却报gn分支还没合并 无法删除,代码也tmd找事,这时就得用大招了 git branch -D gn强制删除gn分支了
3)在本地库和远程库之间推送出现的一些问题及命令
查看远程信息:git remote -v
推送分支:git push origin master(分支上的所有本地提交推送到远程库)
4)远程推送分支的冲突场景:两个同事:同事1,同事2。两个人都将远程库的代码git clone到本地了,这时本地两个人都只有一个分支master主分支,同事1要开发,自己新建远程分支dev到本地(git checkout -b dev origin/dev),同事1开发完后git add file git commit -m '提交1' git push origin dev 同事2 新建了一个本地分支(git checkout -b dev),也对同一个文件做了修改 他在提交推送的时候就报错了,推送失败,最新提交和你试图推送的提交有冲突 提示先git pull先拉取下来,可是git pull也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接 命令:
git branch --set-upstream-to=origin/dev dev
再次使用git pull 这次报冲突,打开冲突文件修改再次提交推送就ok了
6》标签管理
1. 使用场景
我们在开发中会发布版本,我们不用把所有代码都复制一遍,再写一个版本号,git提供了很好的标签工具,我们只要给某次的提交commit打一个标签形成一个版本就OK
这张图是tp5的版本管理,大版本用分支管理,小版本用标签管理
2.标签使用
1)新建标签:git tag V1.0 (默认标签是打在最新提交的commit上的)
2) 给上周的某一次提交打标签:首先用git log 找到上周的提交,然后 git tag V0.8 (commit ID)
3) 打一个带有说明的标签 git tag -a V2.0 -m "说明" (commit ID) (-a 标签名 -m 标签说明)
4)查看标签:git tag
5) 查看指定标签的信息: git show 标签名
6)删除标签: git tag -d 标签名 (只是删除了本地的标签)
7)删除远程标签:git push origin :refs/tags/标签名
8)推送标签到远程库:git push origin 标签名
9) 把全部没有推送的标签都推送到远程库: git push origin --tags
7》git 的一些特殊功能
1. 忽略特殊文件
在开发中,我们会遇到有些配置文件是不需要推送到版本库的,这时我们需要把这些文件加入到一个.gitignore文件中。
1)在工作区的更目录下新建一个.gitignore文件,把需要忽略的文件名放进去(一行一个 如果有一类后缀的可以用*.txt类似表示)
2)把文件.gitignore 推送到版本库就ok
3)如果要强制添加某个文件推送时 需要git add -f file 可以查看某个文件为什么添加不上,是那条忽略规则起的作用:git check-ignore -v file
2. 配置别名
有些命令特别长不好记,我们可以用起别名的方法来做,比如:git branch 我们可以通过命令 git config --global alias.bh branch ,这样我们就可以用git bh 来替代git branch git rest HEAD file 用命令 git config --global alias.unstage 'rest HEAD' 我们就可以用git unstage file来代替 git rest HEAD file
其实所有的命令都是写到了.git/config文件里,如果我们不要哪个别名了 打开文件直接删掉就ok
此文章参考链接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
好了 git 的使用就先告一段落,欢迎各位git友前来观看,学习和指点。如有错误的地方,希望能够提出!!!非常感谢