git 版本控制与合并

 一   git概述:


- Git是一种分布式版本控制系统,用于跟踪和管理软件开发项目中的代码变更。
- 它允许多人协同工作,记录代码历史变更,并轻松管理多个项目版本。

**Git的主要特点**包括:

1. **分布式系统**:每个开发者都拥有完整的存储库副本,可以在本地进行提交、分支和合并操作,而无需依赖中央服务器。这使得团队成员可以离线工作,减少了网络依赖性,并提高了效率和灵活性。

2. **快速和高效**:Git以本地操作为主,因此执行速度非常快,即使在大规模项目上也能保持高效。

3. **强大的分支和合并**:Git的分支功能非常强大,允许开发者轻松创建、合并和切换分支,便于并行开发和测试新功能。

4. **数据完整性**:Git中的数据以不可更改的哈希值保存,确保每个版本都能完整地被追踪和验证。

5. **灵活的工作流程**:Git支持多种工作流程,可以适应不同团队和项目的需求。

6. **大型项目支持**:Git在处理大规模项目时表现出色,能够高效地管理海量代码。

 二 . Git安装,配置,初始化:

1. **Git安装**:
   - 在Windows上:下载适用于Windows的Git安装程序并运行安装向导。您可以从Git官方网站(https://git-scm.com/downloads)获取安装程序。
   - 在macOS上:如果您使用Homebrew,可以在终端中运行`brew install git`来安装Git。否则,您可以从Git官方网站下载macOS的安装程序并进行安装。
   - 在Linux上:使用系统包管理器来安装Git。例如,在Ubuntu上,可以运行`sudo apt-get install git`。

2. **Git配置**:
   - 配置用户名:在安装Git后,首先设置全局的用户名和电子邮件地址。这将用于标识您的提交记录。在终端中运行以下命令:
     ```
     git config --global user.name "Your Name"  (这里账号邮箱不用填写真实的) 
     git config --global user.email "your.email@example.com"  
     ```
   - 您还可以配置其他的Git选项,例如文本编辑器等。

3. **Git初始化**:
   - 在本地项目目录中,使用 `git init` 命令将该目录初始化为Git仓库。这将创建一个.git文件夹,用于存储Git的配置和版本历史信息。
   - 在终端中进入项目目录,运行:
     ```
     cd /path/to/your/project
     git init
     ```

三 . Git文件状态和提交版本:
 

在Git中,文件有三种主要状态,用于跟踪文件在版本控制中的变化情况。这三种文件状态是:

流程: 

新建到仓库的所有文件  未跟踪状态      
git add  变为暂存状态 git commit 提交后 形成新版本 文件变为未修改状态   在未修改状态可以通过 git rm 变为未跟踪状态  对未修改文件进行修改就变成已修改状态   对已修改文件使用git add 变暂

1. **未跟踪(Untracked)**:
   - 当您在Git仓库中新建一个文件或添加一个未被Git管理的文件时,该文件处于未跟踪状态。
   - 未跟踪的文件不在Git的版本管理之下,Git不会追踪其变化或将其包含在提交中。

2. **已修改(Modified)**:
   - 如果在上一次提交之后,对已经被Git管理的文件进行了修改,这些文件就处于已修改状态。
   - Git通过比较文件的当前状态和最后一次提交时的状态来确定文件是否处于已修改状态。

3. **已暂存(Staged)**:
   - 当您对已修改的文件使用 `git add` 命令后,文件会进入已暂存状态。
   - 已暂存的文件表示它们的最新修改已经被放入暂存区(Staging Area),准备提交成为新的版本。

下面是一些常见的文件状态示例及其对应的含义:

- `Untracked`:新建的文件或还未添加到Git仓库中的文件。
- `Modified`:已被Git管理的文件,在上一次提交之后被修改过,但尚未添加到暂存区。
- `Staged`:已被Git管理的文件,在上一次提交之后被修改过,并已添加到暂存区,准备提交成为新的版本。
- `Unmodified`:已被Git管理的文件,在上一次提交之后未发生过修改,处于稳定状态。

四. Git远程仓库:

Git远程仓库是一个位于网络上的代码仓库,用于存储代码和版本历史。使用远程仓库,团队成员可以在不同地点协同开发,并方便地分享代码。在Git中,可以将远程仓库添加为项目的一个远程链接,并与之交互。

1. **克隆远程仓库:** 使用 `git clone` 命令可以将远程仓库完整地复制到本地,创建一个本地副本。克隆后,您将拥有远程仓库的所有历史和分支。

   ```
   git clone <remote_repository_url>
   ```

2. **添加远程仓库:** 使用 `git remote add` 命令将远程仓库添加到本地仓库的远程仓库列表中。通常,远程仓库会被命名为 "origin"。

   ```
   git remote add origin <remote_repository_url>
   ```

3. **推送到远程仓库:** 使用 `git push` 命令将本地的提交推送到远程仓库。推送时,您需要指定要推送的分支。

   ```
   git push <remote_name> <branch_name>
   ```

4. **拉取远程仓库:** 使用 `git pull` 命令可以从远程仓库拉取最新的代码和提交,将本地代码与远程仓库同步。

   ```
   git pull <remote_name> <branch_name>
   ```

5. **查看远程仓库:** 使用 `git remote` 命令可以查看当前已添加的远程仓库列表。

   ```
   git remote -v
   ```

6. **删除远程仓库:** 使用 `git remote remove` 命令可以删除不再需要的远程仓库。

   ```
   git remote remove <remote_name>
   ```

 五 . Git分支:

它允许团队成员在不同的分支上独立开发不同的功能,然后将这些功能集成到主线代码中。使用分支可以避免直接在主线代码上进行修改,保持主线代码的稳定性,并提高开发效率。


- 创建分支:使用 `git branch` 创建新的分支。
- 切换分支:使用 `git checkout` 或 `git switch` 切换到其他分支。
- 分支合并:使用 `git merge` 将分支合并到主分支

六.  Git推送,拉取,跟踪远程分支:

在Git中,推送(Push)、拉取(Pull)和跟踪(Track)远程分支是与远程仓库交互的常见操作。这些操作允许您在本地仓库和远程仓库之间同步代码,以便与其他团队成员共享和合作开发。

1. **推送远程分支:**
   - 使用 `git push` 命令将本地分支的提交推送到远程仓库中。如果远程分支不存在,将会创建一个同名的远程分支。

   ```
   git push <remote_name> <local_branch_name>
   ```

   例如,要将本地的主分支(master)推送到远程仓库的主分支,可以执行:

   ```
   git push origin master
   ```

2. **拉取远程分支:**
   - 使用 `git pull` 命令从远程仓库拉取最新的代码和提交,将本地分支与远程分支合并。

   ```
   git pull <remote_name> <remote_branch_name>
   ```

   例如,要从远程仓库的主分支(master)拉取最新代码并合并到本地的主分支,可以执行:

   ```
   git pull origin master
   ```

3. **跟踪远程分支:**
   - 使用 `git checkout -b` 命令可以在本地创建并切换到一个新的分支,并与指定的远程分支建立跟踪关系。

   ```
   git checkout -b <local_branch_name> <remote_name>/<remote_branch_name>
   ```

   例如,要创建一个新分支并跟踪远程的开发分支(dev),可以执行:

   ```
   git checkout -b feature dev
   ```

跟踪远程分支的好处是,当您使用 `git pull` 命令时,Git会自动将远程分支的代码更新到您所跟踪的本地分支上。这样,您就可以轻松地与团队成员共享代码和提交,并保持与远程仓库同步。在多人协作的开发环境中,推送、拉取和跟踪远程分支是非常常见的操作。

 七 . Git存储功能:
 

在Git中,`git stash` 是一个有用的命令,用于将当前工作目录中的未提交的修改暂时保存起来,以便可以切换到其他分支或处理其他任务。`git stash` 可以将您的工作目录恢复到上一次提交后的状态,同时保留未提交的修改。

使用 `git stash` 的基本用法如下:

1. **保存工作目录的修改:** 在进行一些修改但不想提交它们的情况下,使用 `git stash` 命令将修改暂存。

   ```
   git stash
   ```

   这将暂存当前工作目录中的所有未提交的修改。

2. **查看保存的存储列表:** 使用 `git stash list` 命令可以查看当前存储的列表,显示所有已保存的存储。

   ```
   git stash list
   ```

3. **应用存储的修改:** 使用 `git stash apply` 命令可以将最新的存储恢复到当前工作目录中。

   ```
   git stash apply
   ```

   如果有多个存储,您可以使用 `git stash apply stash@{n}` 来应用指定的存储。

4. **删除存储:** 使用 `git stash drop` 命令可以删除最新的存储。

   ```
   git stash drop
   ```

   如果要删除指定的存储,可以使用 `git stash drop stash@{n}`。

5. **应用并删除存储:** 使用 `git stash pop` 命令可以恢复并删除最新的存储。

   ```
   git stash pop
   ```

   如果要恢复并删除指定的存储,可以使用 `git stash pop stash@{n}`。

使用 `git stash` 命令非常方便,特别是在您需要切换到其他分支或处理其他任务时,但又不想提交当前的修改。它允许您暂时保存您的工作进度,并在需要时轻松恢复。请注意,`git stash` 仅保存已跟踪的文件,对于新建的、未跟踪的文件和空的目录不会保存。

八   Git重置和变基:


- 重置:

在Git中,重置(Reset)是一种用于更改当前分支的指针位置和文件状态的操作。它允许您回退到不同的提交状态或撤销已提交的修改。Git提供了三种重置模式:软重置(Soft Reset)、混合重置(Mixed Reset)和硬重置(Hard Reset)。每种模式对分支指针和工作目录的影响略有不同。

1. **软重置(Soft Reset):**
   软重置保留当前的修改,并将分支指针移动到指定的提交位置。这意味着Git将当前分支指向新的提交,但不会撤销工作目录或暂存区的内容。软重置通常用于撤销一次提交,并将提交的修改重新提交。

   ```
   git reset --soft <commit_hash>
   ```

2. **混合重置(Mixed Reset):**
   混合重置是重置的默认模式。它不仅移动分支指针,还会取消暂存区的内容。这意味着Git将当前分支指向新的提交,并且取消暂存区的所有内容,但工作目录的修改仍然保留。混合重置通常用于撤销一次提交并取消暂存区的文件。

   ```
   git reset --mixed <commit_hash>
   ```

3. **硬重置(Hard Reset):**
   硬重置是最强制性的重置模式。它不仅移动分支指针,还会彻底删除工作目录和暂存区的内容,将它们恢复到指定的提交状态。这意味着Git将当前分支指向新的提交,并且会永久删除所有未提交的修改。慎用硬重置,因为它可能导致数据丢失。

   ```
   git reset --hard <commit_hash>
   ```

请谨慎使用重置操作,特别是在已经推送到远程仓库的分支上。如果您不确定重置的影响,请确保在使用重置之前备份您的工作目录或创建一个新的分支来尝试。重置是一种强制性的历史修改操作,应谨慎使用。


- 变基:

在Git中,变基(Rebase)是一种用于修改提交历史的操作,它允许您将一个分支的修改应用到另一个分支上,从而使项目的提交历史更加整洁和线性。变基通过将一个分支上的提交依次应用到另一个分支的末尾,从而创建一个新的提交历史。

使用变基可以避免分支合并产生的冗余提交,使项目的提交历史更易于理解和维护。然而,变基也需要谨慎使用,特别是在与他人协作的情况下,因为它会修改提交的SHA哈希值,可能会引起冲突或不良影响。

下面是一些关于如何使用Git变基的基本步骤:

1. **切换到目标分支:** 首先,切换到您要将修改应用到的目标分支。

   ```
   git checkout <target_branch>
   ```

2. **执行变基操作:** 使用 `git rebase` 命令来执行变基操作,将源分支的修改应用到目标分支上。

   ```
   git rebase <source_branch>
   ```

   例如,要将`feature`分支的修改变基到`master`分支上,可以执行:

   ```
   git checkout master
   git rebase feature
   ```

3. **解决冲突(如果有):** 在变基过程中,如果源分支的提交与目标分支的提交产生冲突,Git会提示您解决这些冲突。您需要手动解决冲突,然后使用 `git add` 将解决后的文件标记为已解决。

4. **继续变基:** 在解决冲突后,使用 `git rebase --continue` 继续变基操作。

5. **完成变基:** 当所有的冲突都解决并且变基操作完成后,您可以使用 `git rebase --skip` 或 `git rebase --abort` 来继续或中止变基。

总之,变基是一种强大的工具,可以帮助您保持项目的提交历史整洁和易于理解。然而,在使用变基时,请务必小心处理,尤其是在共享分支上,以免影响他人的工作。如果不确定如何使用变基,建议先在自己的分支上进行尝试。

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

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

相关文章

小研究 - MySQL 分区分表的设计及实(一)

随着信息技术的快速发展&#xff0c;数据量越来越大&#xff0c;海量的表查询操作需要消耗大量的时间&#xff0c;成为影响数据库访问性能提高的主要因素。为了提升数据库操作的查询效率和用户体验&#xff0c;在关系型数据库管理系统(MySQL)中通过 range 分区和 Merge 存储&am…

c++:day4

1.思维导图 2.shell函数获取uid和gid&#xff0c;并用变量接 #!/bin/bashfunction fun() {read -p "输入用户名" necho uid:id -u $necho gid:id -g $n } afun echo $a3.冒泡、选择和快排代码整理 /**************************************************************…

嵌入式一开始该怎么学?学习单片机

学习单片机&#xff1a; 模电数电肯定必须的&#xff0c;玩单片机大概率这两门课都学过&#xff0c;学过微机原理更好。 直接看野火的文档&#xff0c;芯片手册&#xff0c;外设手册。 学单片机不要纠结于某个型号&#xff0c;我认为stm32就OK&#xff0c;主要是原理和感觉。…

窥探系列之Mybatis-plus XML分页查询

mybatisPlus分页查询原理 searchCount字段控制是否查询总记录数 com.baomidou.mybatisplus.plugins.PaginationInterceptor 该插件拦截sql&#xff0c;如果searchCounttrue&#xff0c;则使用sql解析包jsqlparser根据原sql生成count语句&#xff0c;另外关键

分布式应用:Zookeeper 集群与kafka 集群部署

目录 一、理论 1.Zookeeper 2.部署 Zookeeper 集群 3.消息队列 4.Kafka 5.部署 kafka 集群 6.FilebeatKafkaELK 二、实验 1.Zookeeper 集群部署 2.kafka集群部署 3.FilebeatKafkaELK 三、问题 1.解压文件异常 2.kafka集群建立失败 3.启动 filebeat报错 4.VIM报错…

服务器数据恢复-raid5同步过程中又有一块磁盘报警的数据恢复案例

服务器数据恢复环境&#xff1a; 某研究院一台DELL存储&#xff0c;15块硬盘搭建的一组RAID5磁盘阵列。 该RAID5阵列只有一个卷组&#xff0c;该卷组占用了阵列的全部空间&#xff1b;该卷组只有一个起始位置为0扇区的XFS裸分区。 服务器故障&初检&分析&#xff1a; 该…

Android前沿技术?Jetpack如何?

Jetpack Compose是Android开发领域的一项前沿技术&#xff0c;它提供了一种全新的方式来构建用户界面。近年来&#xff0c;Jetpack Compose在各大招聘等网站上的招聘岗位逐渐增多&#xff0c;薪资待遇也相应提高。本文将从招聘岗位的薪资与技术要求入手&#xff0c;分析Jetpack…

多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法

一、&#x1f49b; Java的Thread类表示线程 1.创建类&#xff0c;继承Thread重写run方法 2.创建类&#xff0c;实现Runnable重写run方法 3.可以继承Thread重写run基于匿名内部类 4.实现Runnable重写run基于匿名内部类 5.lamdba表达式表示run方法的内容&#xff08;推荐&#x…

16-3_Qt 5.9 C++开发指南_使用QStyle 设置界面外观_实现不同系统下的界面效果的匹配

文章目录 1. QStyle的作用&#xff08;实现不同系统下的界面效果的匹配&#xff09;2. Qt内置样式的使用3. 源码3.1 可视化UI设计3.2 mainwindow.cpp 1. QStyle的作用&#xff08;实现不同系统下的界面效果的匹配&#xff09; Qt 是一个跨平台的类库&#xff0c;相同的界面组件…

算法与数据结构-跳表

文章目录 什么是跳表跳表的时间复杂度跳表的空间复杂度如何高效的插入和删除跳表索引动态更新代码示例 什么是跳表 对于一个单链表来讲&#xff0c;即便链表中存储的数据是有序的&#xff0c;如果我们要想在其中查找某个数据&#xff0c;也只能从头到尾遍历链表。这样查找效率…

虚继承中对象占用的内存空间

1、虚继承中对象占用的内存空间1 #include <iostream> using namespace std;class AA {void show() {}int max(int a, int b) { return a > b ? a : b; } }; //函数并不占用内存空间class A {}; //占位符class B {int c; }; //含有一个int型数据成员class C :vi…

1. 软件生命周期C/S、B/S 架构

目录 1. 软件生命周期 2. 面向对象 2.1 面向对象分析 2.2 面向对象设计 2.3 面向对象编程 3. C/S、B/S 架构 3.1 CS 架构 3.2 BS 架构 1. 软件生命周期 软件生命周期中划分为可行性研究、需求分析、概要设计、详细设计、实现、组装(集成)测试、 确认测试、使用、维护…

LiveGBS流媒体平台GB/T28181常见问题-无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

LiveGBS无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.…

【C++从0到王者】第十七站:手把手教你写一个stack和queue及deque的底层原理

文章目录 一、stack1.利用适配器2.栈的实现 二、queue三、deque1.deque介绍2.deque的接口3.deque的基本使用4.deque的效率5.deque的原理 一、stack 1.利用适配器 我们不可能写了一份数组栈以后&#xff0c;还要在手写一个链式栈&#xff0c;这样显得太冗余了。于是我们可以利…

Redis未授权访问漏洞

Redis未授权访问漏洞 一、未授权访问漏洞概述、二、Redis未授权访问特征三、Redis常用命令四、Redis历史漏洞4.1、Redis未授权访问4.2、Redis主从复制RCE 五、Reids未授权访问利用5.1、写webshell5.2、写定时任务反弹shell 一、未授权访问漏洞概述、 未授权访问漏洞可以理解为需…

【C++】Lambda表达式的使用

学习目标&#xff1a; 例如&#xff1a; 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 学习内容&#xff1a; Lambda表达式的语法 文章目录 学习目标&#xff1a;学习内容&#xff1a;Lambda表达式排序案例Lambda表达式语法捕捉列表Lambda表达式模拟…

Javascript 数据结构[入门]

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

3年经验,面试测试岗只会功能测试开口要求18K,令我陷入沉思。

由于朋友临时有事&#xff0c; 所以今天我代替朋友进行一次面试&#xff0c;公司需要招聘一位自动化测试工程师&#xff0c;我以很认真负责的态度完成这个过程&#xff0c; 大概近30分钟。 主要是技术面试&#xff0c; 在近30分钟内&#xff0c; 我与被面试者是以交流学习的方式…

java linq多字段排序时间比较

public static void main(String[] args) {//100万条数据List<CrmInvestSaleUserCount> waitAssignUserList new ArrayList<>();for (int i 0; i < 1000000; i) {waitAssignUserList.add(new CrmInvestSaleUserCount().setSales_username("test" i…

架构训练营学习笔记:6-2 微服务基础选型

基础选型 微服务基础设施架构 优先级 其中&#xff0c;核心 就是服务注册、服务发现、服务路由。 模式1-嵌入SDK 模式2-反向代理式 模式3-网络代理式&#xff08;Service Mesh&#xff09; 模式对比 常见微服务框架选择 嵌入SDK-dubbo Spring Cloud 反向代理式 APISIX …