git是目前最先进的分布式版本控制系统
一.集中式VS分布式
1.集中式:版本库是集中放在中央服务器的,而干活的时候是用自己电脑,先从中央服务器获取最新版本,然后工作。工作完毕,推送给中央服务器
2.分布式:分布式系统中根本没有“中央服务器“,每个人的电脑上有一个完整的颁布,工作的时候不必联网,因为版本库就在本机
二.Windows上安装Git
百度搜索git,下载国内镜像就可以,直接安装就可以
安装完成,鼠标右键Git Bash Here,进行设置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
三.创建版本库
1.选择一个合适的地方,创建一份空目录
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd:显示当前位置
2.将这个目录变成git可以管理的仓库
$ git init
3.新建一个文件,如何加入git仓库?
(1)git add 文件名
(2)git commit -m "备注"
当我们成功提交了一份文件,我们可以使用 git status 查看仓库当前的状态。同样我们可以使用git diff 查看文件具体被修改了什么内容。
四.版本退回修改,撤销,删除
1.版本退回 git reset
使用git log 命令可以用于查看提交历史,以便确定好退回到哪一个版本,显示的顺序是最近到最远提交的日志
git log --pretty=oneline 格式控制,前面的一串表示commit id,红色部门表示版本号
$ git log --pretty=oneline
<span style="color:#ff0000;">3628164</span>fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本
git reset --hard HEAD^ 退回到上一个版本
git reset --hard 3628164 退回到某一个版本
注意:要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本
2.版本退回 gitcheckout --file
如果你不小心改错了文件,如果还没有进行add,commit,可以很容易修改,因为文件修改过后还没有放到暂存区,现在撤销就回到和版本库中一模一样的状态
如果已经添加到暂存区,可以使用git checkout --file
注意:git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
3.删除文件正常情况下在文件管理器中将没有用的文件删除了,可以使用rm 文件,此时git 知道你把文件删除了,可以使用git status查看删除了那些文件
如果确定要从版本库中删除该文件:git rm 文件,再commit
如果不小心删除错了,可以从版本库中恢复:git checkout --文件
五.远程仓库
1.创建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到
.ssh
目录,里面有
id_rsa
和
id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,
id_rsa
是私钥,不能泄露出去,
id_rsa.pub
是公钥,可以放心地告诉任何人
2.登录GitHub
找到Settings,Add SSH Key,添加任意title在key里面粘贴:id_rsa.pub文件的内容
3.添加远程仓库
在git上创建一个仓库,名字就是自己本地仓库的名字就可以,如何将本地仓库与远程库关联?
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
$ git remote add origin git@github.com:michaelliao/learngit.git
使用git push -u orgin master,把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
注意:SSH警告
当你第一次使用
$ git merge --no-ff -m "merge with no-ff" dev
Git的
clone
或者
push
命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes
回车即可。Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了
4.从远程库克隆 git clone
$ git clone git@github.com:michaelliao/gitskills.git
六.分支管理
1.创建合并分支:
(1)创建分支:git checkout -b dev ,其中-b表示创建并切换,相当于先git branch dev,再git checkout dev
(2)查看当前分支:git branch
(3)合并分支:git merge dev,合并的模式是:快进模式
(4)删除分支:git branch -d dev
2.解决冲突
当两个分支上都对某个文件进行了修改,合并的时候会有冲突,先手动解决冲突,在提交,合并。用git log --graph
命令可以看到分支合并图
3.分支管理策略
分支合并的时候,git会用fast forward模式,这种模式下,删除分支后,会丢掉分支信息,可以强制禁用fast forward 模式,这样git在merge会生成一个新的commit,这样可以从分支历史上看出分支信息
$ git merge --no-ff -m "merge with no-ff" dev
4.Bug分支
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
总结:
(1)--no-ff:不使用fast-forward方式合并,保留分支的commit历史
(2)--squash:使用squash方式合并,将多次分支commit历史压缩为一次
5.Feature分支
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
最后:
-
查看远程库信息,使用
git remote -v
; -
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; -
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; -
从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。 -
-
命令
git tag <name>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; -
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; -
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签; -
命令
git tag
可以查看所有标签。 -
-
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
-
-