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的作用,保持提交记录的整洁
原文地址:https://www.cnblogs.com/lxfpy/p/11122207.html