Git

198 阅读9分钟

集中式和分布式

  • 集中式:有一个主机作为中央处理器,中央处理器坏了,所有主机都不能作业。
  • 分布式:没有中央处理器,每一台主机都是一个完整的版本库,可以不用联网(优点)安全性高,交换修改不方便。

Git

  • 只能追踪文本文件的改动,如txt/网页/程序代码等,不能追踪二进制,word是二进制。
  • 编码:强烈建议使用utf-8编码,所有语言用同一种编码,既没有冲突,又被所有平台支持。

工作区和版本库

工作区work directory就是在目录中能看到的目录 版本库repository:工作区有一个隐藏目录.git,是git的版本库,其中存了很多东西,最重要的称为stage或index的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD

新建仓库:首先新建文件夹,在该目录下执行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、忽略特殊文件

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就是这个工具。