git merge 和 git rebase

Git

  • Git 是一个免费、开源的分布式版本控制系统,最初由Linus Torvalds为了管理Linux内核开发而创建。Git 的设计目标是速度、数据完整性和支持分布式、非线性工作流程。

  • 版本控制系统(Version Control System): 版本控制系统用于跟踪文件和文件夹的变化,并记录这些变化的历史记录。它允许多人协同工作,轻松管理代码的不同版本。

Git 的一些关键特点和优势

  • 分布式架构: Git 是一种分布式版本控制系统,每个开发者都可以在本地拥有完整的代码仓库副本,不依赖于中央服务器。这意味着开发者可以在离线状态下工作,并且每个人都有自己的代码备份。
  • 速度和性能: Git 在处理大型项目和大量文件时表现出色,具有高效的提交、分支和合并操作。由于本地操作,大部分操作都可以在瞬间完成。
  • 完整的历史记录: Git 记录每个提交的完整快照,包括更改的内容、作者、时间戳等,保证了数据的完整性和可追溯性。
  • 分支和合并: Git 提供了强大的分支和合并功能,使得并行开发和特性分支变得简单而灵活。开发者可以轻松创建、切换、合并和删除分支。
  • 轻量级标签: Git 支持在特定提交上创建标签,用于标识里程碑、版本发布等重要节点。
  • 安全性和数据完整性: Git 使用哈希值来标识文件和提交,确保数据的完整性。任何更改都会产生一个唯一的哈希值,使得对代码进行篡改或损坏变得困难。
  • 可扩展性和可定制性: Git 的设计具有高度的可扩展性和可定制性。它可以与其他工具和服务集成,如GitHub、GitLab等。

Git 的基本工作流程

  1. 在本地创建一个 Git 仓库(git init)或克隆远程仓库(git clone)。
  2. 在工作目录中进行代码修改。
  3. 使用 git add 命令将修改的文件添加到暂存区。
  4. 使用 git commit 命令将暂存区的文件提交到本地仓库。
  5. 如有需要,可以创建和切换分支进行并行开发(git branchgit checkout)。
  6. 在完成开发后,使用 git push 命令将本地提交推送到远程仓库。
  7. 如有需要,可以使用 git pull 命令获取远程仓库的更新并合并到本地分支。

git常用的命令

git merge

  • git merge 命令用于将两个或更多的开发历史合并在一起。当你使用 git merge 时,Git 会创建一个新的 “合并提交”(merge commit),这个提交有两个父提交:一个指向你要合并的分支的历史,另一个指向当前分支的历史。这种方式保留了两个分支的完整历史记录,但同时也意味着合并提交会增加历史记录的复杂性。

  • 使用 git merge 的优点是它不会改变历史记录,因为它通过创建一个新的合并提交来整合变更。这使得回溯和理解项目历史变得更加容易。但缺点是随着项目的进行,合并提交可能会变得非常频繁,导致历史记录变得复杂和难以阅读。

示意图

假设我们有两个分支:master 和 feature。master分支代表主开发分支,而 feature 分支用于开发新功能。

A -- B -- C (master 分支)
         \
          D -- E -- F (feature 分支)

当我们使用 git merge 将 feature 分支合并到 master 分支时,Git 会在 master 分支上创建一个新的 “合并提交”(通常称为 “merge commit”),这个提交有两个父提交:C(master 分支的最新提交)和F(feature 分支的最新提交)。

A -- B -- C -- M (master 分支和 feature 分支合并后的新提交)
         \
          D -- E -- F (feature 分支的提交被合并到 merge commit)

在这个示意图中,M 是合并提交,它连接了两个分支的历史。这种方式保留了完整的分支历史和分叉结构,使得项目的历史记录更加清晰。

git rebase

  • git rebase 命令用于将一个分支的提交重新应用到另一个分支的基础上。与 merge 不同,rebase 会创建一系列新的提交,这些提交看起来就像是在另一个分支的基础上直接进行的。这种方式会重写历史记录,使得提交历史变得线性且更加清晰。

  • 使用 git rebase 的优点是它提供了一个更加整洁和连贯的历史记录,这使得阅读和理解变更变得更加容易。但缺点是它改变了历史记录,这可能会导致问题,尤其是在多人协作的项目中。如果一个分支已经被推送到了远程仓库,那么对其进行 rebase 并强制推送(git push --force)可能会导致其他协作者的工作出现冲突。

示意图

假设我们有两个分支:master 和 feature。master 分支代表主开发分支,而 feature 分支用于开发新功能。

A -- B -- C (master 分支)
         \
          D -- E -- F (feature 分支)

当我们使用 git rebase 将 feature 分支的提交重新应用到 master 分支的最新提交上时,Git 会创建一系列新的提交,这些提交看起来就像是直接在 master 分支上进行的。

A -- B -- C -- D' -- E' -- F' (所有 feature 分支的提交被重新应用在 master 分支的最新提交之后)

在这个示意图中,D’、E’ 和 F’ 是重新应用的提交,它们是原始 D、E 和 F 提交的副本,但是具有新的提交哈希值。这种方式创建了一个线性的历史记录,使得提交历史看起来更加整洁。

相关推荐

  1. @RequestBody@RequestParam@PathVariable@RequestAttribute

    2024-03-28 06:26:01       53 阅读
  2. ==equals

    2024-03-28 06:26:01       60 阅读
  3. 关于%/

    2024-03-28 06:26:01       42 阅读
  4. nodejsnpmvite

    2024-03-28 06:26:01       50 阅读
  5. computedwatchwatchEffect 相同不同

    2024-03-28 06:26:01       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 06:26:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 06:26:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 06:26:01       82 阅读
  4. Python语言-面向对象

    2024-03-28 06:26:01       91 阅读

热门阅读

  1. pulsar: 批量接收消息

    2024-03-28 06:26:01       43 阅读
  2. 数据结构奇妙旅程之深入解析归并排序

    2024-03-28 06:26:01       46 阅读
  3. C 指针数组

    2024-03-28 06:26:01       37 阅读
  4. pytorch笔记篇:pandas之数据预处理(更新中)

    2024-03-28 06:26:01       42 阅读
  5. Android数据存储:SQLite、Room

    2024-03-28 06:26:01       48 阅读
  6. 基于Python的旅游网站数据爬虫分析

    2024-03-28 06:26:01       37 阅读
  7. docker安装postgresql数据库包含postgis扩张

    2024-03-28 06:26:01       40 阅读
  8. [XG] HTTP

    [XG] HTTP

    2024-03-28 06:26:01      41 阅读
  9. 前端学习-CSS基础-Day2

    2024-03-28 06:26:01       38 阅读