GIt版本管理
Git版本控制系统
大部分公司使用:
一些老公司:
Windows Git 客户端使用
- windows的git,本质是windows上的linux系统
- TortoiseGit-2.2.0.0-64bit 给git加外壳,svn客户端的git版本
下载安装
一直下一步即可
使用
右键点击,Git GUI 是图形化界面,一般用第二个Git 命令行模式
Git Linux 使用
不用下载系统自带,没有的话yum安装
Git全局配置
这一步可以简单理解为创建一个账户。更多用户操作点这
git config --global user.name "lxf" #配置git使用用户 git config --global user.email "asd1043014835@163.com" #配置git使用邮箱 git config --global color.ui true #语法高亮 git config --list #查看全局配置
git init
初始化Git工作目录
工作目录就是,里面可以存放你的笔记、代码,而且里面有个隐藏目录.git,里面存放的是历史记录、历史备份,都存在隐藏目录。
# 创建工作目录 [root@CentOS7 ~]# mkdir git_data [root@CentOS7 ~]# cd git_data/ # 初始化 [root@CentOS7 git_data]# git init Initialized empty Git repository in /root/git_data/.git/
#.git目录存放所有历史备份文件,文件都不是明文存放
[root@CentOS7 git_data]# ll -a
total 0
drwxr-xr-x. 3 root root 18 Jun 28 18:21 .
dr-xr-x---. 4 root root 198 Jun 28 18:21 ..
drwxr-xr-x. 7 root root 119 Jun 28 18:21 .git
[root@CentOS7 git_data]# git status # 查看工作区状态
# On branch master # 在主分支
#
# Initial commit # 初始提交
#
nothing to commit (create/copy files and use "git add" to track)
git add
创建数据-提交数据
[root@git git_data]# pwd /root/git_data [root@git git_data]# touch README #在工作目录的创建一个文件 [root@git git_data]# git status #创建个文件后在查看git状态就会不一样 # On branch master # # Initial commit # # Untracked files: #Untracked 没有跟踪的文件 # (use "git add <file>..." to include in what will be committed) #提示你用这个命令提交创建的文件 # # README #红字表示没有跟踪的文件 nothing added to commit but untracked files present (use "git add" to track)
[root@git git_data]# git add README #根据提示提交创建的文件 [root@git git_data]# git status #然后在查看一下git的状态,又会改变 # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: README #已经跟踪的文件会变绿,然后才可以提交文件 # #设置颜色高亮不同状态才显示不同颜色
git工作原理
git提交一个数据或文件,它要分为两步骤,三个区域
- 工作目录是:git_data目录,我们在这里创建了一个README文件
- 然后git add README,这样只是把这个文件提交到了:暂存区域
- 为什么要设置暂存区域,使你万一提交错了可以反悔,保存到服务器就删不掉了,有个缓存的区域
- 所以git add 表示提交数据到暂存区域,但我们最终目标还是要把文件交给git服务器,所以最后一步是吧文件交给git服务器
- 怎么提交给git服务器呢?一个命令git commit:提交暂存文件至版本库。
git commit使用
git commit -m 'first commit' #一次把暂存区域的文件,全部提交 # -m 的意思是为你提交的文件写一个说明,关于哪方面的,提交的什么东西,都可以详细的写出来 #一定要写,方便查找历史记录,而且不写也会提示你写
[root@git git_data]# git commit -m 'first commit' [master (root-commit) cc09e5a] first commit #master:主分支,中括号口面是-m的说明 2 files changed, 0 insertions(+), 0 deletions(-) #2个文件改变了,0个插入,0个删除 create mode 100644 README #创建了权限是644的文件README create mode 100644 gittest #创建了权限是644的文件gittest
git add * # 添加工作目录里的所有文件到暂存区域
修改或删除暂存区域的文件
没有添加到暂存区的数据直接rm删除即可。
已经添加到暂存区数据:
- 创建一个文件:touch test
- 添加到缓存区:git add test
从缓存区里删除的方法三种:
方法一:git rm --cached test 方法二:git reset HEAD test #将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件) 方法三:git rm -f test #将文件数据从git暂存区和工作目录一起删除
文件改名
普通文件改名: mv test test1 加入缓存区后:git mv test test1
查看历史记录,git日志
git log #→查看提交历史记录 [root@git git_data]# git log #显示一组信息,因为只提交了一次 commit cc09e5aeb33861d68a4580a5ecff66 #给每一次提交一个序列号,查找某个记录用,如果要回滚某个历史版本,回滚命令+序列号 Author: lxf <asd1043014835@163.com> #这行表示,作者是谁 Date: Wed Apr 25 12:39:51 2018 +0800 #日期 first commit #本次提交说明信息,提交的什么东西,-m时指定的
git log -2 #查看最近几条记录 git log -1 -p #-p显示每次提交的内容差异,例如仅查看最近一次差异 git log -2 --stat #--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息 git log --pretty=oneline #--pretty根据不同的格式展示提交的历史信息 回滚时用很方便这个命令
git log --pretty=fuller -2 #以更详细的模式输出提交的历史记录 git log --pretty=fomat:"%h %cn" #查看当前所有提交记录的简短SHA-1哈希字串与提交者的姓名,其他格式见备注。
#→还可以使用format参数来指定具体的输出格式,这样非常便于后期编程的提取分析哦,常用的格式有: %s 提交说明。 %cd 提交日期。 %an 作者的名字。 %cn 提交者的姓名。 %ce 提交者的电子邮件。 %H 提交对象的完整SHA-1哈希字串。 %h 提交对象的简短SHA-1哈希字串。 %T 树对象的完整SHA-1哈希字串。 %t 树对象的简短SHA-1哈希字串。 %P 父对象的完整SHA-1哈希字串。 %p 父对象的简短SHA-1哈希字串。 %ad 作者的修订时间。
快速添加
#只有修改状态的文件才能使用,就是提交过一次,修改后,可以使用这个命令一步到位
git commit -a -m "modifie README" #-a 表示直接提交
还原历史数据
Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。
画图理解,想看哪个版本链接到哪个版本即可,就好像软链接
还原历史版本方法:
# 方法一:还原历史提交版本上一次 git reset --hard HEAD^ # 上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本 # 方法二:利用版本序列号 :显示序列号:git log --pretty=oneline git reset --hard 3de15d4
#精确还原到某个版本用,找到历史还原点的SHA-1值(序列号)后,就可以还原(值不写全,系统会自动匹配)
还原未来数据
# 找出未来版本的序列号,直接git reset --hard 版本号还原
git reflog # 查看未来历史更新点
git reset --hard 版本号
标签使用
#前面回滚使用的是一串字符串,又长又难记,那么每次提交commit完以后打一个标签git tag v1.0默认给当前的版本或最新的版本打一个标签,方便回滚的时候直接git reset --hard v1.0即可。
git tag v1.0 #当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag git tag #查看当前所有的标签 git show v1.0 #查看当前1.0版本的详细信息 git tag v1.2 -m "version 1.2 release is test" #创建带有说明的标签,-a指定标签名字,-m指定说明文字 git tag -d v1.0 #我们为同一个提交版本设置了两次标签,删除之前的v1.0
git reset --hard v1.0 # 还原到标签v1.0版本
对比数据
git diff 可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改后,再把它提交到仓库就放心多了。
git diff README
没有结果是没有修改,修改一下:
分支结构
之前一只是在master分支(主分支)操作
创建,查看,切换,删除分支
git branch linux # 创建linux分支,branch是树枝、分支的意思
git branch # 查看分支,*号在哪就是在哪个分支
git checkout linux # 切换linux分支
git branch -d linux #删除linux分支
checkout的另一个功能
git checkout -- README # 一键还原README文件
[root@git git_data]# git status #没有有改动的文件 # On branch master nothing to commit, working directory clean [root@git git_data]# echo 666 > README #改动一个文件 [root@git git_data]# git status #然后有修改的文件 # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README #文件被修改 # no changes added to commit (use "git add" and/or "git commit -a") [root@git git_data]# git checkout -- README #一键还原,就是还原文件当前版本最初的状态 [root@git git_data]# git status #没有改动的文件 # On branch master nothing to commit, working directory clean
合并分支
git checkout master # 切换到主
git merge linux # 分支linux合并至当前分支,merge合并。
git branch -d linux # 一个良好的习惯,合并完分支以后,把分支删掉
分支冲突
就是主分支和分支一样两行内容,主分支加了一行,分支加了一行,合并的时候就会产生冲突,这时候需要手工合并,解决分支合并冲突。如图:
#合并失败,人工介入,修正了冲突以后,就可以提交了
[root@git git_data]# vim README <<<<<<< HEAD #留下保留的内容其他绿色部分全删除 123 #这是主分支添加的新一行内容,合并时和linux分支发生了冲突,如果保留这行其他全删 ======= #留下保留的内容其他绿色部分全删除 312 #这是linux分支添加的新一行内容,合并时和主分支发生了冲突,如果保留这行其他全删 >>>>>>> linux #留下保留的内容其他绿色部分全删除
git branch -d linux #确认合并完成后,可以放心地删除Linux分支。
GitLab私有服务器
git人人都是中心,通过gitlab服务器共享代码
安装文档 https://about.gitlab.com/downloads/#centos7
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
安装
机器内存给大点
上传安装包,百度下载
yum -y localinstall gitlab-ce-9.1.4-ce.0.el7.x86_64.rpm # 安装本地yum包 gitlab-ctl reconfigure # 初始化,就执行一次 gitlab-ctl status # 安装了很多服务,所以启动的时候,有冲突的服务端口,会导致启动不来,所以安装gitlab需要一个干净的机器 gitlab-ctl status/stop/start
网页登陆
通过浏览器访问页面10.0.0.63,第一次登陆需要设置初始密码12345678,然后登陆
账户:root 密码:12345678
gitlab使用
首先创建新的项目:
这是私有的,所以需要秘钥才能访问
进行SSH key认证
ssh-keygen #在git服务器生成一对秘钥,然后回车三连 cat /root/.ssh/id_rsa.pub #秘钥对私钥和公钥,分发的是公钥,公钥等于锁头,私钥留在手中
创建新的仓库
这个页面拉倒下面
git clone git@10.0.0.63:root/43team.git #克隆上面创建的项目,cd进去就是一个git工作目录,默认当前目录创建 cd 43team touch README.md git add README.md git commit -m "add README" git push -u origin master #推送代码,这样就推送到了gitlab服务器里,页面里查看。
README里是空的,在网页里写点内容,先点击文件打开
然后点击Edit是编辑文件,往里面写点内容
第一步填写本次提交的注释,相当于git commit -m "注释" ,它默认有给你写,第二步是确定修改
下载代码
git pull #下载代码
新增三个命令:上传代码,和下载代码
git clone git@IP地址:root/43team.git #只在第一次复制代码使用,其他时候用下载代码命令即可 git push -u origin master #推送代码,这样就推送到了gitlab服务器里,页面里查看 git pull #下载代码
总结
Command line instructions 命令行指令
Git global setup 全局设置
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
Create a new repository 创建新的仓库
git clone git@10.0.0.63root/43team.git
cd 43team
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
Existing folder
cd existing_folder
git init
git remote add origin git@10.0.0.63root/43team.git
git add .
git commit
git push -u origin master
Existing Git repository
cd existing_repo
git remote add origin git@10.0.0.63root/43team.git
git push -u origin --all
git push -u origin --tags
Git 命令总结
添加用户
git config --global user.name "lxf" #配置git使用用户 git config --global user.email "asd1043014835@163.com" #配置git使用邮箱 git config --global color.ui true #语法高亮 git config --list #查看全局配置
创建git工作目录
cd && mkdir git_data && cd git_data/ && git init
提交到缓存、git服务器命令
查看git状态:git status 提交文件到缓存区:git add file 提交工作目录里的所有文件缓存区:git add * 把所有缓存区的文件提交到git服务器:git commit -m '这里面是说明提交的是什么'
删除暂存区的文件
方法一:git rm --cached test 方法二:git reset HEAD test #将文件从git暂存区移除,不会删除工作目录里的文件 方法三:git rm -f test #将文件从缓存区里移除,并删除,一次到位
文件改名
普通文件改名: mv test test1 加入缓存区后:git mv test test1
查看历史记录命令,就是查看git日志
git log #查看历史记录 git log -2 #查看最近几条记录 git log -1 -p #-p显示每次提交的内容差异,例如仅查看最近一次差异 git log -2 --stat #--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息 git log --pretty=oneline #--pretty根据不同的格式展示提交的历史信息
回滚时用,很方便这个命令
git log --pretty=fuller -2 #以更详细的模式输出提交的历史记录 git log --pretty=fomat:"%h %cn" #查看当前所有提交记录的简短SHA-1哈希字串与提交者的姓名,其他格式见备注。
#→还可以使用format参数来指定具体的输出格式,这样非常便于后期编程的提取分析哦,常用的格式有: %s 提交说明。 %cd 提交日期。 %an 作者的名字。 %cn 提交者的姓名。 %ce 提交者的电子邮件。 %H 提交对象的完整SHA-1哈希字串。 %h 提交对象的简短SHA-1哈希字串。 %T 树对象的完整SHA-1哈希字串。 %t 树对象的简短SHA-1哈希字串。 %P 父对象的完整SHA-1哈希字串。 %p 父对象的简短SHA-1哈希字串。 %ad 作者的修订时间。
还原历史版本方法:
方法一:还原历史提交版本上一次 git reset --hard HEAD^ ##上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本 方法二:利用版本序列号,显示序列号: git log --pretty=oneline git reset --hard 3de15d4 #精确还原到某个版本用,找到历史还原点的SHA-1值(序列号)后,就可以还原(值不写全,系统会自动匹配)
还原未来数据
#找出未来版本的序列号,直接git reset --hard 版本号还远 git reflog #查看未来历史更新点
git reset --hard 版本号
标签使用
#前面回滚使用的是一串字符串,又长又难记,那么每次提交commit完以后打一个标签git tag v1.0默认给当前的版本打一个标签,方便回滚的时候直接git reset --hard v1.0即可。 git tag v1.0 #当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。 git tag #查看当前所有的标签 git show v1.0 #查看当前1.0版本的详细信息 git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字 git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0
分支-操作
git branch linux #创建linux分支,branch是树枝、分支的意思 git branch #查看分支,*号在哪就是在哪个分支 git checkout linux #切换linux分支 git branch -d linux #删除linux分支 git checkout -- README #一键还原README文件
[root@git git_data]# git status #没有有改动的文件 # On branch master nothing to commit, working directory clean [root@git git_data]# echo 666 > README #改动一个文件 [root@git git_data]# git status #然后有修改的文件 # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README #文件被修改 # no changes added to commit (use "git add" and/or "git commit -a") [root@git git_data]# git checkout -- README #一键还原,就是还原文件当前版本最初的状态 [root@git git_data]# git status #没有改动的文件 # On branch master nothing to commit, working directory clean
合并分支
git checkout master #切换到主 git merge linux #分支linux合并至当前分支,merge合并。 git branch -d linux #一个良好的习惯,合并完分支以后,把分支删掉
分支冲突
就是主分支和分支一样两行内容,主分支加了一行,分支加了一行,合并的时候就会产生冲突,这时候需要手工合并,解决分支合并冲突。如图:
#合并失败,人工介入,修正了冲突以后,就可以提交了
[root@git git_data]# vim README
<<<<<<< HEAD #留下保留的内容其他绿色部分全删除
123 #这是主分支添加的新一行内容,合并时和linux分支发生了冲突,如果保留这行其他全删
======= #留下保留的内容其他绿色部分全删除
312 #这是linux分支添加的新一行内容,合并时和主分支发生了冲突,如果保留这行其他全删
>>>>>>> linux #留下保留的内容其他绿色部分全删除
git branch -d linux #确认合并完成后,可以放心地删除Linux分支。
上传和下载代码
git push -u origin master #推送代码,这样就推送到了gitlab服务器里,页面里查看 git pull #下载代码
补充stash
git stash 把当前正在开发的东西保存起来 并 回到当前版本的状态
比如当前版本是:
<li>欧美</li> <li>动画</li> <li>日韩</li>
正在开发的是:
<li>欧美</li> <li>动画</li> <li>日韩</li> <li>国产正在开发中。。。
这时候各种原因,需要删除动画然后继续开发。
git stash就用到了,执行git stash命令保存正在开发的东西并回到当前版本的状态并删除动画
<li>欧美</li> <li>日韩</li>
然后要继续开发国产,执行git stash pop得到:
<li>欧美</li> <li>日韩</li> <li>国产正在开发中。。。
如果出现冲突,留下任意绿色的内容其它全删掉即可
stash相关命令
git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
git stash list 查看“某个地方”存储的所有记录
git stash clear 清空“某个地方”
git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
git stash drop 编号,删除指定编号的记录
githup&gitlab命令
# 给域名起个别名 ,相当于origin=https.... git remote add origin https://github.com/lixiaofeng-githup/test.git # 推送到远程仓库的master分支 git push -u origin master # 第一次拉取代码,会让输入gitlab or githup的账户密码 git clone 地址 # 以后只需要 git pull 相当于下面两步
git fetch origin dev # 拉到暂存区
git merge origin/dev # 合并
git rebase origin/dev # 面试题rebase的作用,保持提交记录的整洁