今天对git以及github做一个全面的复习。
Git
git简介:
git是世界上最先进的分布式版本控制系统
版本控制系统:
CVS:最早的开源而且免费的集中式版本控制系统
SVN:开源的集中式版本控制系统
在Windows上安装Git
https://git-scm.com/
安装完毕windows版本的git后,在桌面右键点击Git Bush进入命令行。
1.首先为我们的电脑配置名字和邮件地址来区分我们的身份
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
2.创建版本库
版本库又名仓库(repository),可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
1)选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
pwd命令用于显示当前目录
2)通过git init命令,把这个仓库初始化成Git可以管理的仓库
命令执行后相应的文件夹下会出现一个.git目录。如果没有看到.git目录,可以使用ls -ah命令就可以看见了。因为.git目录默认是隐藏的。
3)把文件添加到版本库
随便写一个readme.txt文件
使用命令git add 把文件添加到仓库。
使用命令git commit 把文件提交到仓库。
-m后面输入的是本次提交的说明
为什么Git添加文件需要add,commit一共两步呢?
因为commit可以一次提交很多文件,所以你可以多次add不同的文件。
当readme.txt文件发生改变时,再次提交之后
使用git status 命令查看仓库当前的状态
如果记不清上次对文件做了什么修改,要用git diff 命令来查看
git log命令用来查看历史记录。
版本回退
如果想把文件回退到上一个版本,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
使用命令 git reset –hard head^ 回到上一个版本。
如果又想回到未来怎么办?
如果命令板没有关闭的话,可以在命令板往上滑动看到未来的版本号(commit ID),然后键入命令,
比如:“git reset –hard 3628164”
如果命令面板关掉的话,可以用命令git reflog命令来显示你的每一次操作。然后再根据显示的commitID回到你想回到的地方。
Git工作区和暂存区
工作区(Working Directory):
电脑里能看到的目录
版本库(Repository):
工作区里有一个隐藏的.git目录,是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
我们把文件往Git版本库里添加的时候,是分两步执行的:
1.用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
2.用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
注意:
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
管理修改:
Git比其他版本控制系统设计得优秀,是因为Git跟踪并管理的是修改,而非文件。
所以每次修改一个文件,都要使用git add命令添加到暂存区,再统一或者单个git commit提交到分支。
撤销修改:
当你对一个文件修改完成并且已经提交到工作区,忽然觉得要撤销这次修改可以使用命令 git checkout –file丢弃工作区的修改。
例如:
命令 git checkout –readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销。
这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总而言之就是让这个文件回到最近一次git commit或git add时的状态。
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。前提是你没有把他提交到远程库
删除文件:
在Git中,删除也是一个修改操作
使用命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
Git远程仓库:
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。GitHub这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
有了Github账户以后,可以创建一个repository。
使用
git remote add origin命令 + clone的链接地址。连接到远程仓库。
下一步,就可以把本地库的所有内容推送到远程库上:git push
如图:
注意:
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起只要本地作了提交,就可以通过命令:
$ git push origin master 来提交代码到远程仓库
SSH警告
第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告,这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。之后Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了。
这个警告只会出现一次,后面的操作就不会有任何警告了。
从远程库克隆
使用命令 git clone 加上仓库地址名。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
分支管理:
分支就像平行宇宙,分工明确的团队每个人都会分配不同的任务,大家都可以从总分支上创建一个自己的分支,进行coding,完成任务后再提交到总分支,进行整合。
创建与合并分支:
创建一个分支:
git branch +分支名字
切换到这个分支:
git checkout + 分支名字
可以简化合并命令
git checkout -b + 分支名字
然后可以单独使用命令git branch 查看当前分支。
之后我们就可以在这个新的分支上正常提交。
分支上的工作完成后,我们再使用命令git checkout master
切换回masterf分支。
合并:
把分支上的工作合并到master分支上
使用命令git merge + 分支名字
Fast-forward的意思是这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
把分支提交到主分支进行合并之后,就要删除掉分支
可以使用命令 git branch -d +分支名字
然后用命令 git branch 查看当前分支
解决冲突
当我们在分支上提交一个修改,在主分支上也提交一个修改。从而进行合并的时候就会出现冲突
用git status命令查看冲突的文件,这个时候就要手动修改文件统一一下修改。再进行提交。提交完成后删除掉分支。
用git log –graph命令可以看到分支合并图。
分支管理策略
合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息.
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
分支策略
master分支一般用来发布新版本,是最稳定的。多人工作的时候再在master分支上建立例如dev分支,大家再再dev分支再建立多个自己的分支,最后工作完成时再整合到dev分支上。分布版本时提交到master主分支上。
BUG分支
当马上需要处理一个BUG时,可以使用命令git stash把当前的工作暂时储存起来。解决BUG后再进行工作。
修复BUG时候,首先要确定是在哪个分支上修复BUG。如果是master分支,就在master分支上创建临时分支。例如解决一个问题101使用命令git checkout -b issue -101
解决完问题后,git add git commit 提交后返回到master分支使用命令git merge 进行合并,然后再键入命令git branch -d 删除刚才的那个issue-101分支
修复完BUG之后我们再git checkout +分支名回到之前正在进行工作的分支。
想要查看刚才暂时存储起来的工作进度使用命令git stash list
之后git stash apply进入刚才保存的进度,但是这个暂存区域是没有删掉的,用命令git stash drop来删除。
git stash pop 这个命令是在恢复刚才工作的同时也把暂存区域删除
也可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
Feature分支
当开发软件的时候,会不断有新的功能加进来,但是为了实验性的代码不扰乱主代码,应该建立feature分支,在上面进行开发,完成之后合并起来,再删除该feature分支
如果突然不需要这个新功能了 使用命令 git branch -d +分支名字 这样删除的话,git会报错。我们只能用 git branch -D强行删除
多人协作
当从远程仓库克隆代码时,实际上是git把本地的master分支与远程的master分支接了起来。远程仓库的默认名称是origin
可以键入命令 git remote 查看。
命令git remote -v 查看更多信息。
推送分支
推送分支就是把该分支上的所有本地提交到远程库。
使用命令 git push origin +本地分支
抓取分支
如果从远程仓库clone代码,默认情况下,只会clone master分支。
如果想再远程的其他分支上进行开发的话,例如远程有一个dev分支,可以使用命令 git checkout -b dev origin/dev 进入到远程的dev分支,现在就可以进行修改,然后时不时的
git push origin dev 到远程仓库。
当试图向远程仓库推送的时候,小伙伴同样也对dev分支进行了修改并且推送到远程仓库。这时候会报错。
解决方法是用命令git pull 把小伙伴最近推送的代码pull下来,在本地进行合并,解决冲突,再push到远程仓库。
如果失败的话,很有可能是没有指定本地分支的链接接与远程分支的链接。使用命令git branch –set-upstream branchname origin/branchname 将两个分支连接起来。
pull成功的话,在本地将有冲突的代码解决后在本地完成提交后再推送到远程仓库。
标签管理
发布新版本时候,会在版本库中给这个新版本做上一个标记(标签)。以后不管什么时候,想要读取过去的某个版本,只需读取相应的版本标记(标签)。
创建标签
Vnum(版本号)
给版本做标记的时候,首先要切换到要做标记的分支上
git branch (查看一下都有哪些分支)
git checkout branchname(切换到做标记分支)
然后键入命令 git tag +Vnum
git tag (查看所有做的标记)
忘记打标签?
默认标签是打在最新提交的commit上的
有时候,如果忘记应该打的标签没有打,可以键入命令git log查看历史的commit。找到相应的commit id 然后键入 git tag Vnum commit id。例如 git tag V2.0 3444937
标签不是按时间顺序列出,而是按字母排序的。可以用git show查看标签信息:
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git show可以看到说明文字
可以通过-s用私钥签名一个标签 git tag -s Vnum -m “…..”
签名采用GPG签名,因此,必须首先安装GPG,如果没有找到GPG,或者没有GPG密钥对,就会报错
GPG入门教程
命令git show还可以看到PGP签名信息
操作标签
如果标签打错了 git tag -d Vnum 删除
推送某个标签到远程,使用命令git push origin Vum
一次性推送全部尚未推送到远程的本地标签 git push origin –tags
如果想要删掉已经推送到远程的tag。
1.首先删除本地 git tag -d Vnum
2.push到远程 git push origin :refs/tags/Vnum
github
如果我们想参加一个开源项目,点击Fork就会在自己的账号下克隆了一个仓库,然后,从自己的账号下clone,一定要从自己的账号下clone仓库,这样你才能推送修改。
如果你想修复开源项目的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。
如果你希望开源项目的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。
自定义Git
Git除了可以配置user.name和user.email,还有很多可配置项。