Git学习

刚考完试,闲来折腾下Git,之前做虚拟机那个项目的时候和海哥因为被田老师催着交作品,四个人就采用U盘拷贝的方式进行版本管理,效率低不说,最后也不清楚谁的电脑上的是最新的版本了,最后甚至自己负责的部分都搞乱了,就意识到了版本控制的必要性,甚至真是有重构的可能啊!特别是小组协作的时候,必须的啊!

参考网站:

http://iissnan.com/progit/

Git简介:

linux的开发过程中的版本控制在初期的时候就是linus自己人工合并的,后期linux内核的代码库之大让linus很难继续手动管理了,这时候linus花了两周时间用C写了一个分布式版本控制系统,就是Git!

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

先上常用步骤:
正常步骤:

  1. git init //初始化仓库

  2. git add .(文件name) //添加文件到本地仓库

  3. git commit -m “first commit” //添加文件描述信息

  4. git remote add origin + 远程仓库地址 //链接远程仓库,创建主分支

  5. git pull origin master // 把本地仓库的变化连接到远程仓库主分支

  6. git push -u origin master //把本地仓库的文件推送到远程仓库

1、安装Git
$ sudo apt-get install git

2、在安装了git之后要先输入这个命令。指这台机器的名字
$ git config –global user.name “Your Name”
$ git config –global user.email “email@example.com”

3、创建repository(版本库)
在我的理解一个版本库就是一个项目,在自己电脑上表示就是一个项目文件夹
创建一个文件夹
$ mkdir myproject
$ cd myproject

4、初始化这个文件夹,并生成一个“.git”的隐藏文件,用来跟踪管理版本库
$ git init

5、再这个目录下新建文件“aaa.txt”,和“bbb.txt”文件,并添加到仓库
$ git add aaa.txt
$ git add bbb.txt

6、提交文件到仓库,并附上这个文件改动的说明
$ git commit -m “提交一个aaa.txt和bbb.txt文件”

7、git status 命令可以让我们时刻掌握仓库当前的状态.
8、git diff (difference)查看两个文件的不同
9、git log 显示从最近到最远的提交日志

10、查看各个版本的git为其生成的第一无二的hash_id
$ git log –pretty=oneline

10、git reset –hard 回退到上一个版本
11、git reset –hard 3628164 回退到“3628164”这个版本
12、git中的工作区是用户正在使用的区域,暂存区是一个虚拟的区域,看不见(相当于网络仓库和工作区中间的缓冲区域)的概念,add命令是往暂存区中提交,commit是提交暂存区中的内容提交到当前分支上(创建这个仓库时候就自动创建了master分支)

13、git checkout – file 当丢弃工作区某个文件的修改。

14、将本地仓库与远程的仓库关联,远程库的名字本地保存就是“origin”(这里用的是github上的仓库,也可以自己搭建一个哦)
git remote -v查看远程库信息,如果有两个远程库可以把origin和后边的仓库换成不同的名字方便记忆啊
$ git remote add github git@github.com:michaelliao/learngit.git
$ git remote add gitee git@gitee.com:Hengliy/myproject.git

15、把本地库(master分支)推送到远程库上
第一次推送
$ git push -u origin master
之后推送
$ git push origin master

16、克隆项目到本地
(一起从零协作一个项目的时候可以先在Git服务器(github网站)上创建一个仓库,然后小组成员一起clone下来开始开发)
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
$ git clone https://github.com/Hengliy/myproject (速度慢)
$ git clone https://github.com/Hengliy/myproject.git
$ git clone git@github.com:Hengliy/myproject.git

开发进度分支

建议用分支开发!(???分支才是每个人的进度???)
17、创建dev分支
$ git branch dev

18、切换分支
$ git checkout dev

17、创建并切换到dev分支
$ git checkout -b dev

18、列出所有分支,当前分支前面会标一个*号
$ git branch

19、合并dev分支到当前分支
$ git merge dev

20、删除分支
$ git branch -d dev

21、善于创建新的分支来修复bug
$ git stash //存储现场
$ git stash pop //恢复现场

22、丢弃一个使用了,但是没有合并的分支要强行删除
$ git branch -D

多人协作

1>可以试图用git push origin branch-name推送自己的修改;

2>如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

3>如果合并有冲突,则解决冲突,并在本地提交;

4>没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

5>如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream branch-name origin/branch-name。

6>这就是多人协作的工作模式,一旦熟悉了,就非常简单。

打标签

打标签就是为前面说的commit—id重新起个好记的名字

1、在当前分支时刻打标签
$ git tag v1.0

2、为6224937这个commit打标签为0.9
$ git tag v0.9 6224937

3、指定标签信息
$ git tag -a v0.9 -m “修改了文件系统自省的bug”

3、查看所有标签
$ git tag

4、查看详细信息
$ git show v0.9

5、删除标签
$ git tag -d v0.9

6、标签推送到远程
$ git push origin v0.9

忽略特殊文件

工作区的根目录下有个.gitignore文件,在提交的时候会自动忽略 文件内的东西。可以自己配置这个文件(https://github.com/github/gitignore),也可以自己写。
1、文件中写*.so
会自动忽略.so后缀的文件上传

Github协作开源项目

1>先Fork一个项目到自己的github上
2>git clone到本地
3>本地开发后,提交到自己的仓库上
4>希望项目的官方能接受你的修改,就可以在GitHub上发起一个pull request,等待同意接受你的修改

自定义修改

1、显示颜色
$ git config –global color.ui true
2、自定义命令缩写 status->st
$ git config –global alias.st status
高级自定义!
$ git config –global alias.lg “log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit”
3、配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
1>每个仓库的Git配置文件都放在.git/config文件中
2>当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

搭建Git服务器

1、安装git:
$ sudo apt-get install git

2、创建一个git用户,用来运行git服务:
$ sudo adduser git

3、创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。(人多的话还可以使用Gitosis来管理公钥)

4、初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init –bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的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

6、克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git