分布式版本控制工具 - Git

news2024/11/23 23:17:14

文章目录

    • 1. 概念介绍
    • 2. 客户端
      • 2.1 介绍
      • 2.2 仓库操作
      • 2.3 文件操作
      • 2.4 分支原理与操作
      • 2.5 标签
      • 2.6 远程仓库
      • 2.7 README与IGNORE
    • 3. IDEA集成
    • 4. 版本号
      • 4.1 介绍
      • 4.2 文件操作
      • 4.2 分支操作
    • 5. 命令
      • 5.1 介绍
      • 5.2 仓库操作
      • 5.3 文件操作
      • 5.4 分支操作
      • 5.5 标签操作
      • 5.6 远程仓库

image-20240509223226881


1. 概念介绍

软件配置管理(SCM,Software Configuration Management)是指通过执行版本控制、变更控制的规程,以及使用合适的配置管理软件,来保证所有配置项的完整性和可跟踪性。配置管理是对工作成果的一种有效保护。

Visual SourceSafe(VSS)是美国微软公司出品的版本控制系统,是集中式版本控制系统。

image-20240510091331718

Concurrent Versions System(CVS)是基于客户端/服务器的行为使得其可容纳多用户,构成网络也很方便。也是集中式版本控制系统。

Subversion(SVN)是CVS的升级,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。

Git为开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。

版本控制

版本包括软件版本和文件版本。

把每次修改记录下来,防止重要文件丢失等问题。一旦出现问题,可以通过这些修改记录进行恢复数据。

版本控制可以帮我们自动生成版本号。

版本控制软件的基础功能

  • 保存和管理文件
  • 提供客户端工具进行访问
  • 提供不同版本文件的比对功能

集中式版本控制

image-20240510093734919

集中式版本控制存在着一些问题,如文件冲突问题。

image-20240510094158788

VSS采用加锁(读写者问题)的方式来解决这个问题。这种处理方式会导致,对于同一份文件,当一个人处理完成后,下一个人才可以再进行处理,会导致开发效率低下。

CVS,SVN在提交文件时,对文件进行比对,然后进行文件合并,以此来解决文件冲突问题。

分布式版本控制

如果中央服务器宕机了,则会导致整个系统崩溃,数据丢失,会导致严重的问题。所以就出现了分布式版本控制。

image-20240510095328079

这种情况下,如果中央服务器宕机了,但是我们本地的仓库依然存在,用户依然可以对文件进行修改等操作,可以将文件提交到本地仓库,避免数据丢失。当中央服务器恢复时,将本地仓库与中央服务器进行同步。


2. 客户端

2.1 介绍

GitHub Desktop是图形界面客户端。

image-20240510100608127

在左上角Github Desktop中选择settings进行相关配置。

填写Name和Email,为了在修改文件时,让工具知道是哪个用户修改的文件。

image-20240510100826706

2.2 仓库操作

我们选择在本地创建一个新的仓库,填写相关信息。

image-20240510101310332

点击Create Repository创建仓库后,进行新的界面。

image-20240510101606786

我们可以点击ADD再创建一个新仓库,我们将其命名为git-local-test2

image-20240510101707791

当我们不想要该仓库时,可以右键该仓库,选择remove。如果不选择Also move this repository to Recycle Bin,则只是从该工具系统中删除仓库,并不删除文件。如果勾选了,则也会删除实际的文件。

2.3 文件操作

我们在仓库目录下随便创建一个文件,比如a.txt,然后在其中随便写点内容。此时,在客户端工具中就会查看到新创建的文件。

image-20240510102419730

但是此时,我们的文件并没有放入本地仓库中。本地仓库中的文件,其实是在.git隐藏文件夹下的。

image-20240510103754452

当我们点击左下角的commit,就会将操作文件提交到本地仓库中。此时,changes下就没有文件存在了。因为当提交完成后,本地仓库中的内容与仓库目录下的操作文件内容一致,所以无文件变化,changes中就没有文件存在了。

当我们修改文件后,再次提交到本地仓库,相当于创建了一个新的文件,并不会覆盖之前旧的文件。

点击左上角的History,可以查看到我们每次操作的文件变化。

image-20240510104314310

git采用的版本号是由40个16进制的数字组成。版本号也称为提交码。

同样的,当我们删除掉本地文件时,也会在客户端中看到变化。

image-20240510104551953

2.4 分支原理与操作

image-20240510134152083

当我们在多人协作开发时,多人会很多次的提交文件,提交过程是没有任何规律的,这样想对定位到某一次提交,去查看提交了哪些内容,是非常困难的。

另一方面,开发人员在开发不同的功能模块时,可能会修改同一份文件,这样就会可能产生文件冲突,虽然对于文件冲突有解决方案,但是频繁的出现冲突,就会非常麻烦,且存在一些未知的风险。

还有就是我们频繁的修改会产生大量的版本信息,导致仓库的体积越来越大,那么我们再去做定位于文件比对时,其效率也会变得越来越慢。

所以,此时我们就需要使用分支功能。说白了,分支就是当前版本库的一个副本,开发人员可以在这个副本上进行文件操作。在处理完成最后,再将不同的副本进行合并。

image-20240510134023739

这种情况下,只需要在最后合并的时候解决一次文件冲突即可。

在客户端中,我们点击New Branck创建新分支,填写分支名称,选择基于main主分支进行创建,点击Create即可。

我们创建一个order分支和一个user分支。

image-20240510134813769

在user分支中,添加文件user.txt,随便写入一些内容,然后commit提交。此时,我们将分支切换到order,打开文件目录,是看不到user分支下的文件的,当切换为user分支时,又可以在目录下看到user分支下的文件了。

在order分支中,添加文件order.txt,随便写入一些内容,然后commit提交。

此时,我们切换回主分支,可以点击下方按钮,进行分支的合并操作。

image-20240510140426836

选择要合并的分支,点击按钮进行合并。

image-20240510135748130

会看到提示,合并成功。

image-20240510135937878

为了演示合并时产生的文件冲突问题。我们在user分支下创建common.txt文件,里面写入user单词,并commit提交到user分支。然后我们在order分支下创建common.txt文件,里面写入order单词,并提交到order分支。此时,我们切换到主分支,点击合并分支按钮,将user分支合并到主分支。然后,我们再将order分支合并到主分支时,会出现如下提示。

image-20240510140517755

然后我们继续点击Create a merge commit按钮,会出现如下提示。我们可以点击Open in Visual Sublime Text,进入到Sublime中进行查看。

image-20240510140946251

此时,我们可以看到如下冲突信息。

image-20240510141027111

========之上表示现在已经存在的内容,之下表示新合并进来的内容

我们可以将多余内容删除,只留下如下内容,这也就意味着我们选择保留两者。

image-20240510141245399

然后我们点击Continue Merge即可成功合并。

2.5 标签

在我们进行分支合并操作时,我们无法自定义的去添加描述信息。所以我们就可以通过添加标签的形式进行说明。

History中,右键记录,选择Create Tag,然后输入Tag的名称,点击创建即可。

image-20240510141718117

同样,我们也可以通过右键记录,进行Tag的删除操作。

2.6 远程仓库

Github:https://github.com/

在github中,我们创建一个仓库。填写仓库名称remote-test、描述信息、选择仓库是否私有、勾选初始化redeme文件,点击创建即可。

image-20240510143255217

点击Add file可以选择直接创建文件或者上传文件。我们选择创建文件,命名为test.txt,并随便写入一些内容,填写提交描述信息,并且点击commit按钮进行提交创建。

我们再次编辑该文件,然后再次提交。在文件页面中,点击右上角的History即可查看文件的修改记录。

image-20240510143644211

在Code页面中,点击Branch,我们可以填写分支名称,创建新的分支。

我们想要将这个仓库的内容下载到本地,可以在客户端工具中,选择File,点击Clone Repositroy,选择要克隆到仓库以及bacon的路径,点击克隆将仓库克隆到本地。这样就将远程仓库下载到本地了。

我们在这个本地仓库中新建一个文件a.txt,随便添加一些内容。然后在客户端中点击commit将新增文件提交到本地仓库。此时,我们只是将这个新增的文件提交到了本地仓库中,并没有上传至远程仓库。我们要上传至远程仓库,点击Push origin按钮即可。

image-20240510144548102

这样,我们在github远程仓库中就可以看到我们所提交的文件了。

image-20240510144649280

2.7 README与IGNORE

README.md文件用于对仓库进行描述。

注意:对于文件比对功能,只能针对文本文件,对于word、excel、图片等文件无法进行比对。

ignore文件写入需要忽略的文件,被忽略的文件不会进行提交。

在ignore文件中我们可以使用*作为通配符,如*.docx


3. IDEA集成

在IDEA中我们创建一个新的项目。

image-20240510150325642

此时,我们先不勾选Create Git Repository

我们在项目中新建一个文件a.txt,随便写入一些内容。

此时,我们想要将我们的项目上传至github中。

我们选择上方的VCS,选择Share Project on GitHub

image-20240510150712855

由于之前已经配置过github账号,所以此时不会提示让我们进行配置,如果没有配置,则按照步骤进行配置即可。

这里,点击share按钮。会出现如下提示,是让我们将内容提交到本地仓库。此时,我们只勾选a.txt文件。

image-20240510150922312

然后点击add按钮即可。此时,在github远程仓库中就已经有了我们的项目。

image-20240510151028184

我们在本地对a.txt文件进行修改后,文件名称的颜色会发生改变。我们右键该文件,可以出现如下信息。

image-20240510151246004

点击Commit file,填写描述信息,点击commit可以将该文件提交到本地仓库,点击commit and push按钮,然后点击push可以提交到本地仓库并且上传至远程仓库。

image-20240510151526749

我们将远程仓库中的a.txt文件内容修改为ccc。但是此时,我们本地a.txt文件的内容为bbbbbbb。此时会出现我们本地文件与远程仓库文件不统一。我们就要将远程仓库中的文件同步到本地。点击上方工具栏中的Git选项,选择Pull选项,点击pull按钮即可。

image-20240510151907644

为了演示文件冲突,我们将远程仓库中的a.txt文件内容修改为ddd。但是此时,我们本地a.txt文件的内容为ccc,我们将其修改为cccaaa。此时我们再提交a.txt文件。会出现如下提示。

image-20240510152501870

我们点击Merge按钮,出现如下提示。

image-20240510152621587

我们可以直接选择保留本地,或者采用远程文件。或者点击Merge按钮进行人工手动合并文件。我们点击Merge按钮出现如下提示。

image-20240510152803617

左部分为我们本地文件,右边部分为远程仓库文件,中间为合并后的文件。

>>表示Accept,×表示Ignore。

假如我们想同时保留本地和远程的内容,那么就点击两侧的>>或者<<按钮即可。然后点击Apply按钮。

image-20240510153135899

这样便解决了文件冲突,成功将文件提交到了远程仓库。

Gitee

如果想要将项目上传至Gitee仓库,需要在IDEA中安装Gitee插件。


4. 版本号

4.1 介绍

版本号是根据我们当前提交的内容,采用SHA-1加密算法进行生成的。长度为40位。避免了版本号重复冲突。

版本号可以用于定位仓库中的文件。前2位:文件夹,后38位:文件名。可以在.git文件夹下的objects目录中找到。

4.2 文件操作

如果我们想查看.git目录中objects中,通过版本号定位到的文件。可以通过使用git命令行进行查看。

git cat-file -p 版本号

# parent为上次提交的版本号
➜  remote-test git:(main) git cat-file -p f8744fb3ee43b9724aa10a70f97147df0b0e6d21
tree f630198fa18b852999ca11dee336afafad9b79d5
parent 27961ee69740f6ad52fc41586090dae410b5ae1f
author Mango1698 <mango_1698@163.com> 1715323425 +0800
committer Mango1698 <mango_1698@163.com> 1715323425 +0800

Create a.txt

提交本地文件

# 可以通过上述返回的信息 tree f630198fa18b852999ca11dee336afafad9b79d5 所给出的版本号,继续查询
# 该文件中是包含了文件的状态信息,同时也包含着文件的版本号
➜  remote-test git:(main) git cat-file -p f630198fa18b852999ca11dee336afafad9b79d5
100644 blob 24a5c29ee326bb4525fbe9bf61d4a20bb1e147ad	README.md
100644 blob 7c4a013e52c76442ab80ee5572399a30373600a2	a.txt
100644 blob a40ead6c4ed495142a6e1b15025cabba7a40485e	test.txt

# 通过文件的版本号继续查询
➜  remote-test git:(main) git cat-file -p 7c4a013e52c76442ab80ee5572399a30373600a2
aaa%
# 这样,文件内容就被查询出来了

image-20240511091601097

4.2 分支操作

.git目录下存在HEAD文件,文件内容如下。该文件指向了一个路径。

ref: refs/heads/main

我们可以通过该路径,在.git目录下进行寻找。

image-20240511092230756

打开main文件后,我们看到如下内容。

f8744fb3ee43b9724aa10a70f97147df0b0e6d21

这个正是我们最后一次提交的一个版本号。

image-20240511092451433

由此,git就可以方便的判断出,那么多的提交,哪一个是最新的提交。

image-20240511092602915

之所以HEAD文件不直接记录最新的一次提交,反而是只想了main文件,因为我们可能是存在着多个分支。这里的main文件是记录的主分支。

我们创建一个分支user后,并且在user分支中进行一次提交操作,可以看到HEAD中所指向的路径更改了。

image-20240511093050945

同样,我们可以根据该路径可以找到user文件,该文件中记录了该分支最后一次提交。

我们只要切换分支,HEAD文件中的路径就会跟着变化,不是只有发生提交等操作才会变化,而是只要切换分支,就会变化!

image-20240511093827457

同样的,当我们切换分支时,git工作目录下的文件也会随之变化!

比如,我们在主分支下创建了一个b.txt文件,当我们切换到user分支时,是看不到这个文件的。

当我们在user分支下创建了一个c.txt文件,当我们切换到主分支是,同样也是看不到的。

当我们对文件进行修改后,但是并没有提交时,我们此时切换分支,可以选择将变化的文件放入暂存区,或者选择将变化的文件放入我们要切换到的分支。

image-20240511095126755

当我们选择放回暂存区时,可以点击Stashed Changes查看,点击Restore放回Changes列表下。

image-20240511094916396

当我们选择将改变的文件带入新分支时,那么原分支中的文件将恢复成原来内容,不会发生改变!


5. 命令

5.1 介绍

image-20240511135959877

5.2 仓库操作

git -v查看git版本信息

➜  remote-test git:(main)git -v
git version 2.43.0

我们在本地创建一个空的文件夹local-rep-1,在该目录下我们进行git初始化,来构建本地仓库,使用git init命令:

➜  local-rep-1 git init
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示:	git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main''trunk''development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示:	git branch -m <name>
已初始化空的 Git 仓库于 /Users/shihongwei/myfile/project/project2024/local-rep-1/.git/

可以通过git clone指令下载远程仓库。

git clone https://github.com/mango1698/user-management-system.git
# 可以自定义克隆项目要存储的目录名称
# git clone URL 自定义目录名称
git clone https://github.com/mango1698/user-management-system.git customer-project

通过git config命令对git进行配置。

git config user.name 用户名称
git config user.email 邮箱

上诉配置只是对单个仓库进行配置,如果我们拥有多个仓库时,一一配置非常麻烦,所以我们可以进行全局配置。

git config --global user.name 用户名称
git config --global user.email 邮箱

mac os系统中,git对配置文件在用户目录下。

➜  ~ cat .gitconfig
[user]
	name = Mango1698
	email = mango_1698@163.com
[safe]
	directory = /opt/homebrew
[http]
	version = HTTP/1.1
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true

如果我们不想使用命令行,也可以通过直接修改该文件进行配置。

5.3 文件操作

我们在刚刚创建的local-rep-1目录下进行操作。

使用git status命令查看暂存区状态。

➜  local-rep-1 git:(master) git status
位于分支 master
尚无提交
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

我们在该目录下新建a.txt文件。我们再次执行git status命令。

➜  local-rep-1 git:(master)git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
	a.txt

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

可以看到a.txt文件并未被git追踪,也就是git没有管理a.txt文件。此时,我们可以通过git add指令,将a.txt加入到暂存区,将会被git追踪。git add .表示将该目录下所有文件加入到暂存区中。也可以使用通配符,如git add *.txt进行添加。

➜  local-rep-1 git:(master)git add a.txt

此时,我们再次执行git status命令。

➜  local-rep-1 git:(master)git status
位于分支 master

尚无提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)
	新文件:   a.txt

可以看到a.txt文件已经放入了暂存区中。如果我们想将其从暂存区中移除,可以使用git rm --cached 文件名指令进行移除。

➜  local-rep-1 git:(master) ✗ git rm --cached a.txt
rm 'a.txt'

➜  local-rep-1 git:(master) ✗ git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
	a.txt

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

我们再使用git add命令将其放回暂存区。

我们可以使用git commit命令将其存放到本地仓库中。通过-m参数来填写描述信息。

➜  local-rep-1 git:(master)git commit -m "新增文件"
[master(根提交) 295ffbd] 新增文件
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
 
➜  local-rep-1 git:(master) git status
位于分支 master
无文件要提交,干净的工作区

可以通过git log来查看提交到历史记录。

➜  local-rep-1 git:(master) git log
commit 295ffbdeff63348efc79a13042b439d8bb2b6fae (HEAD -> master)
Author: Mango1698 <mango_1698@163.com>
Date:   Sat May 11 14:36:21 2024 +0800

    新增文件

可以通过--oneline参数来在一行中显示这些信息。

➜  local-rep-1 git:(master) git log --oneline
295ffbd (HEAD -> master) 新增文件

当我们修改了a.txt文件后,执行git status命令。

➜  local-rep-1 git:(master)git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
	修改:     a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

可以发现,git识别出了我们修改了a.txt文件,我们需要执行git add命令和git commit命令对修改的文件进行提交。

➜  local-rep-1 git:(master)git log --oneline
3c01ead (HEAD -> master) 修改文件
295ffbd 新增文件

当我们删除掉a.txt文件时。

➜  local-rep-1 git:(master) git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add/rm <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
	删除:     a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

可以看到git识别出了我们删除了文件。我们通过git addgit commit来提交变化。

➜  local-rep-1 git:(master)git add a.txt

➜  local-rep-1 git:(master)git commit -m "删除a.txt"
[master a25835d] 删除a.txt
 1 file changed, 2 deletions(-)
 delete mode 100644 a.txt
 
➜  local-rep-1 git:(master)git log --oneline
a25835d (HEAD -> master) 删除a.txt
3c01ead 修改文件
295ffbd 新增文件

当我们误删除了文件时,我们可以将本地仓库中的文件恢复到工作区。

此时,我们新建一个b.txt文件,并将其提交到本地仓库。然后在文件夹中删除该文件。假如这个过程我们时误删除的,那么,我们便可以使用git restore 文件名命令从本地仓库中将文件恢复。

➜  local-rep-1 git:(master)git restore b.txt
➜  local-rep-1 git:(master) ls
b.txt

但是,假如我们删除了文件,并且通过git addgit commit命令将改动进行提交了,也就意味着本地仓库中的文件也被删除了。此时,我们可以根据版本号,通过git reset --hard 版本号命令进行重置。

➜  local-rep-1 git:(master) git log --oneline
d4fab59 (HEAD -> master) 删除b.txt
3a35301 新增b.txt
a25835d 删除a.txt
3c01ead 修改文件
295ffbd 新增文件
# 因为删除b.txt文件是在d4fab59版本进行,所以我们可以恢复至其前一个版本3a35301
➜  local-rep-1 git:(master) git reset --hard 3a35301
HEAD 现在位于 3a35301 新增b.txt

这样工作区和本地仓库中的文件都恢复了。使用git log可以发现:

➜  local-rep-1 git:(master) git log --oneline
3a35301 (HEAD -> master) 新增b.txt
a25835d 删除a.txt
3c01ead 修改文件
295ffbd 新增文件

我们目前的最新版本号又回到了3a35301。从版本之后的提交丢失掉了。那么该如何解决这个问题呢?

我们可以使用git revert 版本号命令。

我们在工作区删除b.txt,并通过git addgit commit命令提交。

➜  local-rep-1 git:(master) git log --oneline
e233f38 (HEAD -> master) ddd
3a35301 新增b.txt
a25835d 删除a.txt
3c01ead 修改文件
295ffbd 新增文件

可以看到我们是在e233f38版本删除了b.txt文件,那么git revert后的版本号直接写e233f38即可,会帮助我们恢复到它的上一个版本。

➜  local-rep-1 git:(master) git revert e233f38

会出现如下提示:

Revert "ddd"

This reverts commit e233f38c899fb38271000920a1207df9fec0448c.

# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 说明将会终止提交。
#
# 位于分支 master
# 要提交的变更:
#       新文件:   b.txt
#

然后,我们查看提交记录。

➜  local-rep-1 git:(master) git log --oneline
23b38c2 (HEAD -> master) Revert "ddd"
e233f38 ddd
3a35301 新增b.txt
a25835d 删除a.txt
3c01ead 修改文件
295ffbd 新增文件

可以看到e233f38删除b.txt的版本还在,使用git revert命令是又创健了一个最新的版本。

5.4 分支操作

通过git branch 分支名称命令来创建分支。

➜  local-rep-1 git:(master) git branch user

可以通过git branch -v来查看所有分支。

➜  local-rep-1 git:(master) git branch -v
* master 23b38c2 Revert "ddd"
  user   23b38c2 Revert "ddd"

通过git checkout 分支名称命令来切换分支。

➜  local-rep-1 git:(master) git checkout user
切换到分支 'user'
➜  local-rep-1 git:(user)

我们可以将创建分支和切换分支这两部合并为一步操作,通过git chechout -b 分支名称命令。

➜  local-rep-1 git:(user) git checkout -b order
切换到一个新分支 'order'
➜  local-rep-1 git:(order)

通过git branch -d 分支名称来删除分支。

➜  local-rep-1 git:(order) git branch -d user
已删除分支 user(曾为 23b38c2)。

分支合并处理

目前,我们有两个分支master和order。

我们在master分支下创建c.txt文件,写入内容master,并提交到本地仓库中。

我们在order分支中也添加一个c.txt文件,写入内容order,并提交到仓库中。

我们想要合并分支,首先我们要切换到master分支,将order分支合并到master中。使用git merge命令进行合并。

➜  local-rep-1 git:(master) git merge order
自动合并 c.txt
冲突(添加/添加):合并冲突于 c.txt
自动合并失败,修正冲突然后提交修正的结果。

提示我们c.txt文件发生了冲突。此时,我们查看c.txt文件,其中就包含了比对的操作。

image-20240511153140900

删除掉多余的内容,保留我们想要保留的内容,然后重新git addgit commit即可。这样就实现了合并操作,并解决了文件冲突。

5.5 标签操作

当我们提交太多时,通过git log命令查看历史记录会很费劲,我们可以通过git log 版本号的方式来查看该版本及该版本之前的提交记录。

git log dd46db18c85aa0b16f55800cf5eacfab7427c8b7
commit dd46db18c85aa0b16f55800cf5eacfab7427c8b7
Author: Mango1698 <mango_1698@163.com>
Date:   Sat May 11 15:28:09 2024 +0800

    create c.txt

commit 23b38c28ea32742ccbabcd53341c60d51f9c2d0c
Author: Mango1698 <mango_1698@163.com>
Date:   Sat May 11 15:05:44 2024 +0800

    Revert "ddd"

    This reverts commit e233f38c899fb38271000920a1207df9fec0448c.

commit e233f38c899fb38271000920a1207df9fec0448c
Author: Mango1698 <mango_1698@163.com>
Date:   Sat May 11 15:04:08 2024 +0800

    ddd
......

但是这种方式,也不太方便,因为版本号太长了。另外,我们不清楚这个版本号对应的是什么操作。所以,我们可以给当前的提交增加一个标记,这个标记称为标签。简单的理解就是,给当前的提交版本增加一个别名,后面我们就可以通过这个别名进行访问。

通过git tag 标签名称 版本号来新增标签。

➜  local-rep-1 git:(master) git tag updatefile 29a015d2cc11d2eb2c251d7a4c1d27a4dc60cb1d

通过git tag命令查看所有标签。

➜  local-rep-1 git:(master) git tag
updatefile

此时,我们使用git log命令就可以看到tag已经生效了

image-20240511154711747

此外,我们可以通过git log 标签名称进行查看该版本及该版本之前的提交记录。

➜  local-rep-1 git:(master) git log updatefile

通过git tag -d 标签名称删除标签。

➜  local-rep-1 git:(master) git tag -d updatefile
已删除标签 'updatefile'(曾为 29a015d)

此外,我们可以通过git checkout -b 标签名称来进行分支创建,这个分支的名称与标签名称一致,版本与标签所指的版本一致。

5.6 远程仓库

通过如下指令来增加远程仓库地址:

git remote add origin https://xxxxxx

可以通过git remote rename origin进行修改名称,通过git remote rm origin进行删除。

也可以在配置文件中直接修改。

通过git push命令将本地仓库提交到远程。

通过git pull拉取远程仓库。

需要配置SSH安全认证。

通过命令ssh-keygen -t rsa -CUrl进行生成。生成好的文件在用户目录下.ssh目录中,文件名称为id_rsa.pub。将文件内容复制到gitee或者github中进行配置。

Github

image-20240511160402362

Gitee

image-20240511160922646

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

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

相关文章

关于Hash表,你不得不知道的知识点

定义&#xff1a; 哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&#xff0c;也称为hash函数&#xff0c;存放记录的数组叫做散列表。…

map 和 set 的介绍和简单使用

目录 1. 序列式容器和关联式容器 2. 键值对 2.1. make_pair 3. 树形结构的关联式容器 3.1. set (Key 模型) 3.1.1. std::set::find 和 std::set::count 3.2. map (Key-Value 模型) 3.2.1. std::map::insert 3.2.2. std::map::operator[] 3.3. multiset 3.4.1. std::…

Multisim 14二极管及其电路的应用

multisim multisim&#xff0c;即电子电路仿真设计软件。Multisim是美国国家仪器&#xff08;NI&#xff09;有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0…

周末可以做什么副业?

周末可以做很多种副业&#xff0c;具体可以根据个人兴趣和技能来选择。以下是一些常见的周末副业推荐 1. 线上销售 可以开设自己的网店&#xff0c;销售自己制作的产品、代理热门商品或者利用二手交易平台售卖闲置物品。 2. 做任务 空闲时间可以选择做的是百度的黑鲨阁&…

^_^填坑备忘^_^C#自动化编程实现STK+Exata对卫星互联网星座进行网络仿真

C#实际选择 STK11版本 or STK12版本的问题备注。 【C#自动化客户端调用STK时&#xff0c;实际选择 STK11版本 or STK12版本 的调试运行备注】 以下代码“更新并重新打包备份为”〔testSTKQualNetInterface备份08.1_★避坑★【种子卫星&#xff1a;天线直接安装在卫星上&#…

【刷题篇】滑动窗口(二)

文章目录 1、水果成篮2、找到字符串中所有字母异位词3、串联所有单词的子串4、最小覆盖子串 1、水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多…

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意&#xff1a;此种方式如果在远程服务器上的JupyterLab上运行&#xff0c;可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键&#xff0c;之后关闭所有窗口 cv2.w…

Jsp+Servlet实现图片上传和点击放大预览功能(提供Gitee源码)

前言&#xff1a;在最近老项目的开发中&#xff0c;需要做一个图片上传和点击放大的功能&#xff0c;在Vue和SpringBoot框架都有现成封装好的组件和工具类&#xff0c;对于一些上世纪的项目就没这么方便了&#xff0c;所以需要自己用原生的代码去编写&#xff0c;这里分享一下我…

MySQL性能优化(提升数据库性能的措施)

万物皆有裂痕&#xff0c;那是光照进来的地方。大家好&#xff0c;今天给大家分享一下关于MySQL性能优化&#xff0c;在处理大型数据集和高负载情况下&#xff0c;MySQL数据库的性能优化是至关重要的。通过合理的调优策略&#xff0c;可以有效提高数据库的响应速度和稳定性。本…

5.10.3 使用 Transformer 进行端到端对象检测(DETR)

框架的主要成分称为 DEtection TRansformer 或 DETR&#xff0c;是基于集合的全局损失&#xff0c;它通过二分匹配强制进行独特的预测&#xff0c;以及 Transformer 编码器-解码器架构。 DETR 会推理对象与全局图像上下文的关系&#xff0c;以直接并行输出最终的预测集。 1. …

WEB后端复习——javabean与会话cookie、session

JavaBean 是一种符合特定命名约定的 Java 类&#xff0c;它通常用于封装数据。 JavaBean 的主要特点是&#xff1a; 1. 无参构造器&#xff1a;JavaBean 必须有一个公共的&#xff08;public&#xff09;无参构造方法&#xff0c;以便于反射时能够创建对象实例。 2. 属性&…

【Linux网络】Https【下】{CA认证/证书的签发与认证/安全性/总结}

文章目录 1.引入证书【为方案五铺垫】1.1再谈https1.2SSL/TLS1.3CA机构1.4理解数字签名1.4继续铺垫1.5方案五服务端申请证书回顾一二三回顾方案四方案五过程寻找方案五的漏洞客⼾端对证书进⾏认证 2.查看证书2.1查看浏览器的受信任证书发布机构2.2中间⼈有没有可能篡改该证书2.…

nodeJs用ffmpeg直播推流到rtmp服务器上

总结 最近在写直播项目 目前比较重要的点就是推拉流 自己也去了解了一下 ffmpeg FFmpeg 是一个开源项目&#xff0c;它提供了一个跨平台的命令行工具&#xff0c;以及一系列用于处理音频和视频数据的库。FFmpeg 能够执行多种任务&#xff0c;包括解封装、转封装、视频和音频…

中霖教育:税务师考试可以申请免试吗?

符合下列相应条件之一的&#xff0c;可报名参加税务师职业资格考试&#xff1a; 1.取得经济学、法学、管理学学科门类大学本科及以上学历(学位);或者取得其他学科门类大学本科学历&#xff0c;从事经济、法律相关工作满1年。 2.取得经济学、法学、管理学学科门类大学专科学历…

【HCIP学习】BGP选路、过滤及属性

一、BGP路由选路原则&#xff08;13条&#xff09; 1、首先丢弃下一跳&#xff08;NEXT_HOP&#xff09;不可达的路由&#xff1b; 2、优选Preferred-value值最大的路由&#xff1b;默认为0&#xff1b; Preferred-value&#xff1a;定义&#xff1a;首选项。 属性值&#…

windows系统安装Ubuntu子系统

安装前先在 控制面板 中打开 程序与功能选项 &#xff0c;点击 启用或关闭Windows功能&#xff1a; 勾选 适用于 Linux的Windows子系统 和 虚拟机平台 、 Hyper-v 。 重启电脑后再 Microsoft Store Windows应用商店 中下载合适的Ubuntu版本。 运行Ubuntu程序&#xff0c;如出现…

在xAnyLabeling中加载自己训练的yolov8s-obb模型进行半自动化标注

任务思路&#xff1a; 先使用xAnyLabeling标注一部分样本&#xff0c;训练出v1版本的yolov8-obb模型&#xff0c;然后加载yolov8-obb模型到xAnyLabeling中对其余样本进行半自动化标注。节省工作量。 任务流程&#xff1a; 1.准备xAnyLabeling标注工具 下载代码&#xff0c;…

[Flutter GetX使用] Getx路由和状态管理-GetController使用过程中的踩坑记录

文章目录 问题 - Get.find() 报错!原因总结A:路由和控制器设计a1:项目中的Get路由aa1.项目路由结构aa2.本项目路由的注意点: B: GetController的冷知识C: 总结来看D: 一些参考资料 问题 - Get.find() 报错! 刚接触Getx, 遇到 Get.find()确找不到, 进而报错的问题, 一时间有点没…

零基础学MySQL

1. 零基础学MySQL 1.1 数据库简介 1.1.1 数据库三层结构 1. 所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database manage system) 2. 一个数据库中可以创建多个表,以保存数据(信息)。 3. 数据…

OpenCompass 大模型评测实战学习笔记

大模型开源开放评测体系 “司南” (OpenCompass2.0)&#xff0c;用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下&#xff1a; 开源可复现&#xff1a;提供公平、公开、可复现的大模型评测方案 全面的能力维度&#xff1a;五大维度设计&#xff0c;提供 70…