Git核心概念

ops/2024/12/29 13:08:03/

版本控制

什么是版本控制

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。

为什么要版本控制

有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。

本地版本控制系统

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

本地版本控制系统

集中化的版本控制系统

接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。

集中化的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

集中化的版本控制系统

这么做虽然解决了本地版本控制系统无法让在不同系统上的开发者协同工作的诟病,但也还是存在下面的问题:

  • 单点故障: 中央服务器宕机,则其他人无法使用;如果中心数据库磁盘损坏又没有进行备份,你将丢失所有数据。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
  • 必须联网才能工作: 受网络状况、带宽影响。

分布式版本控制系统

于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 Git 就是一个典型的分布式版本控制系统。

这类系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

分布式版本控制系统

分布式版本控制系统可以不用联网就可以工作,因为每个人的电脑上都是完整的版本库,当你修改了某个文件后,你只需要将自己的修改推送给别人就可以了。但是,在实际使用分布式版本控制系统的时候,很少会直接进行推送修改,而是使用一台充当“中央服务器”的东西。这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

分布式版本控制系统的优势不单是不必联网这么简单,后面我们还会看到 Git 极其强大的分支管理等功能。

git">认识 Git

git-简史">

Git 简史

Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。

git-与其他版本管理系统的主要区别">Git 与其他版本管理系统的主要区别

Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。

下面我们主要说一个关于 Git 与其他版本管理系统的主要差别:对待数据的方式

Git 采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。

大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

具体原理如下图所示,理解起来其实很简单,每当我们提交更新一个文件之后,系统都会记录这个文件做了哪些更新,以增量符号 Δ(Delta)表示。

我们怎样才能得到一个文件的最终版本呢?

很简单,高中数学的基本知识,我们只需要将这些原文件和这些增加进行相加就行了。

这种方式有什么问题呢?

比如我们的增量特别特别多的话,如果我们要得到最终的文件是不是会耗费时间和性能。

Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流

git-的三种状态">

Git 的三种状态

Git 有三种状态,你的文件可能处于其中之一:

  1. 已提交(committed):数据已经安全的保存在本地数据库中。
  2. 已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
  3. 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:Git 仓库(.git directory)工作目录(Working Directory) 以及 暂存区域(Staging Area)

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

git-使用快速入门">Git 使用快速入门

git-仓库">

获取 Git 仓库

有两种取得 Git 项目仓库的方法。

  1. 在现有目录中初始化仓库: 进入项目目录运行 git init 命令,该命令将创建一个名为 .git 的子目录。
  2. 从一个服务器克隆一个现有的 Git 仓库: git clone [url] 自定义本地仓库的名字: git clone [url] directoryname

记录每次更新到仓库

  1. 检测当前文件状态 : git status
  2. 提出更改(把它们添加到暂存区):git add filename (针对特定文件)、git add *(所有文件)、git add *.txt(支持通配符,所有 .txt 文件)
  3. 忽略文件.gitignore 文件
  4. 提交更新: git commit -m "代码提交信息" (每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令 git commit
  5. 跳过使用暂存区域更新的方式 : git commit -a -m "代码提交信息"git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。
  6. 移除文件git rm filename (从暂存区域移除,然后提交。)
  7. 对文件重命名git mv README.md README(这个命令相当于mv README.md READMEgit rm README.mdgit add README 这三条命令的集合)

git-提交消息">

一个好的 Git 提交消息

一个好的 Git 提交消息如下:

标题行:用这一行来描述和解释你的这次提交主体部分可以是很少的几行,来加入更多的细节来解释提交,最好是能给出一些相关的背景或者解释这个提交能修复和解决什么问题。主体部分当然也可以有几段,但是一定要注意换行和句子不要太长。因为这样在使用 "git log" 的时候会有缩进比较好看。

提交的标题行描述应该尽量的清晰和尽量的一句话概括。这样就方便相关的 Git 日志查看工具显示和其他人的阅读。

推送改动到远程仓库

  • 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:git remote add origin <server> ,比如我们要让本地的一个仓库和 GitHub 上创建的一个仓库关联可以这样git remote add origin https://github.com/Snailclimb/test.git

  • 将这些改动提交到远端仓库:git push origin master (可以把 master 换成你想要推送的任何分支)

    如此你就能够将你的改动推送到所添加的服务器上去了。

远程仓库的移除与重命名

  • 将 test 重命名为 test1:git remote rename test test1
  • 移除远程仓库 test1:git remote rm test1

查看提交历史

在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。git log 会按提交时间列出所有的更新,最近的更新排在最上面。

可以添加一些参数来查看自己希望看到的内容:

只看某个人的提交记录:

git log --author=bob

撤销操作

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:

git commit --amend

取消暂存的文件

git reset filename

撤消对文件的修改:

git checkout -- filename

假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:

git fetch origin
git reset --hard origin/master

分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认”的分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

我们通常在开发新功能、修复一个紧急 bug 等等时候会选择创建分支。单分支开发好还是多分支开发好,还是要看具体场景来说。

创建一个名字叫做 test 的分支

git branch test

切换当前分支到 test(当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样)

git checkout test

你也可以直接这样创建分支并切换过去(上面两条命令的合写)

git checkout -b feature_x

切换到主分支

git checkout master

合并分支(可能会有冲突)

 git merge test

把新建的分支删掉

git branch -d feature_x

将分支推送到远端仓库(推送成功后其他人可见):

git push origin

http://www.ppmy.cn/ops/145584.html

相关文章

图片拼接|横向拼接|竖向拼接|正方形拼接|其他模式拼接 python

读取某文件夹下所有子文件夹的图片&#xff0c;进行拼接 文件夹 —文件夹1 |----图片1 |----图片2 —文件夹2 |----图片3 —文件夹3 |----图片4 |----图片5 import os import cv2 import numpy as np import random from math import ceil, sqrt# 支持中文路径的图片读取函数…

【C++基础】10、类与对象

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&am…

Joget研究——Joget8商业版部署

大纲 1. 环境准备1.1 安装必要软件1.2 配置Java1.3 配置MySQL数据库1.3.1 创建用户1.3.2 创建数据库 2. 下载和部署3. 启动4. 测试5. 商业版社区版对比 1. 环境准备 1.1 安装必要软件 We recommend the use of the LTS version of 11. Java 17 (LTS) is not supported at the …

【高阶数据结构】红黑树

红黑树 1.红黑树的概念2.红黑树的规则3.红黑树的实现1.红黑树的结构2.红黑树的插入1.情况一&#xff1a;变色2.情况二&#xff1a;单旋 变色3.情况三&#xff1a;双旋 变色 3.红黑树的查找4.红黑树的验证5.红黑树的删除6.红黑树与AVL树的性能比较 4.总代码1.RBTree.h2.Test.c…

踏踏实实练SQLday2-3连续12345

3连续12345 连续12345 -- hive的连续开窗函数知识点&#xff1a;排序开窗函数--4种 (如果第2 和 3 名一样大)3种 序号排序 - rank() 12245 - 紧缩dense_rank() 12234 - row_number() 123451种百分比排序 - percent_rank() - 算百分比&#xff0c;超过了多少人top20排行榜 连续1…

维克日记:私密写作新选择,轻松记录生活点滴

作为一款专注于私密写作的数字日记本&#xff0c;维克日记以其独特的设计理念和全面的功能特性&#xff0c;正在重新定义现代人记录生活的方式。这款软件不仅提供了清新简约的界面设计&#xff0c;更重要的是它完全不需要繁琐的设置就能立即开始写作。对于热爱写作的用户来说&a…

几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks

几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost&#xff1a;(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html

Apache Commons Pool2—Java对象池的利器

在日常开发中&#xff0c;为了提高系统性能&#xff0c;避免重复创建和销毁资源&#xff0c;我们经常需要使用对象池技术。Apache Commons Pool2 是 Java 生态中一个强大且易用的对象池实现&#xff0c;它为我们提供了灵活的对象管理功能。本文将带你深入了解 Commons Pool2 的…