Git分支与Git标签详解

news2024/12/23 13:27:36

目录

前言

一、Git分支(Branch)

1.分支的概念

2.分支的常用操作

3.Git 分支管理

二、Git标签(Tag)

1.标签的概念

2.标签的类型

3.标签的常用操作

4.Git标签管理


前言

        在软件开发过程中,版本管理是非常重要的一环。Git作为目前最流行的分布式版本控制系统之一,提供了丰富的功能来支持项目的版本管理。其中,分支(Branch)和标签(Tag)是Git中常用的两个概念,它们对于组织和管理代码的不同版本起着至关重要的作用。本篇博客将深入探讨Git分支和Git标签的概念、用法和最佳实践。

一、Git分支(Branch)

1.分支的概念

在Git中,分支是指指向提交对象(commit)的可变指针。它可以让开发者在不影响主线代码的情况下,独立地进行新功能的开发、问题的修复等工作。每个分支都包含着项目文件的一个完整副本,这意味着开发者可以在不同的分支上同时进行不同的工作,而不会相互影响。

2.分支的常用操作

  • 创建分支:git branch <branch_name>
  • 切换分支:git checkout <branch_name> 或 git switch <branch_name>
  • 合并分支:git merge <branch_name>
  • 删除分支:git branch -d <branch_name>

3.Git 分支管理

列出分支

列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支。

$ git branch
* master

此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。

当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。

创建并切换分支:你可以创建一个新的分支,这个分支是从当前工作目录的状态创建的,包含了当前工作目录中的所有文件和文件夹。 

如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

$ git branch testing
$ git branch
* master
  testing

现在我们可以看到,有了一个新分支 testing

当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。

接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。

$ ls
README
$ echo 'ctb.com' > test.txt
$ git add .
$ git commit -m 'add test.txt'
[master 3e92c19] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ ls
README        test.txt
$ git checkout testing
Switched to branch 'testing'
$ ls
README

当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们又重新出现了。

$ git checkout master
Switched to branch 'master'
$ ls
README        test.txt

我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

$ git checkout -b newtest
Switched to a new branch 'newtest'
$ git rm test.txt 
rm 'test.txt'
$ ls
README
$ touch ctb.java
$ git add .
$ git commit -am 'removed test.txt、add ctb.java'
[newtest c1501a2] removed test.txt、add ctb.java
 2 files changed, 1 deletion(-)
 create mode 100644 ctb.java
 delete mode 100644 test.txt
$ ls
README        ctb.java
$ git checkout master
Switched to branch 'master'
$ ls
README        test.txt

如你所见,我们创建了一个分支,在该分支上移除了一些文件 test.txt,并添加了 ctb.java 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 ctb.java不存在主分支中。

使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。

删除分支

删除分支命令:

git branch -d (branchname)

例如我们要删除 testing 分支:

$ git branch
* master
  testing
$ git branch -d testing
Deleted branch testing (was 85fc7e7).
$ git branch
* master

分支合并

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:

git merge
$ git branch
* master
  newtest
$ ls
README        test.txt
$ git merge newtest
Updating 3e92c19..c1501a2
Fast-forward
 ctb.java | 0
 test.txt   | 1 -
 2 files changed, 1 deletion(-)
 create mode 100644 ctb.java
 delete mode 100644 test.txt
$ ls
README        ctb.java

以上实例中我们将 newtest 分支合并到主分支去,test.txt 文件被删除。

合并完后就可以删除分支:

$ git branch -d newtest
Deleted branch newtest (was c1501a2).

删除后, 就只剩下 master 分支了:

$ git branch
* master

合并冲突

合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。

$ git branch
* master
$ cat ctb.java

首先,我们创建一个叫做 change_site 的分支,切换过去,我们将 ctb.java 内容改为:

pubic class ctb(){
}

创建 change_site 分支:

$ git checkout -b change_site
Switched to a new branch 'change_site'
$ vim ctb.java
$ head -3 ctb.java
pubic class ctb(){
}
$ git commit -am 'changed the ctb.java'
[change_site 7774248] changed the ctb.java
 1 file changed, 3 insertions(+)

将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的(空文件,没有代码),我们再次修改 ctb.java文件。

$ git checkout master
Switched to branch 'master'
$ cat ctb.java
$ vim ctb.java    # 修改内容如下
$ cat ctb.java
<?php
echo 1;
?>
$ git diff
diff --git a/ctb.java b/ctb.java
index e69de29..ac60739 100644
--- a/ctb.java
+++ b/ctb.java
@@ -0,0 +1,3 @@
+<?php
+echo 1;
+?>
$ git commit -am '修改代码'
[master c68142b] 修改代码
 1 file changed, 3 insertions(+)

现在这些改变已经记录到我的 "master" 分支了。接下来我们将 "change_site" 分支合并过来。

$ git merge change_site
Auto-merging ctb.java
CONFLICT (content): Merge conflict in ctb.java
Automatic merge failed; fix conflicts and then commit the result.

$ cat ctb.java     # 打开文件,看到冲突内容
<?php
<<<<<<< HEAD
echo 1;
=======
echo 'ctb';
>>>>>>> change_site
?>

我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。

$ vim ctb.java
$ cat ctb.java
<?php
echo 1;
echo 'ctb';
?>
$ git diff
diff --cc ctb.java
index ac60739,b63d7d7..0000000
--- a/ctb.java
+++ b/ctb.java
@@@ -1,3 -1,3 +1,4 @@@
  <?php
 +echo 1;
+ echo 'ctb';
  ?>

在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决

$ git status -s
UU ctb.java
$ git add ctb.java
$ git status -s
M  ctb.java
$ git commit
[master 88afe0e] Merge branch 'change_site'

现在我们成功解决了合并中的冲突,并提交了结果。

二、Git标签(Tag)

1.标签的概念

在Git中,标签是一个指向特定提交对象的指针,通常用于标识版本发布、里程碑等重要事件。标签可以帮助开发者和用户快速定位和回溯不同的版本,也可以作为项目中重要版本的标记。

2.标签的类型

  • 轻量标签(Lightweight tag):只是简单地指向某个提交对象,类似于分支,不具备其他元数据。
  • 注解标签(Annotated tag):除了指向某个提交对象外,还包含标签的创建者、创建日期、注释等信息。

3.标签的常用操作

  • 创建轻量标签:git tag <tag_name>
  • 创建注解标签:git tag -a <tag_name> -m "tag message"
  • 查看标签列表:git tag
  • 删除标签:git tag -d <tag_name>

4.Git标签管理

Git 使用的标签有两种类型:轻量级的(lightweight)含附注的(annotated)

轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。

而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。

一般我们都建议使用含附注型的标签,以便保留相关信息;

当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

创建标签

[root@Git git]# git tag v1.0

查看已有标签

[root@Git git]# git tag
v1.0
[root@Git git]# git tag v1.1
[root@Git git]# git tag
v1.0
v1.1

删除标签

[root@Git git]# git tag -d v1.1
Deleted tag ‘v1.1’ (was 91388f0)
[root@Git git]# git tag
v1.0

查看此版本所修改的内容

[root@Git git]# git show v1.0
commit 91388f0883903ac9014e006611944f6688170ef4
Author: "syaving" <"819044347@qq.com">
Date: Fri Dec 16 02:32:05 2016 +0800
commit dir
diff –git a/readme b/readme
index 7a3d711..bfecb47 100644
— a/readme
+++ b/readme
@@ -1,2 +1,3 @@
text
hello git
+use commit
[root@Git git]# git log –oneline
91388f0 commit dir
e435fe8 add readme
2525062 add readme

推送标签到远程仓库:

使用以上命令将本地的标签推送到名为 origin 的远程仓库。

  • 单个标签推送:git push origin <tag_name>
  • 所有标签推送:git push origin --tags

拉取远程仓库的标签:

  • 拉取所有标签:git fetch origin <tag_name>
  • git pull origin <tag_name>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1202206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11『基础新特性』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1.C11 简介1.1.起源1.2.主要更新 2.列表初始化2.1.对于内置类型2.2.对于自定义…

频域分析实践介绍

频域分析实践介绍 此示例说明如何执行和解释基本频域信号分析。该示例讨论使用信号的频域表示相对于时域表示的优势&#xff0c;并使用仿真数据和真实数据说明基本概念。该示例回答一些基本问题&#xff0c;例如&#xff1a;FFT 的幅值和相位的含义是什么&#xff1f;我的信号是…

实战 | 基于卷积神经网络的蘑菇识别微信小程序

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.11.13 Last edited: 2023.11.13 导读&#xff1a;其实没啥难的&#xff0c;主要是随手搞了就发出来把&#xff0c;太久没有水过帖子了&…

学生五科成绩统计

随机生成10名学生姓名(包括自己)和五科成绩&#xff0c;将数据存入*.csv&#xff0c;读取保存的*.csv文本数据计算每个学生总分和平均分&#xff0c;并存入*.csv文本&#xff1b;打印总分排名前三学生信息&#xff1b;查找10学生各科最高最低分、中位分、平均分。 (笔记模板由p…

2023CCPC深圳流水账

在高铁上无聊&#xff0c;写一个这三天的小总结吧 不知道该写点啥&#xff0c;就想到什么写什么了 铁了&#xff0c;也在意料之中&#xff0c;概率期望和字符串一直是弱点&#xff0c;考前也在赌不会考这两个结果两个都考了&#xff0c;赫赫&#xff0c;看来在杭州站之前得好…

无代码业务自动化工具Activepieces

什么是 Activepieces &#xff1f; Activepieces 是一款工作流程自动化软件&#xff0c;可以帮助您自动化所有重要流程&#xff0c;例如市场、销售、营销等。您可以集成其他有用的应用程序并更有效地管理您的业务。无需编码&#xff0c;是 Zapier 的绝佳替代品。 Activepieces …

深耕智慧物流夯实竞争优势,极智嘉(Geek+)斩获多项大奖

全球仓储机器人引领者极智嘉(Geek)&#xff0c;一直以来致力于为仓储与制造场景提供高效柔性的智能物流解决方案&#xff0c;强劲的发展实力备受认可。而近段时间&#xff0c;极智嘉更是频频传来好消息&#xff0c;不仅斩获了英国机器人与自动化仓储创新大奖&#xff0c;获评胡…

什么是Vue.js的计算属性(computed properties)?与方法(methods)有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Python高级语法---Python内存管理机制

文章目录 1. 内存管理基础引用计数2. 垃圾回收机制垃圾回收3. 使用weakref处理循环引用weakref模块总结Python是一种高级编程语言,其内存管理机制高效且用户友好。这篇文章将详细介绍Python的内存管理基础、垃圾回收机制,以及如何使用weakref模块处理循环引用。我们将通过简单…

基于C#开发的任天堂 Switch 开源模拟器

今天给大家推荐一款基于C#开发的任天堂 Switch 开源模拟器&#xff0c;可方便开发人员来测试游戏&#xff0c;也用于娱乐。 01 项目简介 Ryujinx 是一个开源的任天堂 Switch 模拟器&#xff0c;可以在 PC 上模拟运行 Switch 游戏。采用C#开发&#xff0c;基于 .NET Core技术框…

优思学院|如何利用六西格玛提升自己的大格局?

首先&#xff0c;我想说大格局并不仅仅是一个概念&#xff0c;更是一种生活态度。拥有大格局的人通常能够超越日常琐事&#xff0c;将目光投向更广阔的未来。他们不会被小事困扰&#xff0c;而是将注意力集中在更大的目标和使命上。拥有大格局的人常常具备卓越的领导力和判断力…

力扣双周赛 -- 117(容斥原理专场)

class Solution { public:long long c2(long long n){return n > 1? n * (n - 1) / 2 : 0;}long long distributeCandies(int n, int limit) {return c2(n 2) - 3 * c2(n - limit 1) 3 * c2(n - 2 * limit) - c2(n - 3 * limit - 1);} };

java DataSize存储容量单位规范化设置

之前的文章 java Duration格式规范化 自定义时间单位类型我们讲述了 Duration 这种jdk单位规范 其实我们还有一个单位 DataSize 我们这里属性类中 加入这个 DataSize的一个属性 然后设置他的 get set函数 然后 toString中加上他的输出 方便我们去看 这个类型是用来设置存储容…

Mistral 7B 比Llama 2更好的开源大模型 (一)

Mistral 7B 简介 Mistral 7B Mistral 7B 是一个 7.3B 参数模型: 在所有基准测试中优于 Llama 2 13B在许多基准测试中优于 Llama 1 34B接近 CodeLlama 7B 的代码性能,同时保持擅长英语任务使用分组查询注意力 (GQA) 加快推理速度使用滑动窗口注意力 (SWA) 以更低的成本处…

创意卡片制作

效果展示 CSS 知识点 box-shadow 属性灵活运用background 属性的 linear-gradient 值灵活运用 页面整体结构 <div class"container"><div class"card"><div class"icon"><ion-icon name"rocket-outline">&…

BAT 批处理指令总结

目录 一. 前言 二. 常用指令 2.1. HELP 2.2. REM 和 :: 2.3. ECHO 和 @ 2.4. PAUSE 2.5. ERRORLEVEL 2.6. TITLE 2.7. COLOR 2.8. GOTO 和 : 2.9. FIND 2.10. START 2.11. ASSOC 和 FTYPE 2.12. PUSHD 和 POPD 2.13. CALL 2.14. SHIFT 2.15. IF 2.15.1. IF […

第二篇:cocos-shader 入门三

YAML yaml语言主要用于声明整个着色器程序的流程。包含了顶点着色器程序的名字、片元着色器程序的名字、渲染技术&#xff08;混合、深度测试、模板测试等&#xff09;、Uniform 变量等。 uniform 变量 #include <cc-local> #include <cc-global> #include<…

微服务 Spring Cloud 6,用了这么多年Docker容器,殊不知你还有这么多弯弯绕

目录 一、神之容器 Docker二、Docker架构图1、Docker Client 客户端2、Docker Daemon 守护进程3、镜像&#xff08;Image&#xff09;4、Docker Driver 驱动模块5、Docker Graph内部数据库6、Docker Libcontainer函数库7、Docker Container 容器实例 三、Docker安装1、卸载Dock…

前端基础------margin上下传递

1&#xff0c;出现的原因及解决方法 ◼ margin-top传递 如果块级元素的顶部线和块级父元素的顶部线重叠&#xff0c;那么这个块级元素的margin-top值会传递给父元素 ◼ margin-bottom传递 如果块级元素的底部线和块级父元素的底部线重叠&#xff0c;并且父元素的高度是…

计算机毕设 推荐系统设计与实现 协同过滤推荐算法

文章目录 0 前言简介常见推荐算法协同过滤分解矩阵聚类深度学习 协同过滤原理系统设计示例代码(py) 系统展示系统界面推荐效果 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕…