自学内容网 自学内容网

版本控制-Git

版本控制

一、概念

  • 版本控制是管理修改的艺术
  • 指对软件开发过程中各种程序代码、配置文件及说明文档等文件的变更管理
  • 是软件管理配置的核心思想之一

二、好处

优雅的备份:

  • 本地和服务器均保存备份文件,当本地出现问题时可以通过服务器修复

多人并行开发:

  • 每个人通过创建属于自己的分支,不影响其他人操作

了解变化内容

  • 提交版本信息时需要加上简单的备注信息,标记本次修改的内容

版本控制系统

一、什么是版本控制系统

  • 是一个记录文件内容变化以便将来查阅特定版本修订情况的系统
  • 不仅可以应用于软件源代码文件,而且可以对任意类型文件进行版本控制
  • 版本库是版本控制系统的核心

二、什么是版本库

  • 版本库是版本控制的核心
  • 任意数量客户端
  • 客户端通过写数据库分享代码
  • 典型的客户/服务器系统

三、集中式版本控制系统

  • 开发者之间共用一个仓库(repository)
  • 所有操作需要联网

四、分布式版本控制系统

  • 每个开发者都是一个仓库的完整克隆,每个人都是服务器
  • 支持断网操作

版本控制软件

一、集中式版本控制软件

  • CVS
  • SVN(Subversion)

二、分布式版本控制软件

  • Git
  • BitKeeper(收费)

分布式版本控制Git

一、简介

  • 是一个开源的分布式版本控制软件
  • 傻瓜内容跟踪器
  • 可以有效、高速的处理从很小到非常大的项目版本控制

二、安装

# 安装中文支持(选做)
[root@Programer ~]# echo $LANG    # 查看当前系统语言及编码
en_US.UTF-8

# 安装中文支持
[root@Programer ~]# yum -y install langpacks-zh_CN.noarch

# 配置系统使用中文及编码
[root@Programer ~]# vim /etc/locale.conf
[root@Programer ~]# cat /etc/locale.conf 
LANG="zh_CN.UTF-8"

# 重启使语言配置生效
[root@Programer ~]# reboot

# 确认使用中文编码
[root@Programer ~]# echo $LANG
zh_CN.UTF-8

[root@Programer ~]# yum -y install git
[root@Programer ~]# git --version
[root@Programer ~]# git --help

三、基本概念

本地工作区(Workspace)

  • 存放从仓库中提取出来的文件的地方,放在磁盘上供你使用或修改

暂存区(Index/Stage)

  • 就是一个文件,索引文件,保存了下次将提交的文件列表信息

本地仓库(Local Repository)

  • 保存所有数据的地方,这里边有提交的所有版本的数据

远程仓库(Remote Repository)

  • 托管代码的地方,可供其他人浏览、下载代码的服务器

四、工作流程

五、常用子命令

config    修改git配置
init      初始化本地仓库
add       添加修改到暂存区
commit    提交修改到本地仓库
status    查看当前状态
clone     将远程服务器的仓库克隆到本地
push      提交修改到远程服务器

六、基础配置

Git 在使用前要做一些基础配置

# --local:仓库级
# --global:全局级
# --system:系统级

# 设置用户名
### 提交代码时使用的身份(标识提交者)
[root@Programer ~]# git config --global user.name mark

# 设置用户邮箱
[root@Programer ~]# git config --global user.email mark@test.cn

# 设置版本库默认分支
[root@Programer ~]# git config --global init.defaultBranch master

# 查看已有Git配置
[root@Programer ~]# git config --list
user.name=mark
user.email=mark@test.cn
init.defaultbranch=master

# 查看Git配置持久化文件
[root@Programer ~]# cat ~/.gitconfig
[user]
        name = mark
        email = mark@test.cn
[init]
        defaultBranch = master

七、创建版本库

1、初始化空版本库

# 使用Git命令初始化空版本库
[root@Programer ~]# ls

# 初始化空版本库
[root@Programer ~]# git init myproject
已初始化空的 Git 仓库于 /root/myproject/.git/

# 确认版本库已创建
[root@Programer ~]# ls
myproject
[root@Programer ~]# ls -a myproject/                            
.  ..  .git
[root@Programer ~]# ls -a myproject/.git/
.  ..  branches  config  description  HEAD  hooks  info  objects  refs

2、将已有目录制作成Git版本库

# 创建空目录
[root@Programer ~]# mkdir mytest
[root@Programer ~]# ls -a mytest/                               
.  ..
[root@Programer ~]# cd mytest/

# 将已有目录制作成Git版本库
[root@Programer mytest]# git init
已初始化空的 Git 仓库于 /root/mytest/.git/
[root@Programer mytest]# ls -a
.  ..  .git
[root@Programer mytest]# ls -a .git/
.  ..  branches  config  description  HEAD  hooks  info  objects  refs

八、版本库操作

# 熟悉Git基础命令使用
[root@Programer ~]# cd myproject/

# 查看Git本地仓库状态
[root@Programer myproject]# git status
位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

# 创建readme文件
[root@Programer myproject]# echo "Learning Git" >> readme.md

# 查看Git本地仓库状态
[root@Programer myproject]# git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
        readme.md

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

# 将文件信息添加到暂存区
[root@Programer myproject]# git add readme.md

# 查看Git本地仓库状态
[root@Programer myproject]# git status
位于分支 master

尚无提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)
        新文件:   readme.md

# 将暂存区文件提交到本地仓库
[root@Programer myproject]# git commit -m "add readme"
[master(根提交) 09d8603] add readme
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md
[root@Programer myproject]# git status
位于分支 master
无文件要提交,干净的工作区

九、版本库查看

1、查看本地版本库版本

# 本地版本库提交记录(详细)
[root@Programer myproject]# git log
commit 09d8603547b7f7c6cf5b2850dd241d4b8b799b74 (HEAD -> master)
Author: mark <mark@tedu.cn>
Date:   Wed Feb 22 15:00:46 2023 +0800

    add readme

# 本地版本库提交记录(简略)
[root@Programer myproject]# git log --pretty=oneline
09d8603547b7f7c6cf5b2850dd241d4b8b799b74 (HEAD -> master) add readme

# 本地版本库提交记录(极简)
[root@Programer myproject]# git log --oneline
09d8603 (HEAD -> master) add readme

十、练习(生成多个版本)

[root@Programer ~]# cd myproject/
# 新建test.txt文件
[root@Programer myproject]# echo 123 > test.txt
# 将test.txt添加到暂存区
[root@Programer myproject]# git add test.txt
# 生成新版本
[root@Programer myproject]# git commit -m "add test.txt"
[master 27466f7] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

# 修改test.txt文件
[root@Programer myproject]# echo 456 > test.txt
# 将修改文件添加到暂存区
[root@Programer myproject]# git add .
# 生成新版本
[root@Programer myproject]# git commit -m "modify test.txt"
[master 58cdf79] modify test.txt
 1 file changed, 1 insertion(+), 1 deletion(-)

# 修改test.txt文件
[root@Programer myproject]# echo 789 > test.txt
# 将修改文件添加到暂存区
[root@Programer myproject]# git add ./
# 生成新版本
[root@Programer myproject]# git commit -m "done test.txt"
[master 0f44bf0] done test.txt
 1 file changed, 1 insertion(+), 1 deletion(-)

# 查看本地提交记录(简略)
[root@Programer myproject]# git log --pretty=oneline
0f44bf04834eac643a0d56901039cec73128d3cc (HEAD -> master) done test.txt
58cdf7905a95a956fc65da264aab827fc7290dbf modify test.txt
27466f79df8e0cbfd3f8f2349143e054db8ac693 add test.txt
09d8603547b7f7c6cf5b2850dd241d4b8b799b74 add readme

# 查看本地提交记录(极简)
[root@Programer myproject]# git log --oneline
0f44bf0 (HEAD -> master) done test.txt
58cdf79 modify test.txt
27466f7 add test.txt
09d8603 add readme

Git指针

一、HEAD指针概念

  • HEAD 指针是一个可以在任何分支和版本移动的指针
  • 通过移动指针我们可以将数据还原至任何版本

二、HEAD指针操作

先使用log指令查看版本信息,获取指针

[root@Programer ~]# cd myproject/
[root@Programer myproject]# git log --pretty=oneline
0f44bf04834eac643a0d56901039cec73128d3cc (HEAD -> master) done test.txt
58cdf7905a95a956fc65da264aab827fc7290dbf modify test.txt
27466f79df8e0cbfd3f8f2349143e054db8ac693 add test.txt
09d8603547b7f7c6cf5b2850dd241d4b8b799b74 add readme

# 查看文件内容
[root@Programer myproject]# cat test.txt
789

使用reset子命令回滚到指定版本

# reset子命令用于版本还原
    # --soft:将 HEAD 移动到指定的提交,但不会改变暂存区和工作目录。这意味着暂存区中的更改仍然保留,只是提交记录被撤销了。(当你想撤销最近的一次提交,但保留所有更改在暂存区中,以便重新提交或进一步修改)
    # --mixed(默认模式):将 HEAD 移动到指定的提交,并重置暂存区,但不改变工作目录。这意味着工作目录中的更改仍然保留,但这些更改不再被暂存(当你想撤销最近的一次提交,并且希望将更改从暂存区移出但保留工作目录中的更改)
    # --hard:将 HEAD 移动到指定的提交,并重置暂存区和工作目录。这意味着所有未提交的更改将被丢弃(当你想彻底撤销最近的一次提交,并且不保留任何更改)

# 还原到指定版本
[root@Programer myproject]# git reset --hard 58cdf7905a
HEAD 现在位于 58cdf79 modify test.txt
# 确认HEAD指针移动
[root@Programer myproject]# git log --oneline
58cdf79 (HEAD -> master) modify test.txt
27466f7 add test.txt
09d8603 add readme
# 查看文件内容
[root@Programer myproject]# cat test.txt
456

使用 reflog 子命令配合 reset 回到最新版本

# reflog 子命令用于获取HEAD指针移动轨迹
[root@Programer myproject]# git reflog 
58cdf79 (HEAD -> master) HEAD@{0}: reset: moving to 58cdf79
0f44bf0 HEAD@{1}: commit: done test.txt
58cdf79 (HEAD -> master) HEAD@{2}: commit: modify test.txt
27466f7 HEAD@{3}: commit: add test.txt
09d8603 HEAD@{4}: commit (initial): add readme

[root@Programer myproject]# git reset --hard 0f44bf0
HEAD 现在位于 0f44bf0 done test.txt
[root@Programer myproject]# git log --oneline
0f44bf0 (HEAD -> master) done test.txt
58cdf79 modify test.txt
27466f7 add test.txt
09d8603 add readme
[root@Programer myproject]# git reflog 
0f44bf0 (HEAD -> master) HEAD@{0}: reset: moving to 0f44bf0
58cdf79 HEAD@{1}: reset: moving to 58cdf79
0f44bf0 (HEAD -> master) HEAD@{2}: commit: done test.txt
58cdf79 HEAD@{3}: commit: modify test.txt
27466f7 HEAD@{4}: commit: add test.txt
09d8603 HEAD@{5}: commit (initial): add readme
[root@Programer myproject]# cat test.txt 
789

Git分支

一、基本概念

分支可以让开发分多条主线同时进行,每条主线互不影响

  • 按功能模块分支、按版本分支
  • 分支也可以合并

二、常见的分支规范

  • MASTER 分支(MASTER是主分支,是代码的核心)
  • DEVELOP 分支(DEVELOP最新开发成果的分支)
  • RELEASE 分支(为发布新产品设置的分支)
  • HOTFIX 分支(为了修复软件BUG缺陷的分支)
  • FEATURE 分支(为开发新功能设置的分支)

三、管理多分支

1、查看当前分支

# 查看本地Git仓库信息
[root@Programer ~]# cd myproject/
[root@Programer myproject]# git status
位于分支 master
无文件要提交,干净的工作区

# 查看分支信息
[root@Programer myproject]# git branch -v
* master 0f44bf0 done test.txt

2、创建分支

# 创建分支
### 创建hotfix分支
[root@Programer myproject]# git branch hotfix
### 创建feature分支
[root@Programer myproject]# git branch feature

# 查看分支信息
[root@Programer myproject]# git branch -v
  feature 0f44bf0 done test.txt
  hotfix  0f44bf0 done test.txt
* master  0f44bf0 done test.txt

3、切换分支

在新的分支上就可以继续修改代码

  • 修改文件、创建文件等操作
  • 正常 add、commit 提交版本库
# 切换分支,checkout子命令
### 查看分支信息
[root@Programer myproject]# git branch -v
  feature 0f44bf0 done test.txt
  hotfix  0f44bf0 done test.txt
* master  0f44bf0 done test.txt
### 切换分支
[root@Programer myproject]# git checkout hotfix
切换到分支 'hotfix'

# 查看分支信息
[root@Programer myproject]# git branch -v
  feature 0f44bf0 done test.txt
* hotfix  0f44bf0 done test.txt
  master  0f44bf0 done test.txt

# 切换分支
[root@Programer myproject]# git checkout feature
切换到分支 'feature'

# 查看分支信息
[root@Programer myproject]# git branch -v
* feature 0f44bf0 done test.txt
  hotfix  0f44bf0 done test.txt
  master  0f44bf0 done test.txt

四、删除分支

# 创建develop分支
[root@Programer myproject]# git branch develop
[root@Programer myproject]# git branch -v
  develop 0f44bf0 done test.txt
* feature 0f44bf0 done test.txt
  hotfix  0f44bf0 done test.txt
  master  0f44bf0 done test.txt

# 删除develop分支
[root@Programer myproject]# git branch -d develop
已删除分支 develop(曾为 0f44bf0)。

五、合并分支

合并前,一定要切换到master分支

执行merge命令合并分支

# 无冲突分支合并
[root@Programer ~]# cd myproject/

# 切换到hotfix分支
[root@Programer myproject]# git checkout hotfix
切换到分支 'hotfix'

# 创建haha文件
[root@Programer myproject]# echo haha > haha.txt

# 添加haha到暂存区
[root@Programer myproject]# git add ./

# 生成新版本
[root@Programer myproject]# git commit -m "add haha.txt"
[hotfix 108cf46] add haha.txt
 1 file changed, 1 insertion(+)
 create mode 100644 haha.txt
[root@Programer myproject]# ls
haha.txt  readme.md  test.txt
[root@Programer myproject]# cat haha.txt 
haha

# 切换到master分支
[root@Programer myproject]# git checkout master
切换到分支 'master'

# 创建xixi文件
[root@Programer myproject]# echo xixi > xixi.txt

# 添加xixi到暂存区
[root@Programer myproject]# git add ./

# 生成新版本
[root@Programer myproject]# git commit -m "add xixi.txt"
[master 32f0842] add xixi.txt
 1 file changed, 1 insertion(+)
 create mode 100644 xixi.txt
[root@Programer myproject]# ls
readme.md  test.txt  xixi.txt

# 合并hotfix分支到master分支
[root@Programer myproject]# git merge hotfix
Merge made by the 'recursive' strategy.
 haha.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 haha.txt
# 确认文件
[root@Programer myproject]# ls
haha.txt  readme.md  test.txt  xixi.txt
[root@Programer myproject]# cat haha.txt 
haha
[root@Programer myproject]# cat xixi.txt 
xixi

四、解决分支冲突

1、冲突

修改了不同分支中相同文件的相同行

  • 系统无法合并分支,产生了冲突
# 切换到hotfix分支
[root@Programer myproject]# git checkout hotfix
切换到分支 'hotfix'

# 创建a.txt文件
[root@Programer myproject]# echo "hahaha" > a.txt

# 添加到暂存区
[root@Programer myproject]# git add .

# 生成新版本
[root@Programer myproject]# git commit -m "hotfix"
[hotfix af8a04b] hotfix
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt


# 切换到master分支
[root@Programer myproject]# git checkout master

# 创建a.txt
[root@Programer myproject]# echo "xixixi" > a.txt

# 添加到暂存区
[root@Programer myproject]# git add .
# 生成新版本
[root@Programer myproject]# git commit -m "master"

# 合并hotfix分支到master分支
[root@Programer myproject]# git merge hotfix
冲突(add/add):合并冲突于 a.txt
自动合并 a.txt
自动合并失败,修正冲突然后提交修正的结果。

2、查看

查看有冲突的文件

[root@Programer myproject]# cat a.txt 
<<<<<<< HEAD
xixixi
=======
hahaha
>>>>>>> hotfix

3、修改

直接修改有冲突的文件,修改为最终需要的文件内容

  • 修改完成后,正常 add,commit 提交,解决冲突
[root@Programer myproject]# vim a.txt
[root@Programer myproject]# cat a.txt 
xixixi
hahaha
[root@Programer myproject]# git add ./ 
[root@Programer myproject]# git commit -m "resolve"
[master 2a6f272] resolve

分支与HEAD指针的关系

一、概述

创建分支的本质是在当前提交上创建一个可以移动的指针

如何判断当前分支呢?

  • 根据HEAD这个特殊指针

二、多分支提交的流程

1、切换分支,只是移动HEAD指针

2、testing分支的提交,不会影响master

3、切换回master分支

4、master提交也不影响testing分支

Git标签

一、概念

  • 标签用于标记某一提交点,唯一绑定一个固定的 commitId ,相当于为这次提交记录指定一个别名,方便提取文件
  • 可以为重要的版本打上标签,标签可以是一个对象,也可以是一个简单的指针,但是指针不会移动

二、操作

1、使用tag子命令打标签

[root@Programer ~]# cd myproject/
# 查看已有标签
[root@Programer myproject]# git tag

# 创建v1标签
[root@Programer myproject]# git tag v1

# 查看已有标签
[root@Programer myproject]# git tag
v1

# 创建v2标签
[root@Programer myproject]# git tag v2

# 查看已有标签
[root@Programer myproject]# git tag
v1
v2

# 删除v2标签
[root@Programer myproject]# git tag -d v2
已删除标签 'v2'(曾为 2a6f272)


原文地址:https://blog.csdn.net/it_zhenxiaobai/article/details/143691670

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!