1.集中式版本管理系统和分布式版本管理系统
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
2.创建版本库
git init
该命令会将该目录变成git可以管理的仓库。
(注意:不要轻易使用Windows自带的文本编辑器,他会带来很多的问题,可以使用notepad++,可以设置他的默认编码为UTF-8 without BOM)
3.添加文件
1)git add aaa.txt
2)git commit -m "加上文件说明"
add 可以多次添加文件,git add . 可以添加所有文件。commit可以一次提交所有。
4.查看状态
git status
该命令可以让我们时刻掌握仓库当前的状态
git diff 文件名
该命令查看difference,显示的格式正是Unix通用的diff格式
5.查看git的提交历史
git log
为减少输出的信息,可以添加--pretty=oneline参数
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
commit id
(版本号)一个SHA1计算出来的一个非常大的数字,用十六进制表示。为防止同一个版本库里工作人员提交的冲突。
6.版本回退
在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
git reset --hard HEAD^
查看文件内容 --- cat 文件名。
如果想要回退到回退前的版本,只要知道版本号就可以:
git reset --hard 1094a 版本号没必要写全,前几位就可以了,Git会自动去找。
那如何找到commit ID 呢?git中有一个命令用来记录你的每一次命令
git reflog
7 工作区和暂存区
工作区:电脑里能看到的目录。
工作区中一个隐藏的.git目录不算工作区,而是git的版本库。
在git的版本库中存在一个重要的东西称为stage(index)暂存区和git为我们创建的第一个分支master,以及指向master的指针叫head
git add 其实就是将文件添加到暂存区,而git commit 实际上试讲暂存区中的内容提交到当前分支。
8.修改撤销
1)当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
2)当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了1),第二步按1)操作。
3)已经提交了不合适的修改到版本库时,想要撤销本次提交,使用版本回退。(前提,没有远程提交)
9. 删除文件
git rm file
git commit -m "remove"
如果手动误删
git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
命令git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
10. 本地仓库与远程仓库关联
git remote add origin git@server-name:path/repo-name.git
远程库的名字就是origin
git push -u origin master
用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。git push origin master
11.远程库克隆到本地
git clone git@github.com:michaelliao/gitskills.git
12.创建分支
git checkout -b dev
-b参数表示创建并切换,相当于
git branch dev
git checkout dev
13 查看当前分支
git branch
14 分支合并
git merge dev
git merge
命令用于合并指定分支到当前分支。
15 删除分支
git branch -d dev
16 冲突解决
使用git status查找冲突的位置
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容
修改冲突在提交
git log --graph命令查看分支合并图
17 分支管理策略
合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
git merge --no-ff -m "merge with no-ff" dev
请注意--no-ff
参数,表示禁用Fast forward;
查看: git log --graph --pretty=oneline --abbrev-commit
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
18 BUG分支
git stash
可以将当前工作线程储藏起来,以后可以恢复在使用。
查看刚才的工作现场
git stash list
Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
可以恢复指定的stash:
git stash apply stash@{0}
19.feature分支删除
Git友情提醒,feature-vulcan
分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D
参数。
20. 查看远程库
git remote
git remote -v
21推送分支
Git就会把该分支推送到远程库对应的远程分支上
git push origin(远程) master(本地)
如果推送失败,用git pull抓取远程新提交的代码
-
master
分支是主分支,因此要时刻与远程同步; -
dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
22 本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
创建远程origin
的dev
分支到本地,于是他用这个命令创建本地dev
分支:
git checkout -b dev origin/dev
解决冲突
先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送;
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接;
23 多人协作
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
24 rebase操作
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
25 创建标签
git tag v1.0
查看标签
git tag
git show v0.9
对某次commit id 打标签
git tag v0.9 f52c633
还可以创建带有说明的标签,用-a
指定标签名,-m
指定说明文字
git tag -a v0.1 -m "version 0.1 released" 1094adb
26 删除标签
git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令
git push origin v1.0
一次性推送全部尚未推送到远程的本地标签
git push origin --tags
删除远程标签 ---先从本地删除,然后,从远程删除。
git tag -d v0.9
git push origin :refs/tags/v0.9