Git工具

本文详细讲解了Git作为分布式版本控制系统的特点,集中式与分布式区别,以及如何使用命令行进行版本控制、初始化、配置用户信息、工作流程、分支操作、解决合并冲突和标签管理。重点介绍了Git的工作区、暂存区、仓库和远程仓库的概念,以及git diff、git commit、git branch和git stash等关键命令的应用。
摘要由CSDN通过智能技术生成

Git工具

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集中式和分布式版本控制

Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?

集中式版本控制

先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

集中式版本控制,典型代表SVN

集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

而且如果集中式版本服务器宕机了,所有人都没法工作。

在这里插入图片描述

分布式版本控制

分布式版本控制,没有中央服务器的概念,每个人都有自己的版本库,因此每个人在工作时候,不需要联网,版本库本地即可管理。

既然每个人都是一个完整的版本库,同事之间如果需要协作开发,就需要找一个用于“交换文件”的中央服务器,这个服务器不存在也不影响大家干活,只是用于交换文件内容。

GIT最强大的功能还有分支管理,远甩SVN等软件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

命令行

Git有多种方式使用

  • 原生命令行,才能使用git所有命令,会git命令再去用gui图形工具,完全无压力
  • GUI图形软件,只是实现了git的部分功能,以减免操作难度,难以记住git原生命令
  • 不同的人会有不同的GUI图形工具,但是所有人用的git原生命令都一样,推荐学习命令

在 Linux 上安装

如果你想在 Linux 上用二进制安装程序来安装 Git,可以使用发行版包含的基础软件包管理工具来安装。 如果以Centos 上为例,你可以使用 yum:

sudo yum install git

环境准备

准备好一台linux机器,且进行环境初始化,主机名、配置yum源、安装基础软件包、关闭防火墙、同步系统时间等。

安装git

[root@git01 ~]# yum install git -y
[root@git01 ~]# git --version
git version 1.8.3.1

运行git前的配置

既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。

回顾linux用户的概念

linux多用户,多任务

一台机器可以有多个用户登录,同时操作

因此就存在了不同的环境变量,用来区分,每个登录linux机器的用户

比如root用户的信息,在ls -a /root/

普通yuchao用户的信息,在 ls -a /home/yuchao

不同的用户登录后,linux加载不同的环境变量参数,对系统控制

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

这个用户指的是linux用户

三种环境参数

  • –system
  • –global
  • –local
  • /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。(针对任意登录该linux的用户都生效)
  • ~/.gitconfig~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。(只针对当前登录系统的用户生效)
  • 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。 --local 当前仓库配置。(只针对某一个文件夹生效,例如/learn/linux/.git/config)

用户信息配置

通常配置git,只需要配置好你是谁,你的邮箱,这样就知道是谁在提交代码了。

# git config --global user.name "josen"
# git config --global user.email "791249887@qq.com"
# git config --global color.ui true


我们这里配置的是--global参数,因此是在用户家目录下,可以查看
[root@git01 ~]# cat .gitconfig
[user]
    name = pyyu
    email = yc_uuu@163.com
[color]
    ui = true

Git配置相关命令

yum install git -y  安装git

git --version  查看git版本

git config --system --list 查看系统所有linux用户的通用配置,此命令检查/etc/gitconfig

git config --global --list 查看当前linux用户的配置,检查~/.gitconfig文件

git config --local --list 查看git目录中的仓库配置文件,.git/config文件

git config --global user.name "pyyu"  配置当前linux用户全局用户名,这台机器所有git仓库都会用这个配置

git config --global user.email "yc_uuu@163.com"  配置当前linux用户全局邮箱

git config --global color.ui true 配置git语法高亮显示

git config --list 列出git能找到的所有配置,从不同的文件中读取所有结果

git config user.name  列出git某一项配置

git help 获取git帮助

man git man手册

git help config 获取config命令的手册

Git工作流程

Git四个区域

使用git就是将本地文件(工作目录workspace)的文件,添加到暂存区(stage),然后提交到本地仓库(repository),最终可以协同开发,推送到远程仓库(remote)。

在这里插入图片描述

Git实践

git版本库,也叫做git仓库(repository),也就是一个文件夹。

这个目录的所有内容被git软件管理,所有的修改,删除,git都会跟踪记录,便于可以跟踪历史记录,以后可以还原文件。

三种场景需求:

1.把已有的项目代码,纳入git管理
cd mysite    mysite项目所在代码
git init        初始化git仓库

git init命令会创建一个.git隐藏子目录,这个目录包含初始化git仓库所有的核心文件。
此步仅仅是初始化,此时项目里的代码还没有被git跟踪,因此还需要git add对项目文件跟踪,然后git commit提交到本地仓库

想知道.git文件做了什么事,请看git原理 >Git 内部原理

2.新建一个项目,直接用git管理
cd 某个文件夹
git init mysite      此步会在当前路径创建mysite文件夹,mysite文件夹中包含了.git的初始化文件夹,所有配置
3.获取远程代码仓库代码
如果你想获取github上的代码,或者你公司gitlab私有仓库的代码,可以使用git clone命令,下载克隆远程仓库的代码。

git clone https://github.com/django/django.git
下载出来的代码已经是被git管理的本地仓库
你会发现所有的项目文件都在这里,等待后续开发
PS:git原理

.git这个目录中

[root@pyyuc ~/git_learning/mysite 11:08:19]#tree .git
.git
├── branches
├── config    这个项目独有的配置
├── description
├── HEAD    head文件指示目前被检出的分支
├── hooks  hooks目录包含服务端和客户端的钩子脚本 hook scripts
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── index  index文件保存暂存区的信息,只有git add之后才会生成,默认还没有这个文件
├── info    info目录是全局性排除文件,用于放置不想被记录在.gitignore文件中的忽略模式(ignored patterns)
│   └── exclude
├── objects  存储所有数据内容
│   ├── info
│   └── pack
└── refs  refs目录存储指向数据(分支)的提交对象的指针
    ├── heads
    └── tags

.git文件夹解析

Git生命周期演练

git工作区

在我们进行git init hello_git初始化一个git项目时,这个git_code文件夹,就是一个工作区(working Directory)

[root@teach_linux2 /]# mkdir /git_code[root@teach_linux2 /]# cd /git_code/[root@teach_linux2 git_code]# git init hello_git[root@teach_linux2 git_code]# lshello_git[root@teach_linux2 git_code]# cd hello_git/[root@teach_linux2 hello_git]# pwd/git_code/hello_git[root@teach_linux2 hello_git]# ls -a.  ..  .git

git仓库

工作区里有一个.git隐藏文件夹,就是git的本地仓库

.git文件夹里有一个index文件,就是git的暂存区,也叫做stage

.git文件夹里的HEAD文件就是git的一个指针

原理图

image-20200706162526177

git init hello_git                         初始化git仓库git status                                 查看git状态touch hi.sh                               新建一个代码文件,此时是未被git跟踪的git status                                查看状态(此时git会提示你,是否要git add 添加到暂存区)# On branch master## Initial commit## Untracked files:#   (use "git add <file>..." to include in what will be committed)##	hi.shnothing added to commit but untracked files present (use "git add" to track)git add .  开始跟踪hi.sh文件(确认要添加)git status   此时再看已经被跟踪,现在已是可以被提交的状态,此时处于暂存区(git会问你,是否要提交到本地仓库)# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##	new file:   hi.sh#git commit -m "josen first commit"  告诉git,把暂存区的main.py提交到本地仓库[master (root-commit) 8996e9a] josen first commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 hi.shgit log     查看刚才的commit记录

检查git文件状态

git status 此命令查看git工作目录的文件,处于生命周期的哪一个状态 注意,只能在git工作目录中输入这个命令,他会去找.git文件夹 第一次输入git status会看到此状态,没有任何东西需要提交[root@pyyuc ~/git_learning/mysite 12:00:34]#git status# On branch master ## Initial commit#nothing to commit (create/copy files and use "git add" to track)说明当前工作目录很干净,所有的已跟踪文件,已经被提交且未更改。此时处在master默认分支。

给文件重命名

有同学会说,这也太简单了,mv不就得了吗

错误操作:我们还是在git版本库中操作修改hi.sh为hinimei.shmv hi.sh  hinimei.sh查看状态git status直接mv的操作,会被git记录为两个形容:一、删除原有文件。二、新建了hinimei.sh文件此时新文件还未被跟踪,需要git add , git commit原本的hi.sh还需要从暂存区删除[root@teach_linux2 hello_git]# git status# On branch master# Changes not staged for commit:#   (use "git add/rm <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##	deleted:    hi.sh## Untracked files:#   (use "git add <file>..." to include in what will be committed)##	hinimei.shno changes added to commit (use "git add" and/or "git commit -a")手动删除了这个新文件 hinimei.shrm -rf hinimei.sh此时hi.sh还在git的暂存区呢,此时可以用一个命令,回复该文件git checkout hi.sh此时再查看git工作区的状态,就和啥都没发生一样[root@teach_linux2 hello_git]# git status# On branch masternothing to commit, working directory clean正确操作:查看在git工作区,正确改名字的用法git mv hi.sh hinimei.sh提交版本信息(提交版本的作用,就是可以用于,版本回退)[root@teach_linux2 hello_git]# git commit  -m "修改了hi.sh文件名"[master 85660a4] 修改了hi.sh文件名 1 file changed, 0 insertions(+), 0 deletions(-) rename hi.sh => hinimei.sh (100%)

这样的步骤很麻烦,可以直接git mv 命令即可

刚才的mv记录,可以通过git log查看历史记录,已经提交的id

可以通过git reset 回退历史版本,回退到改名之前

[root@pyyuc ~/mysite 15:10:12]#git logcommit f60fa7f1312843aa57edc9464192c9d891f23fb5Author: pyyu <yc_uuu@163.com>Date:   Sat Dec 22 15:08:02 2018 +0800    mv mymain.pycommit 65e0a2239909fd5aabc5928ec4431de3f163a195Author: pyyu <yc_uuu@163.com>Date:   Sat Dec 22 14:51:07 2018 +0800    echo main.py回退到上一次commit版本,(注意这个命令,很危险,慎用)git reset --hard 65e0a2239909fd5aabc5928ec4431de3f163a195 --hard 清空暂存区和工作目录资料

文件改名最正确的姿势

git mv main.py mymain.py  git commit -m "mv mymain.py"

git版本历史

在我们使用git的时候,会对代码文件不停的修改,不断的提交到代码仓库。

这个就如同我们打游戏时候,保存关卡记录的操作。

image-20200706162827184

在打boss之前,先做一个存档,防止你这个渣渣,被boss一招秒杀,又得从头再来。。。。。

因此被boss弄死,可以从存档,重新开始游戏。。。。

git log

当你的代码写好了一部分功能,就可以保存一个"存档",这个存档操作就是git commit,如果代码出错,可以随时回到"存档"记录

查看"存档"记录,查看commit提交记录的命令 git log

我们可以吧git commit操作与虚拟机的快照做对比理解,简单理解就是每次commit,就等于我们对代码仓库做了一个快照。

可以演示下vmware快照

那么我们如何知道文件快照了多少次呢?

git log命令显示,从最新的commit记录到最远的记录顺序。

git log --oneline    一行显示git记录git log --oneline  --all  一行显示所有分支git记录git log --oneline --all -4 --graph 显示所有分支的版本演进的最近4条git log -4  显示最近4条记录git log --all     显示所有分支的commit信息git branch -v 查看分支信息git help --web log 以web界面显示log的参数

git文件对比

我们先记住如下几个命令的作用:

  • git diff:
    • 当工作区有改动,暂存区为空,diff比较的是工作区最后一次commit提交的仓库的共同文件
    • 当工作区有改动,暂存区不为空,diff比较的是工作区暂存区的共同文件
  • git diff --cached或git diff --staged
    • 显示暂存区(已add但未commit的文件)和最后一次commit之间所有的不相同的文件,增删改信息。
  • git diff HEAD:
    • 显示工作区(已跟踪但未add的文件)和暂存区(已add但未commit的文件)和本地仓库(最后一次commit的文件)所有不相同文件的增删改。
命令实践

情况一:工作区,暂存区,都没有改动

# 情况一,工作区,暂存区,都没有改动[yuchao@yumac ~/learn_git]$git statusOn branch masternothing to commit, working tree clean[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git diff

情况二:工作区有改动,暂存区为空(未git add的情况),比较的是工作区和本地仓库

# 情况二,工作区有改动,暂存区为空(未git add的情况),比较的是工作区和本地仓库[yuchao@yumac ~/learn_git]$cat learn.txt超哥带你学git[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$echo "超哥带你学git,好嗨哦" >> learn.txt[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git restore <file>..." to discard changes in working directory)    modified:   learn.txtno changes added to commit (use "git add" and/or "git commit -a")[yuchao@yumac ~/learn_git]$git diffdiff --git a/learn.txt b/learn.txtindex 46cf52a..8f433a7 100644--- a/learn.txt+++ b/learn.txt@@ -1 +1,2 @@ 超哥带你学git+超哥带你学git,好嗨哦

情况三:工作区有改动,暂存区不为空,比较的是工作区和本地仓库

# 情况三,工作区有改动,暂存区不为空,比较的是工作区和本地仓库[yuchao@yumac ~/learn_git]$git add .[yuchao@yumac ~/learn_git]$git diff# 看不到任何结果,是因为工作区和暂存区内容一样的# 因此可以在本地再添加一些信息[yuchao@yumac ~/learn_git]$echo "超哥带你学git,真的很嗨哦" >> learn.txt[yuchao@yumac ~/learn_git]$git diffdiff --git a/learn.txt b/learn.txtindex 8f433a7..dc0a6ba 100644--- a/learn.txt+++ b/learn.txt@@ -1,2 +1,3 @@ 超哥带你学git 超哥带你学git,好嗨哦+超哥带你学git,真的很嗨哦# 添加工作区的内容放入,暂存区[yuchao@yumac ~/learn_git]$git add .[yuchao@yumac ~/learn_git]$git diff[yuchao@yumac ~/learn_git]$git statusOn branch masterChanges to be committed:  (use "git restore --staged <file>..." to unstage)    modified:   learn.txt# 提交暂存区的内容[yuchao@yumac ~/learn_git]$git commit -m "second commit with modified learn.txt"[master 688c0ba] second commit with modified learn.txt 1 file changed, 2 insertions(+)[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git diff

情况四:刚才比较的都是本地工作区的文件区别,现在比较暂存区本地仓库的区别

# 案例1,当前暂存区为空[yuchao@yumac ~/learn_git]$git statusOn branch masternothing to commit, working tree clean[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git diff --cached# 暂存区有内容[yuchao@yumac ~/learn_git]$echo "git diff很强大哦" >> learn.txt[yuchao@yumac ~/learn_git]$git add .[yuchao@yumac ~/learn_git]$git statusOn branch masterChanges to be committed:  (use "git restore --staged <file>..." to unstage)    modified:   learn.txt[yuchao@yumac ~/learn_git]$# 使用git diff查看git diff --cached区别# 直接git diff没有结果,因为比较的是工作区和暂存区信息,是一样的,已经git add了[yuchao@yumac ~/learn_git]$git diff  # 使用git add --cached,发现区别,比较的是暂存区和本地仓库的区别[yuchao@yumac ~/learn_git]$git diff  --cacheddiff --git a/learn.txt b/learn.txtindex dc0a6ba..52ef4f1 100644--- a/learn.txt+++ b/learn.txt@@ -1,3 +1,4 @@ 超哥带你学git 超哥带你学git,好嗨哦 超哥带你学git,真的很嗨哦+git diff很强大哦

情况五:比较所有区域的区别

git diff head:

  • 显示工作区(已跟踪但未add的文件)和暂存区(已add但未commit的文件)和本地仓库(最后一次commit的文件)所有不相同文件的增删改。
# 所有区域没有内容变化,没有结果[yuchao@yumac ~/learn_git]$git diff HEAD# 工作区有内容变化,和本地仓库有文件差异[yuchao@yumac ~/learn_git]$echo "git diff 最后一个示例了" >> learn.txt[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git diff headdiff --git a/learn.txt b/learn.txtindex 52ef4f1..a382ed8 100644--- a/learn.txt+++ b/learn.txt@@ -2,3 +2,4 @@ 超哥带你学git,好嗨哦 超哥带你学git,真的很嗨哦 git diff很强大哦+git diff 最后一个示例了# 工作区,暂存区,本地仓库三个比较,仍有区别[yuchao@yumac ~/learn_git]$git add .[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git diff headdiff --git a/learn.txt b/learn.txtindex 52ef4f1..a382ed8 100644--- a/learn.txt+++ b/learn.txt@@ -2,3 +2,4 @@ 超哥带你学git,好嗨哦 超哥带你学git,真的很嗨哦 git diff很强大哦+git diff 最后一个示例了# 提交暂存区后,所有区域没有区别了[yuchao@yumac ~/learn_git]$git commit -m "learn git diff end."[master e670d84] learn git diff end. 1 file changed, 1 insertion(+)[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$[yuchao@yumac ~/learn_git]$git diff head

总结,看来git diff head能最大程度的检查出git区域间的文件一致。

Git仓库文件管理生命周期

还记得git的四个区域吗?本地文件夹,暂存区,本地仓库,远程仓库吗?本地文件夹未初始化,git是不认识的本地文件git init后,就成了git仓库

请记住,在工作文件夹的每一个文件,只有两种状态,一个是未跟踪,一个是已跟踪

1.已跟踪的指的是已经被纳入git版本管理的文件,在git快照中有他的记录

git add .

2.进行版本库提交,将暂存区的内容,写入到本地仓库

git commit -m "提交注释"

3.此时文件被修改了,从unmodified状态变更为modified已经修改的状态

vimecho

4.再次提交这个被修改的文件,进入暂存区

git add file

5.再次的提交版本

git commit -m "修改了文件"

6.从本地仓库中,删除对某个文件的跟踪(将文件,回到未更正的状态,这样可以再次git add进行跟踪)

git rm --cached 文件名

7.此时对上述的删除动作,可以有三个选择

7.1 直接删除这个文件,不要了

rm -rf balala.sh

7.2 撤销你刚才的git rm动作

git reset HEAD balala.sh

7.3 注意,这个操作时和7.2进行选择(再次进入跟踪状态,然后git commit -m 提交)

git add balala.sh

git init初始化时的工作文件夹,都属于已跟踪了,后续的编辑操作都会标记为,已修改文件,因此需要将修改后的文件,加入暂存区,然后提交暂存区的文件。

在这里插入图片描述

Git版本回退

我们已知git commit可以提交代码到本地仓库,如同虚拟机的快照,当也可以进行版本回退。

git log可以查看历史版本记录git reset --hard命令可以回退版本用法一:git reset --hard HEAD^ 回退到上个版本HEAD表示当前版版本HEAD^表示上个版本HEAD^^上上个版本用法二:也可以直接git reset --hard 版本id号这个时候就发现,git commit -m 所标记的注释信息非常重要了吧

版本回退原理

[root@teach_linux2 hello_git]# git reset --hard 35f9e0954177c758957c2a8ef3937d7f76682defHEAD is now at 35f9e09 修改了balala.sh

git版本指针

git查看所有的版本变动日志

穿梭未来有点吓人,其实还是基于git log的恢复,如快照的恢复了。

当你发现你git reset回退版本选错了ID,怎么办?别怕

git reflog帮你记录你每一次执行的命令

[root@teach_linux2 hello_git]# git reflog 8996e9a HEAD@{0}: reset: moving to HEAD^^df0e35f HEAD@{1}: reset: moving to HEAD^35f9e09 HEAD@{2}: commit: 修改了balala.shdf0e35f HEAD@{3}: commit: josen给hinima改名85660a4 HEAD@{4}: commit: josen8996e9a HEAD@{5}: commit (initial): josen first commit

我想回到某一个点,可以再次git reset --hard 版本id

[root@teach_linux2 hello_git]# git reset --hard 35f9e09HEAD is now at 35f9e09 修改了balala.sh[root@teach_linux2 hello_git]# git log --oneline 35f9e09 修改了balala.shdf0e35f josen给hinima改名85660a4 josen8996e9a josen first commit

git stash

保存当前暂存区和工作区的改动存储起来,执行完毕git stash之后,再次运行git status就会发现当前已是个干净的工作区,通过git stash list查看结果

命令整理

git stash 保存暂存区,工作区进度git stash list 查看stash保存的列表以及idgit stash pop  恢复最新的stash进度到工作区git stash pop stash_id  恢复指定的stash进度git stash clear 清空所有存储的stash进度git stash drop stash_id  删除一个存储的stash进度

git stash实际用法

图解stash用法

image-20210126140640216

工作流

image-20210126140718543

git stash会把所有未提交的修改(已经git add 还未git commit)都保存起来,用于以后续恢复当前工作目录。 比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。

1.初始化生成一个新的git仓库git init tech_git在该目录,进行一次版本提交cd teach_gitecho "超哥带你学git" > git.txtgit add .git commit -m "首次提交版本"2.再次写入新内容, 然后提交到暂存区,并且放入stash临时空间echo "echo "超哥带你学stash" > stash.git.txtgit add .3.此时突然要去做其他的事情,比如再去开发另一个功能,但是这个写好的文件,又不想删掉,怎么办?就用git stash[root@teach_linux2 tech_git]# git stash save "save stash.git.txt ing....."Saved working directory and index state On master: save stash.git.txt ing.....HEAD is now at de1ec32 首次提交版本[root@teach_linux2 tech_git]# git stash liststash@{0}: On master: save stash.git.txt ing.....4.此时该文件就会放入到stash临时空间,此时可以去做其他事了,当你其他事做完了,可以再把stash找回来[root@teach_linux2 tech_git]# git stash pop stash@{0}# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##	new file:   stash.git.txt#Dropped stash@{0} (859ce907ba1e7a8888a79af84980455dff63068e)[root@teach_linux2 tech_git]# git stash list[root@teach_linux2 tech_git]# git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##	new file:   stash.git.txt#5.commit提交[root@teach_linux2 tech_git]# git commit -m "创建了stash.git.txt文件,并提交了"[master 6864336] 创建了stash.git.txt文件,并提交了 1 file changed, 1 insertion(+) create mode 100644 stash.git.txt[root@teach_linux2 tech_git]# git log --oneline 6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本

Git分支

在前面我们基本了解Git的使用方法,这一节我们看下GIt重要概念【分支】

在开发软件的时候,可能有多人同时开发一个软件功能或者修复BUG。

假设超哥要开发一个同性在线交友的网站,这个写代码的工作进行分配,分给两个小弟进行功能开发,一个是武沛奇分支,一个是苑昊分支,他俩自己的分支别人看不到,当他俩代码写完后,合并到master主分支上,这样既保证主代码的安全,又能协同开发,互不影响。

image-20200707104340624

git分支命令

1.查看分支,查看当前分支情况,在哪一个就有*符[root@teach_linux2 tech_git]# git branch* master此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。如果我们要手动创建一个分支。执行 git branch (branchname) 即可。2.创建分支,也就表示该员工可以使用该分支,进行自己的独立空间的代码管理[root@teach_linux2 tech_git]# git branch wupeiqi[root@teach_linux2 tech_git]# git branch* master  wupeiqi现在我们可以看到,有了一个新分支 wupeiqi。接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。  3.此时切换分支,Git会还原工作区的内容,到创建分支时的状态[root@teach_linux2 tech_git]# git checkout wupeiqiSwitched to branch 'wupeiqi'[root@teach_linux2 tech_git]# git branch  master* wupeiqi4.git分支的管理实践4.1 先创建分支[root@teach_linux2 tech_git]# git branch wupeiqi4.2 切换到分支下[root@teach_linux2 tech_git]# git checkout wupeiqiSwitched to branch 'wupeiqi'4.3 在分支下创建文件,提交到暂存区,并且要进行版本提交,此时该文件,就提交到了该分支下的版本空间[root@teach_linux2 tech_git]# echo "我是吴佩琪" > wupeiqi.txt[root@teach_linux2 tech_git]# git add .[root@teach_linux2 tech_git]# git commit -m "我是吴佩琪分支下的第一次提交"[root@teach_linux2 tech_git]# lsgit.txt  heihei.txt  stash.git.txt  wupeiqi.txt[root@teach_linux2 tech_git]# git logcommit 255d6bd97da04331c6a31fb0556f3795a1367599Author: josen <791249887@qq.com>Date:   Thu May 6 20:09:59 2021 +0800    我是吴佩琪分支下的第一次提交commit 68643369bd5a8c15e8a7598a977906b10e27ff53Author: josen <791249887@qq.com>Date:   Thu May 6 17:31:45 2021 +0800    创建了stash.git.txt文件,并提交了commit e49cdbf782da5c5d77bba939464d6a0064b441abAuthor: josen <791249887@qq.com>Date:   Thu May 6 17:28:21 2021 +0800    第二次提交commit de1ec321d740d87c39327c91162737b6c0c5b7b6Author: josen <791249887@qq.com>Date:   Thu May 6 17:15:01 2021 +0800    首次提交版本4.4 此时再切换回master查看状态,发现刚才wupeiqi创建文件和提交记录都看不到了[root@teach_linux2 tech_git]# git checkout master Switched to branch 'master'[root@teach_linux2 tech_git]# lsgit.txt  heihei.txt  stash.git.txt[root@teach_linux2 tech_git]# git log commit 68643369bd5a8c15e8a7598a977906b10e27ff53Author: josen <791249887@qq.com>Date:   Thu May 6 17:31:45 2021 +0800    创建了stash.git.txt文件,并提交了commit e49cdbf782da5c5d77bba939464d6a0064b441abAuthor: josen <791249887@qq.com>Date:   Thu May 6 17:28:21 2021 +0800    第二次提交commit de1ec321d740d87c39327c91162737b6c0c5b7b6Author: josen <791249887@qq.com>Date:   Thu May 6 17:15:01 2021 +0800    首次提交版本5.此时你可以选择,删除这个分支的记录,也可以选择合并这个分支的提交记录,合并到master分支上5.1 删除该分支,该分支提交的版本信息也会随之删除[root@teach_linux2 tech_git]# git branch -D wupeiqi Deleted branch wupeiqi (was 255d6bd).[root@teach_linux2 tech_git]# git branch * master6.选择合并分支的情况如下6.1创建分支,且立即切换到该分支[root@teach_linux2 tech_git]# git checkout -b chaochaoSwitched to a new branch 'chaochao'[root@teach_linux2 tech_git]# git branch* chaochao  master6.2 chaochao分支下提交版本[root@teach_linux2 tech_git]# echo "git真是花样太多了,头好疼呀" > chaochao.txt[root@teach_linux2 tech_git]# git add .[root@teach_linux2 tech_git]# git commit -m "chaochao分支首次提交了代码"[chaochao fe8af4f] chaochao分支首次提交了代码 1 file changed, 1 insertion(+) create mode 100644 chaochao.txt[root@teach_linux2 tech_git]# git log commit fe8af4f9b453330852beb3e7f7d7dbc34b4542b4Author: josen <791249887@qq.com>Date:   Thu May 6 20:16:52 2021 +0800    chaochao分支首次提交了代码commit 68643369bd5a8c15e8a7598a977906b10e27ff53Author: josen <791249887@qq.com>Date:   Thu May 6 17:31:45 2021 +0800    创建了stash.git.txt文件,并提交了commit e49cdbf782da5c5d77bba939464d6a0064b441abAuthor: josen <791249887@qq.com>Date:   Thu May 6 17:28:21 2021 +0800    第二次提交commit de1ec321d740d87c39327c91162737b6c0c5b7b6Author: josen <791249887@qq.com>Date:   Thu May 6 17:15:01 2021 +0800    首次提交版本[root@teach_linux2 tech_git]# git checkout master Switched to branch 'master'[root@teach_linux2 tech_git]# lsgit.txt  heihei.txt  stash.git.txt7.合并chaochao分支表示技术老大,认可了分支所写的代码,允许合并到master主分支上,进行使用[root@teach_linux2 tech_git]# git merge chaochao Updating 6864336..fe8af4fFast-forward chaochao.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 chaochao.txt[root@teach_linux2 tech_git]# git status# On branch masternothing to commit, working directory clean[root@teach_linux2 tech_git]# lschaochao.txt  git.txt  heihei.txt  stash.git.txt[root@teach_linux2 tech_git]# git log --oneline fe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本[root@teach_linux2 tech_git]# git branch   chaochao* master8.当分支的提交被合并后,该分支就可以删除了,随时使用分支,随时创建即可[root@teach_linux2 tech_git]# git branch -d chaochao Deleted branch chaochao (was fe8af4f).

git合并分支冲突

合并不仅仅是简单的对文件添加、移除,git可以合并且修改。

我们准备数据

1.准备开始进行开发了,新建一个分支[root@teach_linux2 tech_git]# git checkout -b chaochaoSwitched to a new branch 'chaochao'[root@teach_linux2 tech_git]# vim cc.php<?phpecho "带你学习如何解决git分支合并冲突问题";?>[root@teach_linux2 tech_git]# cat cc.php <?phpecho "带你学习如何解决git分支合并冲突问题";?>2.在chaochao分支下,创建文件,且提交新的版本记录[root@teach_linux2 tech_git]# git add .[root@teach_linux2 tech_git]# git commit -m "chaochao branch add a new file cc.php"[chaochao 704e0b2] chaochao branch add a new file cc.php 1 file changed, 3 insertions(+) create mode 100644 cc.php[root@teach_linux2 tech_git]# git log --oneline 704e0b2 chaochao branch add a new file cc.phpfe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本 3.此时我们切换回master分支,cc.php文件应该是不存在的[root@teach_linux2 tech_git]# git checkout master Switched to branch 'master'[root@teach_linux2 tech_git]# lschaochao.txt  git.txt  heihei.txt  stash.git.txt4.我们在master分支下,也创建名为cc.php的文件,且写入内容[root@teach_linux2 tech_git]# git checkout master Switched to branch 'master'[root@teach_linux2 tech_git]# vim cc.php[root@teach_linux2 tech_git]# cat cc.php <?phpecho "我是master分支";?># 提交到本地仓库[root@teach_linux2 tech_git]# git add .[root@teach_linux2 tech_git]# git commit -m "master提交了cc.php"[master f7b27c1] master提交了cc.php 1 file changed, 3 insertions(+) create mode 100644 cc.php5.此时你会发现,chaoge.php文件在master分支和chaoge分支,都有自己的代码内容,是不是?[root@teach_linux2 tech_git]# git log --oneline f7b27c1 master提交了cc.phpfe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本[root@teach_linux2 tech_git]# git checkout chaochao Switched to branch 'chaochao'[root@teach_linux2 tech_git]# git log --oneline 704e0b2 chaochao branch add a new file cc.phpfe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本[root@teach_linux2 tech_git]# git checkout master Switched to branch 'master'5.1 如果此时你合并分支,会发现如下问题两分支都有cc.php文件,并且里面都有内容一合并导致了,同一行数据,如果不一样了,就会有冲突,到底以那个分支为准呢?[root@teach_linux2 tech_git]# git merge chaochao Auto-merging cc.phpCONFLICT (add/add): Merge conflict in cc.phpAutomatic merge failed; fix conflicts and then commit the result.发现了git给与的提示是,自动合并失败了,需要你自己手动解决冲突,然后提交结果[root@teach_linux2 tech_git]# git log --oneline f7b27c1 master提交了cc.phpfe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本6.查看文件内容,文件被git自动修改了第二行发生了文件内容冲突master主分支上内容是 echo "我是master分支"chaoge分支合并过来的内容是 echo "带你学习如何解决git分支合并冲突问题"此时根据你自己的需求,决定如何修改代码文件,再次提交即可[root@teach_linux2 tech_git]# cat cc.php <?php<<<<<<< HEADecho "我是master分支";=======echo "带你学习如何解决git分支合并冲突问题";>>>>>>> chaochao?>7.自己决定对代码修改# 手动修改代码为确定版本,比如两个代码我都要保留[root@teach_linux2 tech_git]# cat cc.php <?phpecho "我是master分支";echo "带你学习如何解决git分支合并冲突问题";?>[root@teach_linux2 tech_git]# git status # On branch master# You have unmerged paths.#   (fix conflicts and run "git commit")## Unmerged paths:#   (use "git add <file>..." to mark resolution)##	both added:         cc.php#no changes added to commit (use "git add" and/or "git commit -a")[root@teach_linux2 tech_git]# git add .[root@teach_linux2 tech_git]# git commit -m "master人为合并了cc.php的内容"[master f21d45d] master人为合并了cc.php的内容[root@teach_linux2 tech_git]# git log --oneline f21d45d master人为合并了cc.php的内容f7b27c1 master提交了cc.php704e0b2 chaochao branch add a new file cc.phpfe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本现在我们就解决了合并中的冲突,然后提交了结果

Git标签

git标签有什么用

Git仓库内的数据发生变化时,我们经常会打上一个类似于软件版本的标签tag,这样通过标签就可以把版本库中的某个版本给记录下来,便于以后我们可以将特定的数据取出来。

标签就是版本库的一个快照。

为啥用git标签

git不是已经有commit了吗,可以附加提交信息,为什么还要tag呢?

开发小王:请吧上周一发布的版本打包发布,commit_id是3f6cccf0708525b58fe191c80325b73a54adee99

运维小于:你这什么乱七八糟的数字,,,太难找了,请你换个方法

开发小王换了个方式:请吧上周一发布的版本打包,版本号是v1.2,按照tag v1.2查找commit 记录就行了!

所以tag就是一个容易记住的名字,和某个commit记录绑定在一起。

tag可以是字符,也可以是数字。

git标签使用

对当前提交的代码创建标签,-a标签名称,-m标签描述。

1.# 对当前最新的commit记录进行标签[root@teach_linux2 tech_git]# git tag -a "v1.0" -m "开 发完毕cc.php版本"2.# 直接输入,则查看当前标签[root@teach_linux2 tech_git]# git tag v1.03.# 通过git log查看tag# --graph:显示ASCII图形表示的分支合并历史# —pretty=:使用其他格式显示历史提交信息# -abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符 # --decorate 显示包含标签的记录[root@teach_linux2 tech_git]# git log --oneline --decoratef21d45d (HEAD, tag: v1.0, master) master人为合并了cc.phf7b27c1 master提交了cc.php704e0b2 (chaochao) chaochao branch add a new file cc.phfe8af4f chaochao分支首次提交了代码6864336 创建了stash.git.txt文件,并提交了e49cdbf 第二次提交de1ec32 首次提交版本4.# 指定commitID创建标签,选中commit id 前7位就够了[root@teach_linux2 tech_git]# git tag -a v0.9 fe8af4f -m "这是aace的tag"5.# 查看标签列表[root@teach_linux2 tech_git]# git tag v0.9v1.06.# 查看标签里有什么git show[root@teach_linux2 tech_git]# git show v1.0tag v1.0Tagger: josen <791249887@qq.com>Date:   Thu May 6 21:52:47 2021 +0800开发完毕cc.php版本commit f21d45debbb5b49ec451a972a89716ad409f389bMerge: f7b27c1 704e0b2Author: josen <791249887@qq.com>Date:   Thu May 6 21:35:50 2021 +0800    master人为合并了cc.php的内容diff --cc cc.phpindex abcc354,a0437da..0b133ce--- a/cc.php+++ b/cc.php@@@ -1,3 -1,3 +1,4 @@@  <?php +echo "我是master分支";+ echo "带你学习如何解决git分支合并冲突问题";  ?>7.删除tag[root@teach_linux2 tech_git]# git tag -d v0.9 Deleted tag 'v0.9' (was 7410ad0)[root@teach_linux2 tech_git]# git tag v1.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值