版本控制-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)!