一 git简介
git是一种
分布式版本控制系统
,
简单的说就是把每个人对一个文件修改的时候都做好保存可以知道什么时间对那个文件做了哪些修改,并且可以回退前进把多人编辑的不同分支合并到一起。
二 git和svn区别
svn:集中式管理必须依赖网络每次操作前都需要从服务端下载一份最新的版本来做操作,更改完以后同步到服务端,操作简单易控制;过于依赖服务端,服务端出问题容易会导致后续的多种问题。
Git:分布式管理,没有所谓的中央服务端,但会设置一台充当交换的服务器24小时工作保证大家可以随时交换更新版本库,即使没有这台交换服务器大家也是可以干活的,在服务器故障方面,安全性更高。
三 git基础
1.基础命令
常用的 git 命令有:
git init 初始化当前目录为Git管理仓库,会在目录下创建一个.git目录
.git为版本库,初始的目录下为工作区,暂存区位于版本库。分支也位于版本库
添加文件到Git仓库分两步:
git add <file> 把文件添加到暂存区
git commit 把暂存区的所有内容提交到当前分支
git status 查看工作区的状态
git diff 查看修改过的内容
git log 查看提交历史 git reflog
git reset < --hard > COMMIT_ID 返回到某一个版本
git checkout <-b/d> <分支名> 创建/删除/切换分支
git checkout -- <file> 撤销修改 (工作区)
git reset HEAD <file> 撤销修改(暂存区)
git branch 查看分支状态
git merge <分支名> 合并分支
git pull URL 远程拉取
git push URL 提交
2.git安装及基本管理
1.git安装(
http://git-scm.com/)
yum install git -y
2.
设置git用户名和邮件
- git config --global user.name "msun1996"
git config --global user.email "msun1996@163.com"
3.创建git仓库
- mkdir /gitcode
cd /gitcode/
#初始化git库,会在当前目录生成.git目录,该目录文件将被git管理
git init
4.向仓库添加文件
touch test1
touch test2 test3
#添加文件到仓库(暂存区)(修改文件重新提交也用以下两步)
- git add test1
git add test2 test3
#将文件提交到仓库-m后是注释信息
- git commit -m "add three files"
[master(根提交) 4c3ab4c] add three files
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test1
create mode 100644 test2
create mode 100644 test3
5.查看仓库状态
#可以看到哪些文件修改但未提交版本库(可以修改上面文件测试)
git status
6.查看具体某个文件改动情况
git diff file #是工作区(work dict)和暂存区(stage)的比较
git diff --cached #暂存区(stage)和分支(master)的比较
7.查看版本库提交记录
git log #提交日志(由近期到早前)
git log --pretty=oneline #简化显示
8.版本切换(回退或回到回退前版本)
git reset --hard HEAD^ #回退上个版本
git reset --hard HEAD^^ #回退上个版本
#显示每一次git执行的命令,关注commit_id值
git reflog
- #切换至任意版本
- git reset --hard commit_id
9.查看工作区与版本库最新版本的区别
git diff HEAD -- file
10.撤销文件修改
#文件没使用git add添加暂存区(丢弃工作区的修改)
git checkout -- file
#文件如果已经提交缓存区
- git restet HEAD file
- git checkout -- file
11.从版本库删除文件(无法恢复)
git rm file1
git commit -m 'remove file1'
12.连接git仓库的方法
ssh-keygen -t rsa -C 'msun1996@163.com'
cd ~/.ssh
#将公钥id_rsa.pub添加到github端
13.将本地库与远程库相关联
#其中origin是远程库名字
git add remote origin git@github.com:msun1996/库名 #(也可复制https路径)
#将本地mster分支推送到远程库 -u只在第一次上传用,推送所有内容,其他只推送最新修改
git push (-u) origin master
#此处如果有冲突,即别人也改了你修改的部分,那就需git pull把最新的从远程分支抓下来,再解决冲突在本地合并,再推送
#将github远程库复制到本地
git clone git@github.com:
msun1996/库名
分支作用是在你做一个附属的新功能,不想立即推送到git代码库中,因为你的代码可能不完整,会影响别人工作,所以建立一个仅属于自己新分支,不进行推送。
14.创建分支dev,并切换至改分支
git checkout -b dev
#创建分支
git branch dev;
#切换分支
git checkout dev
15.查看分支
#查看所有分支,当前分支会带*
git branch
16.将dev分支合并到master分支
#默认采用fast-forward方式
git merge dev
git merge默认会采用fast-forward方式,
此时会丢失分支信息(即使用git log查看的时候不会显示分支的合并),
要想保存分支信息,可以使用--no-ff选项
git merge --no-ff dev
git log --graph --pretty=oneline --abbrev-commit
合并冲突问题:
当master分支与另一个分支(feature1)都有git add 跟git commit操作的时候,
合并分支的时候会发生冲突而失败,
此时应该解决冲突之后再执行git add 和git commit
然后再执行
git branch -d feature1
17.删除分支
git branch -d dev
18.查看分支合并情况
git log --graph --pretty=oneline
19.当在dev分支工作时候,需要临时修改bug的时候,
bug不仅要在master修改,还要修改到你正在调试的dev分支里,但你又不能提交你的dev,因为它是个半成品。
1.
可以使用git stash保存(工作区)现场后,
2.再
切换到master分支,
3.
然后在创建bug分支,
4.
修改bug后,
5.
再返回到master分支,
6.
合并bug分之后,
7.
返回dev分支后,
8.在dev下合并master,同步bug解决方案
9.
再使用git stash pop 恢复现场,(会删除stash内容,使用git stash apply stash@{0}不会删除(
git stash list查看现场信息
),可用git stash drop删除)
这样,dev中关于master的bug也就修改了。完整过程如下
git stash #dev分支
git checkout master
git checkout -b bug101
############ 修改bug git add git commit....###############
git checkout master
git merge --no-ff bug101
git branch -d bug101
git checkout dev
git merge --no-ff -m "dev-merge-m" master
git stash list #查看保存的现场信息
git stash pop #恢复现场,有冲突手动修改
20.
如果需要添加一个新功能,需要创建一个feature分支,当在该feature分支上执行git add和git commit,没有执行合并(git merge)的话,无法通过git branch -d feature 删除该分支,若要强行删除该分支,需要执行
git branch -D feature #强行删除该分支
21.查看远程库信息
git remove -v #-v选项显示详细信息
22.标签
#标签默认是打在最新的提交commit上的
git tag v1.0
#指定commit_id打标签
git tag v0.9 commit_id
#创建带有说明的标签
git tag -a v0.1 -m "version 0.1 released" 3628164
#采用PGD签名的标签(安装gpg)
git tag -s v0.2 -m "signed version 0.2 released" fec145a
#查看所有标签
git tag
#删除标签
git tag -d v0.1
#推送标签到远程(不会自动推送到远程)
git push origin v1.0
git push origin --tags #标签全推送
#远程标签删除
#先删除本地
git tag -d v1.0
#再远程删除
git push origin :refs/tags/v1.0