目录
集中式vs分布式... 2
创建版本库... 2
时光穿梭机... 4
版本回退... 4
工作区与暂存区(stage)... 4
管理修改... 4
撤销修改... 4
删除文件... 5
远程仓库... 5
sshkey设置... 5
添加远程库... 6
从远程库克隆... 8
分支管理... 9
创建与合并分支... 9
解决冲突... 11
分支策略... 12
Bug分支... 12
多人协作... 12
标签管理... 13
创建标签... 13
操作标签... 13
集中式版本控制系统必须联网才能工作
集中式版本库是集中存放在中央服务器的
分布式版本控制系统没有“中央服务器”, 分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改
分布式版本控制系统的安全性要高, 因为每个人电脑里都有完整的版本库
首先,选择一个合适的地方,创建一个空目录:
$ cd/d
$ mkdirgit
$ cd git
$ pwd
/d/git
第二步,通过git init
命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty
Git repository
in
D:/git/.git/
向版本库中添加readme.txt文件,内容为:
I Love Yongyou
第一步,用命令git commit
告诉Git,把文件提交到仓库:
$ git add readme.txt
第二步,用命令git commit
告诉Git,把文件提交到仓库:
$ git
commit -m "first commit"
报错,需要设置当前用户的用户名及邮箱
$ git config --global user.name
"liululu"
$ git config --global user.email
"liullsj@yonyou.com"
再次执行git commit
(1)HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
(2)穿梭前,用git log(git log--pretty=oneline)可以查看提交历史,以便确定要回退到哪个版本。
(3)要重返未来,用gitreflog查看命令历史,以便确定要回到未来的哪个版本。
Git跟踪并管理的是修改,而非文件。每次修改,如果不add到暂存区,那就不会加入到commit中。
修改——git add 修改的文件——git commit-m "注释信息"
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,手动或用命令git checkout – file(把文件在工作区的修改全部撤销),git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file(git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本),就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
手动或rm file(本地删除):
(1)删除版本库
git rm file——git commit-m "注释"
(2)误删恢复
git checkout – file(git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”)。
第1步:创建SSHKey。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开GitBash),创建SSH Key:
$ ssh-keygen -t rsa -
C
" liullsj@yonyou.com "
$ cat /c/Users/wangyudong/.ssh/id_rsa.pub
第2步:在git托管平台上设置公钥
为什么GitHub需要SSHKey呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
目前,在GitHub上的这个learngit
仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的learngit
仓库下运行命令:
$ git remote add origin git@github.com:whyuds/yongyou.git
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push –u origin master
现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills
:
我们勾选Initializethis repository with a README
,这样GitHub会自动为我们创建一个README.md
文件。创建完毕后,可以看到README.md
文件:
现在,远程库已经准备好了,下一步是用命令git clone
克隆一个本地库:
$ git clone git
@github.
com:michaelliao/gitskills.git
Cloning into
'gitskills'...
remote:
Counting
objects:
3, done.
remote:
Total
3 (delta
0), reused
0 (delta
0)
Receiving
objects:
100% (
3/
3), done.
首先,我们创建dev
分支,然后切换到dev
分支:
$ git checkout -b dev
Switched to a new branch
'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch
'dev'
然后,用git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后,我们就可以在dev
分支上正常提交,比如对readme.txt做个修改,加上一行:
ILove Yongyou So Much
然后提交:
$ git add readme.txt
$ git commit -m
"branch test"
[dev fec145a] branch test
1 file changed,
1 insertion(+)
现在,dev
分支的工作完成,我们就可以切换回master
分支:
$ git checkout master
Switched to branch
'master'
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
新建feature1
分支,修改readme.txt文件为
ILove Yongyou Not Much
并通过git add commit提交至分支。
切换至master分支,并修改readme.txt文件为
ILove Yongyou
并通过git add commit提交至分支。
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
$ git merge feature1
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:
ILove Yongyou So Much
再提交:
$ git add readme.txt
$ git commit -m
"conflict fixed"
[master
59bc1cb] conflict fixed
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
(1)修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
(2)当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop或者git stashapply——git stashdrop,回到工作现场。
(3)Stash后,工作区是干净的,工作现场用git stash list命令查看。
多人协作的工作模式通常是这样:
1. 首先,可以试图用git push originbranch-name推送自己的修改;
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用gitpull试图合并;
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用git push originbranch-name推送就能成功!
如果gitpull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令gitbranch --set-upstream branch-name origin/branch-name。
(1)命令git tag
用于查找commit id),即git tag
(2)git tag -a
(3)git tag -s
(4)命令git tag可以查看所有标签。
(5)git show
(1)命令git pushorigin
(2)命令git pushorigin --tags可以推送全部未推送过的本地标签;
(3)命令git tag -d
(4)命令git pushorigin :refs/tags/