集中式和分布式
- 集中式:有一个主机作为中央处理器,中央处理器坏了,所有主机都不能作业。
- 分布式:没有中央处理器,每一台主机都是一个完整的版本库,可以不用联网(优点)安全性高,交换修改不方便。
Git
- 只能追踪文本文件的改动,如txt/网页/程序代码等,不能追踪二进制,word是二进制。
- 编码:强烈建议使用utf-8编码,所有语言用同一种编码,既没有冲突,又被所有平台支持。
工作区和版本库
新建仓库:首先新建文件夹,在该目录下执行git init命令
添加文件 :git add xxx.txt
提交文件到版本库 :git commit -m "zhushi"
查看当前状态 :git status
查看工作区文件和版本库中的区别 :git diff/git diff HEAD --xxx.txt
撤销工作区的修改,回退到版本库中的最新版 :git checkout --xxx.txt
版本回退:git reset --hard HEAD^ (hard HEAD^^)(hard ~99)(hard +版本号)
查看提交历史 :git log / git log --pretty=oneline
查看命令历史 :git reflog
删除 :当工作区不小心删除了一个文件,可以撤销工作区的删除git checkout --xxx.txt,也可以将文件从版本库中删除git rm xxx.txt+git commit -m "delete"
Git 远程仓库
1、创建SSH key。 打开shell,
ssh-keygen -t rsa -C “youremail@example.com”,这样用户主目录下找到.ssh目录,里面有id_rsa(私钥)和id_rsa.pub(公钥)两个文件,这两个是SSH Key 的秘钥对
2、登陆Github,打开account settings,SSH Keys页面,点击add ssh key,填上任意title,在key文本框里粘贴id_rsa.pub文件的内容。
注意:
1)github需要ssh key,因为github需要识别出确实是你推送的文件,而不是别人推送的。git支持ssh协议,所以github只要知道了你的公钥,就可以确认只有你自己才能发送。
2)github上免费托管,所有人都可以看到你的文件但是只有你自己可以改。若不想被别人看到的话,可以交保护费,也可以自己懂事搭建一个git服务器。
关联GitHub上的远程库
1、在本地创建了一个git仓库后,又想在GitHub上创建一个仓库进行远程同步。
2、登陆GitHub,在右上角找到creat a new repo,创建一个新的仓库,填写仓库 名称learnGit,其他默认,点击创建,成功的在GitHub上创建了一个仓库。
3、将GitHub与本地版本库链接
git remote add origin(仓库名) http:''github....(仓库地址)
4、本地推送到GitHub上
git push -u origin master (-u 首次)
git push origin master
从GitHub上克隆到本地
1、切换到本地,新建一个文件夹作为本地版本库。
2、git clone GitHub上远程仓库的地址
分支
1、在版本回退中,每次提交,git都把他们串成一条时间线,这条时间线就是一个分支———主分支/master分支。
2、一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向当前分支。
3、创建分支:git branch xxx
切换分支:git checkout xxx
创建+切换:git checkout -b xxx
4、查看分支:git branch,列出所有分支,当前分支前面有*号
5、切换分支:git checkout 分支名
6、合并分支:git merge 分支名xxx,将xxx分支合并到当前分支。
7、删除分支:git branch -d xxx
分支冲突
1、分支冲突:当在新分支下,修改主分支master的文件内容并提交,切换到主分支master,修改相同的文件并提交,合并分支会发生冲突。
2、解决冲突,打开修改的文件,会看到各个分支对文件作出的修改,修改后,重新提交,即可,最后删除分支。
3、查看分支合并图,git log - -graph
分支管理策略
pass
bug分支
-
当前分支的任务没有完成,但是紧急需要创建一个新分支,这时候可以将当前分支储藏起来
git stash,此时工作区是干净的,可以创建新分支了。新分支修复完成合并后,此时在master分支上。 -
查看当前的储存空间列表,可以有多个:
git stash list -
恢复到工作区:
git stash apply stash@ -
将储存空间删除:
git stash drop -
恢复工作区并删除储存空间:
git stash pop -
开发一个新功能,新建一个分支进行工作。但是对还没有进行合并的分支删除,通过命令
git branch -D xxx强行删除。 -
查看远程信息:
git remote -v -
本地信息推送到远程:
git push 远程库名 推送的分支名
多人协作——提交时会发生冲突,git提供的解决方法
1、git pull:先将远程仓库中的最新版本拉取到本地(git pull 拉取的是master分支),存在冲突。
2、git checkout -b dev(本地分支) origin/dev(远程分支) :在本地建立和远程库一样的分支dev
3、git branch --set-upstream-to=origin/dev(远程库/分支)dev(本地关联分支):将远程分支与本地分支进行关联。
4、git pull:将远程分支的最新内容拉取到本地,成功。
5、合并存在冲突,冲突的解决方式和之前本地分支管理冲突的解决方式一致。在本地解决冲突后,add提交commit,推送git push origin(远程库) dev(本地分支).
6、git log - -graph 发现不是一条直线,利用git rebase 可以将本地未push的分叉提交历史整理成一条直线,使得我们在查看历史提交的变化时更容易。
标签管理
1、发布一个版本时,可以打一个标签tag,唯一确定打标签时刻的版本。其实是指向某个commit的指针,但是分支的指针可以移动,标签的指针不能移动。
2、tag是一个有意义的名字,与某个commit绑在一起。
3、切换到需要打标签的分支上,
1)查看分支git branch
2)切换分支git checkout 分支名
3)打标签git tag v1.1(标签名)
4、默认的标签是当前的HEAD commit上,若要对之前的commit打标签
1),查看所有的commit 的版本号git log - -pretty=oneline
2)git tag v1.2 commit id
5、标注信息:
git tag -a 指定标签名 -m 指定说明文字(version 2.0) commit id
6、查看所有标签:git tag
7、查看某个标签的信息:git show v1.1
8、删除标签:git tag -d tagname
9、将标签推送到远程 :git push origin tag name (单个标签)
git push origin --tags (本地所有标签全部推送)
10、删除远程的标签
本地标签删除:git tag -d tagname
git push origin :refs/tags/tagname
使用GitHub
1、去别人的GitHub下,点击右上角的fork,可以将此开源项目克隆的自己的GitHub里,从自己账号里克隆一个到本地,这样就可以参与开源项目了。若是你想将自己的修改贡献给开源项目,可以在自己GitHub账号下,新建一个pull request,但是对方接不接受就不一定了。
2、删除已有的GitHub远程库,git remote rm origin
使用码云
国内用户使用GitHub速度太慢,所以可以使用国内的git托管服务——码云gitee.com
自己定义git
1)操作系统自动生成的文件,比如缩略图等
2)编译生成的中间文件,可执行文件等
3)自己的带有敏感信息的配置文件,如存放口令的配置文件。
2、在git工作区的根目录下创建一个特殊的文件.gitignore,把要忽略的文件名填进去,git会自动的忽略这些文件。
3、查看.gitignore是否存在问题:git check-ignore
4、git别名:git config --global alias.st status global:全局参数
5、配置git时,加上--global是针对当前用户起作用的,如果不加,只针对当前的仓库起作用。
6、不加global,每个仓库的git配置文件都放在.git/config文件中,别名都在「alias」后面,若要删除别名,直接把对应的行删掉即可。
7、加了global,当前用户的git配置文件放在用户主目录下的一个隐藏文件.gitconfig
搭建git服务器
GitHub开源,公开,若要隐藏,有两个方法,一是交保护费,二是搭建自己的git服务器。Linux系统,Ubuntu或debian通过apt命令可以完成安装。
1、安装git:sudo apt-get install git
2、创建一个git用户,用来运行git服务:sudo adduser git
3、创建证书登陆,收集所有需要登陆的用户的公钥,就是他们的id_rsa.pub,导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4、初始化git库:sudo git init - -bare sample.git ,git会创建一个裸仓库,没有工作区,然后把owner改为git,sudo chown -R git:git sample.git
5、禁用shell登陆:考虑安全,第二步创建的git用户不允许登陆shell,可以通过编辑/etc/passwd文件完成,找到类似下面的一行 git :x:1001:1001:,,,:home/git:/bin/bash 改为 git:x:1001:1001:,,,:home/git:usr/bin/git-shell。 这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6、通过git clone命令克隆远程仓库了,在各自的电脑上运行。
管理公钥,人数少可以收集起来放到服务器的/home/git/.ssh/authorized_keys文件中,若人数太多,可以用Gitosis来管理公钥。
管理权限:在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。