当前位置: 首页 > news >正文

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` 来继续或中止变基。

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

相关文章:

git 版本控制与合并

一 git概述&#xff1a; - Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理软件开发项目中的代码变更。 - 它允许多人协同工作&#xff0c;记录代码历史变更&#xff0c;并轻松管理多个项目版本。 **Git的主要特点**包括&#xff1a; 1. **分布式系统**&#xff1a;…...

【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>

目录 【力扣】23. 合并 K 个升序链表题解方法一&#xff1a;暴力&#xff0c;先遍历取出来值到数组中排序&#xff0c;再生成新链表方法二&#xff1a;基础堆排序&#xff08;使用优先队列 PriorityQueue&#xff09;方法三&#xff1a;基础堆排序&#xff08;使用优先队列 Pri…...

微信小程序真机防盗链referer问题处理

公司使用百度云存储一些资源&#xff0c;然后现在要做防盗链&#xff0c;在CDN加入Referer白名单后发现PC是正常的&#xff0c;微信小程序无法正常访问资源了。然后是各种查啊&#xff0c;然后发现是微信小程序不支持Referer的修改&#xff0c;且在小程序开发工具是Referer是固…...

SpringBoot集成Redisson实现延迟队列

一、场景 1、下单未支付&#xff0c;超过10分钟取消订单 2、货到后7天未评价&#xff0c;自动好评 二、实现方案 1、使用xxl-job 定时任务按时检测&#xff0c;实时性不高 2、使用RabitMQ的插件rabbitmq_delayed_message_exchange插件 3、 redis的过期检测 redis.conf 中…...

思想道德与法治

1【单选题】公民的基本权利是指宪法规定的公民享有的基本的、必不可少的权利。公民的基本权利有不同的类别&#xff0c;公民的通信自由和通信秘密属于 A、人身自由 B、经济社会权利 C、政治权利和自由 D、教育科学文化权利 您的答案&#xff1a;A 参考答案&#xff1a;A 查…...

vue3登录页面

使用了element-plus <template><div class"login-wrapper"><!-- 背景图或者视频 --><div class"background" style"width: 100%; height: 100%; position: absolute; top: 0px; left: 0px;overflow: hidden;z-index:50;&qu…...

SK5代理与IP代理:网络安全守护者的双重防线

一、IP代理与SK5代理简介 IP代理&#xff1a; IP代理是一种通过中间服务器转发网络请求的技术。客户端向代理服务器发出请求&#xff0c;代理服务器将请求转发至目标服务器&#xff0c;并将目标服务器的响应返回给客户端。IP代理的主要功能是隐藏用户的真实IP地址&#xff0c;提…...

线程间的同步、如何解决线程冲突与死锁

一、线程同步概念&#xff1a; 线程同步是指在多线程编程中&#xff0c;为了保证多个线程之间的数据访问和操作的有序性以及正确性&#xff0c;需要采取一些机制来协调它们的执行。在多线程环境下&#xff0c;由于线程之间是并发执行的&#xff0c;可能会出现竞争条件&#xf…...

8.4一日总结

1.远程仓库的提交方式(免密提交) a.ssh:隧道加密传输协议,一般用来登录远程服务器 b.使用 git clone 仓库名 配置(生成公私钥对) ssh-Keygen [-t rsa -C 邮箱地址] 通过执行上述命令,全程回车,就会在~/.ssh/id_rsa(私钥)和id_rsa.pub(公钥),私钥是必须要保存好的,并不能…...

【面试】某公司记录一次面试题

文章目录 框架类1. Spring boot与 spring 架相比&#xff0c;好在哪里?2. Spring boot以及 Spring MVC 常用注解(如requestingMapping&#xff0c;responseBody 等)3. 常用的java 设计模式&#xff0c;spring 中用到哪些设计模式4. SpringIOC是什么&#xff0c;如何理解5. AOP…...

215. 数组中的第K个最大元素(快排+大根堆+小根堆)

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;基于快速排序 因为题目中只需要找到第k大的元素&#xff0c;而快速排序中&#xff0c;每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时&#xff0c;那么如果有一趟排序过程…...

Ubuntu18.04配置ZED_SDK 4.0, 安装Nvidia显卡驱动、cuda12.1

卸载错误的显卡驱动、cuda 首先卸载nvidia相关的、卸载cuda sudo apt-get purge nvidia* sudo apt-get autoremove sudo apt-get remove --auto remove nvidia-cuda-toolkit sudo apt-get purge nvidia-cuda-toolkit 官方卸载cuda的方法&#xff1a; sudo apt-get --purge re…...

张量Tensor 深度学习

1 张量的定义 张量tensor理论是数学的一个分支学科&#xff0c;在力学中有重要的应用。张量这一术语源于力学&#xff0c;最初是用来表示弹性介质中各点应力状态的&#xff0c;后来张量理论发展成为力学和物理学的一个有力数学工具。 张量&#xff08;Tensor&#xff09;是一个…...

用Rust实现23种设计模式之桥接模式

桥接模式的优点&#xff1a; 桥接模式的设计目标是将抽象部分和实现部分分离&#xff0c;使它们可以独立变化。这种分离有以下几个优点&#xff1a; 解耦和灵活性&#xff1a;桥接模式可以将抽象部分和实现部分解耦&#xff0c;使它们可以独立地变化。这样&#xff0c;对于抽象…...

扩散模型实战(一):基本原理介绍

扩散模型&#xff08;Diffusion Model&#xff09;是⼀类⼗分先进的基于物理热⼒学中的扩散思想的深度学习⽣成模型&#xff0c;主要包括前向扩散和反向扩散两个过程。⽣成模型除了扩散模型之外&#xff0c;还有出现较早的VAE&#xff08;Variational Auto-Encoder&#xff0c;…...

解决npm ERR! code ERESOLVE -npm ERR! ERESOLVE could not resolve

当使用一份vue源码开发项目时&#xff0c;npm install 报错了 npm ERR! code ERESOLVEnpm ERR! ERESOLVE could not resolvenpm ERR!npm ERR! While resolving: vue-admin-template4.4.0npm ERR! Found: webpack4.46.0npm ERR! node_modules/webpacknpm ERR! webpack"^4.0…...

HttpServletRequest和HttpServletResponse的获取与使用

相关笔记&#xff1a;【JavaWeb之Servlet】 文章目录 1、Servlet复习2、HttpServletRequest的使用3、HttpServletResponse的使用4、获取HttpServletRequest和HttpServletResponse 1、Servlet复习 Servlet是JavaWeb的三大组件之一&#xff1a; ServletFilter 过滤器Listener 监…...

css在线代码生成器

这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 布局&#xff0c;效果类&#xff1a; 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强…...

在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换

1.首先需要下载并安装openOffice,下载地址为&#xff1a; Apache OpenOffice download | SourceForge.net 2.安装后&#xff0c;可以测试下是否可用&#xff1b; 3.build.gradle中引入依赖&#xff1a; implementation group: com.artofsolving, name: jodconverter, version:…...

手机变电脑2023之虚拟电脑droidvm

手机这么大的内存&#xff0c;装个app来模拟linux&#xff0c;还是没问题的。 app 装好后&#xff0c;手指点几下确定按钮&#xff0c;等几分钟就能把linux桌面环境安装好。 不需要敲指令&#xff0c; 不需要对手机刷机&#xff0c; 不需要特殊权限&#xff0c; 不需要找驱…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...