1 集中式和分布式
(1)CVS和SVN都是集中式版本控制器,工作时需要将代码从中央服务器中取下来,然后在修改,修改完成之后在存回中央服务器,整个过程需要连入网络。
(2)分布式无需联网,每个人的电脑都是一个完整的版本库,git还有一个强大的优点就是分支管理
2 Linux上安装Git
sudo apt-get install git
设置自己的帐号信息,因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
3 创建版本库
创建一个版本库,可以理解为创建一个目录,这个目录里面的所有文件可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时候都可以追踪历史,或者在某个时刻还原。
(1)创建一个版本库,首先先创建一个空目录
$ mkdir learngit
$ cd learngit
$ pwd
(2)使用git init命令
git init
这样仓库就创建好了,可以使用ls -ah 命令看目录下是否有.git文件。
4 基本操作
git分为工作区和版本库区(暂存区和分支区)
如图所示,Git为我们自动创建了第一个分支区,以及指向master的一个指针HEAD
4.1 最基本的本地推送命令
git init 创建一个版本库
git add filename 将文件从工作区添加到暂存区
git commit -m “desciption" 将文件从暂存区添加到分支区,Git管理的是修改,使用此命令只是将暂存区的修改提交到分支区,如果工作区修改了,但是没有提交到暂存区,此命令是不是直接将工作区的修改直接提交到分支区的(不add到暂存区,就不会加入到commit中)
4.2 常用的辅助命令
git status 查看仓库的当前状态,使用该命令可以辨识文件是否提交到暂存区,以及是否从暂存区提交到分支区
git diff filename 查看文件修改内容,针对文件修改了,但是还为提交到暂存区。
git diff HEAD -- filename 查看工作区和版本库的不同
git log 查看提交的日志
git log --pretty=online 查看日志的简要信息
git reflog 查看历史命令,以便确定回到未来的那个版本号
4.3 撤销对工作区、暂存区、以及分支区的修改
git checkout -- filename 丢弃工作区的修改
git reset HEAD filename 使暂存区回到上一版本,丢弃对从工作区到暂存区的提交,工作区的修改还没有撤回,如果还需要对还原工作区的修改,需要再使用git checkout -- filename命令
git reset --hard commit_id 版本回到对应的commit_id版本,Git管理的是修改
4.4 对文件的删除操作
- git rm filename 删除某个文件
- git commit -m ”remove filename“ 提交对文件的删除
5 远程仓库
使本地库和GitHub库连接起来
5.1 需要创建SSH Key
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C “youremail@example.com”
5.2 登录GitHub
没有帐号的申请一个,登录后,需要添加SSH keys。
打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
之所以要添加SSH Keys,是因为需要识别出推送的提交是你推送的,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
5.3 添加远程库
a. 登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库,在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
b.在本地的lerngit仓库下运行命令
$ git remote add origin git@github.com:yourGitHubname/learngit.git
远程库的名字叫做origin ,再用使用命令:
$ git push -u origin master
git push命令,实际就是把当前分支master推送到远程,-u 参数表示不但把本地的master分支内容推送上去,还会把本地的分支和远程的分支关联起来。在以后的推送和拉去就可以简化命令,以后可以直接使用如下命令
$ git push origin master
5.4 从远程库克隆
a.在GitHub上创建一个新的库,名字叫gitskills。勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件。
b.使用命令git clone
$ git clone git@github.com:yourGitHubname/gitskills.git
或git clone https://github.com/yourGitHubname/gitskills.git
6 分支
6.1 分支的创建与合并
最开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,每次提交,mater分支都会向前移动一步,当我们创建一个分支dev的之后,新建的指针dev将会指向master相同的提交,再把HEAD指向dev(HEAD是指向当前 分支的),就表示当前的分支在dev上了。之后对工作区的修改和提交就是针对dev分支了,master指针不变。完成了dev上的分支,可以把dev合并到master上,合并之后可以删除dev分支。
(1)分支的创建
git checkout -b dev 创将dev分支,并切换到dev分支上,相当于以下两条命令
git branch dev
git checkout dev
git branch 查看当前分支
(2)分支的合并
git merge dev 将dev分支的工作合并到master分支上,强制合并分支
git merge --no-ff -m "merge with no-ff" dev 普通模式合并分支
git branch -d <name> 删除name分支
分支的合并有时候还产生冲突,比如在master分支和dev分支同时对文件的同一地方进行了修改,这时候合并就会产生冲突。
分支冲突如下图所示
分支的合并冲突,只是对同一个地方进行的修改才会产生,对不同的地方修改是不会产生的,手动解决冲突内容后(更改内容 然后使用git add 和 git commit ),合并分支后,两个分支的内容将会是一样的。
强制合并和普通模式合并的区别,强制合并使用git log是看不出合并的信息的,普通模式合并可以看出合并信息
强制合并 git merge dev
普通合并 git merge –no-ff -m “merge with no-ff” dev
6.2 分支管理办法
- master分支是非常稳定的,因此要时刻与远程同步
- dev分支为开发分支,也需要与远程同步
- bug用于修复本地的bug,就无需推到远程
- feature分支为新功能开发
分支合并尽量使用普通模式合并 加上–no-ff参数,如果有个紧急任务需要修复一个bug,但是当前的开发任务又没有完成,可以使用如下办法进行现场保护
现场的保护常用命令集
git status 查看当前工作状态
git stash 将当前分支的工作状态“存储起来”,这时候使用git status是不会再显示该分支的工作状态了
git stash list 当重新切换回该分支时,使用该命令查看stash内容
git stash apply 恢复工作状态,但是stash内容并不删除
git stash drop 删除stash的内容
git stash pop 恢复工作状态,同时把stash内容删除,相当于上面的两条命令
7 标签
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
标签号可以代替commit_id
7.1 标签的创建
git tag <name> 用于新建一个标签,默认是HEAD,也可以指定一个commit_id
git tag -a <tagname> -m "description" 指定标签信息
git tag 查看所有标签
git show <标签号> 查看标签信息
git log --pretty=oneline --abbrev-commit 查看历史提交的commit_id
7.2 标签的操作
git push origin <tagname> 推送一个本地标签
git push origin --tags 推送全部为推送的标签
git tag -d <tagname> 删除一个本地标签
git push origin:refs/tags/<taname> 删除一个远程标签
问题
在github.com上 建立了一个小项目,可是在每次push 的时候,都要输入用户名和密码,很是麻烦
原因是使用了https方式 push
在termail里边 输入 Git remote -v
可以看到形如一下的返回结果
origin https://github.com/yuquan0821/demo.git (fetch)
origin https://github.com/yuquan0821/demo.git (push)
下面把它换成ssh方式的。
- git remote rm origin
- git remote add origin git@github.com:yuquan0821/demo.git
- git push origin
总结
本地推送命令
git init 创建一个版本库
git add filename 将文件从工作区添加到暂存区
git commit -m “desciption" 将文件从暂存区添加到分支区,Git管理的是修改,使用此命令只是将暂存区的修改提交到分支区,如果工作区修改了,但是没有提交到暂存区,此命令是不会直接将工作区的修改直接提交到分支区的(不add到暂存区,就不会加入到commit中)
常用辅助命令
git status 查看仓库的当前状态,使用该命令可以辨识文件是否提交到暂存区,以及是否从暂存区提交到分支区
git diff filename 查看文件修改内容,针对文件未提交到暂存区。
git diff HEAD -- filename 查看工作区和版本库的不同
git log 查看提交的日志
git log --pretty=online 查看日志的简要信息
git reflog 查看历史命令,以便确定回到未来的那个版本号
撤销对工作区、暂存区、以及分支区的修改
git checkout -- filename 丢弃工作区的修改
git reset HEAD filename 使暂存区回到上一版本,丢弃对从工作区到暂存区的提交,工作区的修改还没有撤回,如果还需要对还原工作区的修改,需要再使用git checkout -- filename命令
git reset --hard commit_id 版本回到对应的commit_id版本,Git管理的是修改
对文件的删除操作
git rm filename 删除某个文件
git commit -m ”remove filename“ 提交对文件的删除
远程仓库
git remote rm origin
ssh-keygen -t rsa -C "youremail@example.com" 创建SSH Key
git remote add origin git@github.com:yourGitHubname/learngit.git 添加远程库
git push -u origin master 推送master分支,git push命令,实际就是把当前分支master推送到远程,-u 参数表示不但把本地的master分支内容推送上去,还会把本地的分支和远程的分支关联起来。在以后的推送和拉去就可以简化命令,以后可以直接使用如下命令
git push origin master
$ git clone git@github.com:yourGitHubname/gitskills.git
或git clone https://github.com/yourGitHubname/gitskills.git
分支的创建
git checkout -b dev 创将dev分支,并切换到dev分支上,相当于以下两条命令
git branch dev
git checkout dev
git branch 查看当前分支
分支的合并
git merge dev 将dev分支的工作合并到master分支上,强制合并分支
git merge --no-ff -m "merge with no-ff" dev 普通模式合并分支
git branch -d <name> 删除name分支
分支现场保护
git status 查看当前工作状态
git stash 将当前分支的工作状态“存储起来”,这时候使用git status是不会再显示该分支的工作状态了
git stash list 当重新切换回该分支时,使用该命令查看stash内容
git stash apply 恢复工作状态,但是stash内容并不删除
git stash drop 删除stash的内容
git stash pop 恢复工作状态,同时把stash内容删除,相当于上面的两条命令
标签创建
git tag <name> 用于新建一个标签,默认是HEAD,也可以指定一个commit_id
git tag -a <tagname> -m "description" 指定标签信息
git tag 查看所有标签
git show <标签号> 查看标签信息
git log --pretty=oneline --abbrev-commit 查看历史提交的commit_id
标签操作
git reset –hard 回到标签版本
git push origin 推送一个本地标签
git push origin –tags 推送全部为推送的标签
git tag -d 删除一个本地标签
git push origin:refs/tags/ 删除一个远程标签
参考文献
廖雪峰 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000