分布式版本控制工具 - Git

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WebGPU】WebGPU 中的反应扩散计算着色器

在本教程中&#xff0c;我们将使用 WebGPU 技术中的计算着色器实现图像效果。更多精彩内容尽在数字孪生平台。 程序结构 主要构建两个 WebGPU 管道&#xff1a; 运行反应扩散算法多次迭代的计算管道&#xff08;js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识&#xff0c;下面我们将介绍缓冲区的相关知识。 本质上来说&#xff0c;缓冲区就是一块内存区域&#xff0c;因为内核上的缓冲区较复杂&#xff0c;所以本文主要介绍C语言的缓冲区。 目录 1.为什么要有缓冲区 2.应用层缓冲区的默认刷新策略 …

【C++】STL — map和set的使用详细介绍

前言 本章将继续学习STL中的两个很重要的容器map和set&#xff0c;其底层实现是封装了一个红黑树&#xff0c;我们通过本节来学习和深入了解一下这两大容器。。。 序列式容器&#xff1a; string 、Vector、List 、dequeue 关联式容器&#xff1a;MAP 、SET、nordered_map、uno…

成员函数构造函数析构函数

文章目录 类的6个默认成员函数构造函数概述定义特性 析构函数概述特性 类的6个默认成员函数 空类&#xff1a; 如果一个类里面什么都没有写&#xff0c;我们称之为空类 class Date {};空类真的什么都没有吗&#xff1f; 实际上并非如此&#xff0c;编译器会自动生成6个默认成…

【大数据】HDFS

文章目录 [toc]HDFS 1.0NameNode维护文件系统命名空间存储元数据解决NameNode单点问题 SecondaryNameNode机架感知数据完整性校验校验和数据块检测程序DataBlockScanner HDFS写流程HDFS读流程HDFS与MapReduce本地模式Block大小 HDFS 2.0NameNode HANameNode FederationHDFS Sna…

C++笔试强训day19

目录 1.小易的升级之路 2.礼物的最大价值 3.对称之美 1.小易的升级之路 链接 模拟就行&#xff0c;唯一可能是难点得就是gcd&#xff08;最大公约数&#xff09; #include <iostream> using namespace std; #define int long long const int N 1e5 10; int arr[N];…

【DIY小记】深圳万象天地餐馆探店点评

第一次在技术博客里面写生活日记&#xff0c;也算是破了个小天荒。个人以为&#xff0c;博客是个人生活思考的载体&#xff0c;而技术只占生活的一部分&#xff0c;那么博客里为什么一定要限制只能够写技术内容&#xff0c;不能写点其它生活上的东西呢&#xff1f;思来想去&…

科研诚信与学术规范 2024年春 期末考试答案

章节答案&#xff1a;https://www.bilibili.com/video/BV1JZ42177F8/ 是这个课&#xff0c;网上的大多数答案都是以前的&#xff0c;跟这门课没啥关系. 期末考试的答案长这样&#xff0c;题库有80个题&#xff0c;考试一般是50个题。 期末考试答案&#xff1a;&#xff08;不…

C++动态内存区域划分、new、delete关键字

目录 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 二、new关键字 1、内置类型的new/delete使用方法&#xff1a; 2、new和delete的本质 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 因为不同数据有不同的存储需求&#xff0…

6818Linux内核--Bootloader应用分析

Bootloader应用分析 一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a; 引导加载程序。包括固化在固件( firmware )中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。 Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 文件系统…

Polygon市值机器人

随着区块链技术的蓬勃发展和数字货币市场的日益繁荣&#xff0c;投资者们对于如何精准把握市场动态、实现资产稳健增长的需求愈发迫切。在这个背景下&#xff08;市值管理飞//机//aishutuyu&#xff09;&#xff0c;Polygon市值机器人应运而生&#xff0c;作为一款基于Polygon公…

TriCore:Interrupt

今天简单总结下 TriCore 的中断路由模块。 名词缩写 缩写全称说明IRInterrupt Router SRService Request 包括&#xff1a; 1. External Resource 2. Internal Resource 3.SW&#xff08;Software&#xff09; SPService Privoder 包括&#xff1a; 1. CPU 2. DMA SRNServic…

【5分钟学会一个知识点】01.Elasticsearch基本操作-增删改查

目录 【5分钟学会一个知识点-探索现代搜索与分析引擎的魅力】01.Elasticsearch基本操作-增删改查1.基本操作1.1索引操作1.2文档操作1.3查询1.4修改数据1.5查询1.5.1条件查询1.5.1.1遍历所有的索引1.5.1.2查询某个索引1.5.1.3条件查询1&#xff1a;使用GET url传参数1.5.1.4条件…

proteus数模转换器DAC0832的应用

proteus proteus&#xff0c;即EDA工具软件。Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能&#xff0c;还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步&#xff0c;但已受到…

油泼辣子在食品类别可以申请成商标不!

前阵韩国人在美国申请“chili crunch”油泼辣子作为商标&#xff0c;还准备禁止华人餐馆使用投诉侵权并索赔&#xff0c;普推知产老杨在USPTO上面检索发现&#xff0c;这个人申请的主要是30类方便食品的调味品&#xff0c;商标分类是全球通用的。 商标名称不能申请本类所属的通…

C++的数据结构(三):栈

栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构&#xff0c;它只允许在一端&#xff08;称为栈顶&#xff09;进行插入和删除操作。栈的这种特性使得它在解决函数调用、括号匹配、表达式求值等问题时具有天然的优势…

Linux下多线程相关概念

thread 1.什么是线程1.1 线程优缺点1.2 线程异常1.3 线程用途 2. 进程和线程区别3. 线程控制3.1 POSIX线程库3.2 pthread_create()3.3 线程ID3.4 线程ID地址空间布局pthread_self() 3.5 线程终止pthread_exit函数pthread_cancle函数 3.6 线程等待3.7 分离线程__thread修饰全局变…

【安全每日一讲】加强数据安全保护 共享数字化时代便利

前言 数据安全是数据治理的核心内容之一&#xff0c;随着数据治理的深入&#xff0c;我不断的碰到数据安全中的金发姑娘问题&#xff08;指安全和效率的平衡&#xff09;。 DAMA说&#xff0c;降低风险和促进业务增长是数据安全活动的主要驱动因素&#xff0c;数据安全是一种资…

Django项目之电商购物商城 -- 修改/删除收货地址/设置默认地址

Django项目之电商购物商城 – 修改/删除收货地址/设置默认地址 修改和删除收货地址依旧实在user应用下进行 , 其思路和新增收货地址非常相似 依旧是更具前端的数据来写 在这里修改和删除地址的URL是相同的 , 所以我们只要设置一个模型类就可以实现这两个功能 一 . 修改地址…

apk反编译修改教程系列-----反编译apk 去除软件强制更新的八种方式步骤解析【十七】

安卓有的apk 软件会不断更新。但有些用户需要旧版的有些功能或者新版功能增减原因等等。需要不更新继续使用。这类问题有的可以简单修改版本号来跳过更新。或者有的软件可以忽略。但对于某些无法跳过更新界面等等的apk。就需要深度反编译来去除软件的强制更新。 通过课程可以了…