Git详解

Git详解

  • 认识Git
    • Git的组成
      • 三个区域
      • 二大类,四种状态
    • Git add所做的操作
    • Git commit所做的操作
    • 分支(branch)
    • 标签Tag
  • Git checkout的作用
    • 创建分支
    • 切换分支
    • 切换提交快照
    • 撤销更改
  • Git安装
    • Linux版本
      • yum源方式安装
      • 编译方式安装
    • Windows
  • Git命令使用
    • 比较文件异同
    • 查看历史版本
    • 版本回滚
    • 远程仓库相关操作
    • 分支相关操作
    • git相关配置
    • 标签
  • Git快速上传数据到GitHub

认识Git

Git操作的终极结果:

让工作区中的文件都处于最初“未修改”的状态。

未修改(Unmodified)工作区中文件的内容和 Git仓库中文件的内容保持一致

版本库文件如果工作区文件一致时,文件状态描述是nothing to commit ,working tree clean

在Git中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。它具有以下特性:

  • 断网后依旧可以在本地对项目进行版本管理
  • 联网后,把本地修改的记录同步到云端服务器即可

获取git仓库的2种方式

  • 将尚未进行版本控制的本地目录转换为Git仓库
1.在项目目录中,通过鼠标右键打开“Git Bash'
2.执行 git init 命令将当前的目录转化为Git仓库
  • 从其它服务器克隆一个已存在的Git仓库(暂时不表述)

以上两种方式都能够在自己的电脑上得到一个可用的 Git仓库。

Git初始化

git init 命令在项目的根目录下创建.git子目录来保存版本信息。

执行 git init 命令之后,会在项目文件夹中生成一个.git文件夹,Git 管理项目的每一次记录,都在这个文件夹里面保存着。所以这个文件夹不能删除;对于一个项目来说,git init 只需要执行一次

没有初始化,就使用Git将会报如下错误

fatal: not a git repository (or any of the parent directories): .git

Git的组成

三个区域

  • 工作区(Working tree)
  • 暂存区(Staging area)
  • 版本库 (Repository)

二大类,四种状态

未被git管理

  • 未跟踪(Untracked)不被Git 所管理的文件 即该文件所在目录未被git init

已被git管理

  • 已修改(Modified):工作区中的文件内容和Git仓库中的文件内容不一致
  • 已暂存(Staged):工作区中被修改的文件已被放到暂存区,准备将修改后的文件保存到Git仓库中
  • 未修改(Unmodified):工作区中文件的内容和 Git仓库中文件的内容保持一致

Git详解_第1张图片

注意:

  • 工作区的文件被修改了,但还没有放到暂存区,就是已修改状态。
  • 如果文件已修改并放入暂存区,就属于已暂存状态。
  • 如果Git仓库中保存着特定版本的文件,就属于已提交状态。

除工作区外,暂存区,版本库为空,此时状态为modified

Git详解_第2张图片

使用git add命令提交后,暂存区缓存文件,版本库为空 此时状态为已暂存(staged)

Git详解_第3张图片

使用git commit把暂存区的所有修改提交到版本库,并清空暂存区此时状态为(Unmodified)

Git详解_第4张图片

Git add 跟踪新文件

文件前面状态为红色??的文件可以使用git add进行跟踪,跟踪完成后该文件状态标记变为绿色A

语法

追踪单个文件
git add 文件名

追踪所以文件
git add .

Git commit 提交更新

将暂存区中的文件提交到Git仓库中进行保存

语法

git commit -m "文件描述"
git commit -a -m "文件描述"		# 跳过缓存区操作,直接把工作区内容提交到本地仓库

查看文件状态

git status

使用【git commit 】将文件提交到版本库,工作区和版本库一样,此时为未修改状态,可使用git status查看版本库状态

对已提交到版本库的文件进行修改,还未提交到暂存区的文件标志是红色M(Modified)(工作区和版本库有差异时为红M)

对已提交到版本库的文件进行修改,还未提交到版本库的文件标志是绿M(暂存区和版本库有差异时为绿M)

撤销工作区文件:git checkout

撤销对文件的修改指的是:把对工作区中对应文件的修改(清空工作区内容),还原成Git仓库中所保存的版本。相当于系统的回滚。

操作的结果:所有的修改会丢失,且无法恢复!危险性比较高,请慎重操作!

此处的操作为取出版本库的内容覆盖工作区内容。保持版本库和工作区内容一致。

Git add所做的操作

1.保存对象

将一个文件现有的内容压缩成二进制文件,并保存到Git中。该压缩文件叫做Git对象,保存在.git/objects目录中

# git hash-object -w filename
[root@git Myporject]# git hash-object -w test.txt
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

Git详解_第5张图片

如上图所示,objects目录下又多出了一个子目录,而且这个子目录名是生成哈希值的前两个字符。在这个子目录下有一个文件,文件名是上述哈希值中其余的38个字符

查看空文件内容

[root@git Myporject]# cat .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
xKˉOR0`	°
[root@git Myporject]# git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

image-20230712225040888

上述代码输出的文件内容是一些二进制字符。你可能会问既然test.txt是空文件,又怎么会有这些内容呢?这是因为该二进制对象中还存储了一些元数据

添加文件内容再次查看

[root@git Myporject]# echo 'hello world' > test.txt
[root@git Myporject]# git hash-object -w test.txt
3b18e512dba79e4c8300dd08aeb37f8e728b8dad

[root@git Myporject]# git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
hello world

Git详解_第6张图片

2.更新索引

当文件保存成二进制对象以后,你需要告诉Git哪个文件发生了变化。

Git会在一个名叫“索引”(或阶段)的区域记录所有发生了变化的文件。然后等到所有的变更都结束后,将索引中的这些文件一起写入正式的版本历史记录中。

[root@git Myporject]# git update-index --add --cacheinfo 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt

Git详解_第7张图片

通过git add验证,确实是相当于执行了上面两个步骤。

Git详解_第8张图片

git add 指令执行后,在object目录中查看到原文件的git对象副本,并且查看副本内容,与原文件一致

Git详解_第9张图片

Git commit所做的操作

Git 了变化的文件信息。等到修改完成,所有这些信息都会被写入版本的历史记录中,这相当于生成一个当前项目的快照。

项目的历史记录由不同时间点的项目快照组成。Git可以将项目恢复成任何一个快照。在Git中“快照”有一个专门的术语,即“提交”(commit)。所以生成快照也可以称之为完成提交。

下列所有“快照”的引用指的都是提交。

(1)首先,在你保存快照的时候,Git需要记录是谁执行的提交,因此需要设置用户名和邮件地址。

git config --global user.name "xxx" 
git config --global user.email "[email protected]" 

Git详解_第10张图片

(2)接下来,保存现有的目录结构。

前面的保存对象指令只会保存一个文件,并不会记录文件之间的目录结构。

git write-tree命令可以根据当前目录结构生成一个Git对象。

[root@git Myporject]# git write-tree
e4960f7351e198cf6aa4be06059b14c8c77c382a

查看该Git对象的文件内容

所谓的快照就是保存当前的目录结构,以及每个文件相对应的二进制对象。

[root@git Myporject]# git cat-file -p e4960f7351e198cf6aa4be06059b14c8c77c382a
100644 blob 81c545efebe5f57d4cab2ba9ec294c4b0cadf672	a.txt
100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad	test.txt

(3)最后,把这个目录结构和一些元数据一起写入版本的历史记录中

git commit-tree可以将目录树对象写入到版本的历史记录中

[root@git Myporject]# echo "first commit" | git commit-tree e4960f7351e198cf6aa4be06059b14c8c77c382a
8857ce62953c6f8f158a1c47675f1322ac449edd

在上述代码中,在提交时,需要提供提交的描述,而且你可以通过echo "first commit"提供提交描述。git commit-tree命令会根据元数据以及目录树生成一个Git对象。

查看该Git对象的内容

[root@git Myporject]# git cat-file -p 8857ce62953c6f8f158a1c47675f1322ac449edd
tree e4960f7351e198cf6aa4be06059b14c8c77c382a
author zhangsan <[email protected]> 1689175947 +0800
committer zhangsan <[email protected]> 1689175947 +0800

first commit

第一行输出是对应于该快照的目录树对象。

第二行和第三行是有关作者和提交者的信息。

最后一行内容是提交的描述。

Git详解_第11张图片

查看某个快照(提交)的信息

[root@git Myporject]# git log --stat 8857ce62953c6f8f158a1c47675f1322ac449edd
commit 8857ce62953c6f8f158a1c47675f1322ac449edd
Author: zhangsan <[email protected]>
Date:   Wed Jul 12 23:32:27 2023 +0800

    first commit

 a.txt    | 1 +
 test.txt | 1 +
 2 files changed, 2 insertions(+)

Git详解_第12张图片

git checkout命令,我们可以切换到某个快照。

git checkout c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

git show命令,我们可以显示某个快照的所有代码变更。

git show c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

Git commit验证

git commit -m [message]
git commit [file1] [file2] ... -m [message]

(1)创建数据并提交

[root@git csdn-picgo]# touch b.txt
[root@git csdn-picgo]# echo b > b.txt 
[root@git csdn-picgo]# git add b.txt 
[root@git csdn-picgo]# git commit -m "add b.txt"

(2)查看提交的版本及具体内容

1.先查看历史版本
[root@git csdn-picgo]# git log --stat
commit 4fa6d215164bb44456f5c6d53e9001de9cefd4b0 (HEAD -> pictures)  			# 版本记录的hash值(最新版本)
Author: yuansetiankong <[email protected]>
Date:   Thu Jul 13 12:30:49 2023 +0800

    add b.txt

 b.txt | 1 +
 1 file changed, 1 insertion(+)

commit 90a9ccbb54ee0c4e0bf759b59880899aca912511 (tag: csdn-v1, tag: csdn, csdn/pictures) # 版本记录的hash值(上一个版本)
Author: yuansetiankong <[email protected]>
Date:   Thu Jul 13 01:52:24 2023 +0800

    CSDN图床

 a.txt    | 1 +
 test.txt | 1 +
 2 files changed, 2 insertions(+)

...

2.切换最新的快照(提交)
[root@git csdn-picgo]# git checkout 4fa6d215164bb44456f5c6d53e9001de9cefd4b0
Note: switching to '4fa6d215164bb44456f5c6d53e9001de9cefd4b0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false


3.查看快照信息
[root@git csdn-picgo]# git show 4fa6d215164bb44456f5c6d53e9001de9cefd4b0
commit 4fa6d215164bb44456f5c6d53e9001de9cefd4b0 (HEAD, pictures)
Author: yuansetiankong <[email protected]>
Date:   Thu Jul 13 12:30:49 2023 +0800

    add b.txt

diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..6178079
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+b

Git详解_第13张图片

分支(branch)

分支是快照的指针,分支的名字就是该指针的名字。虽然哈希值不可读,但是分支允许用户给快照起别名。另外,分支还会自动更新,如果当前分支是一个新的快照,那么这个指针会自动指向它。例如,主分支(master branch)有一个名为master的指针指向主分支当前的快照。

用户可以为任何快照创建新指针。例如,如果你想创建一个新的fix-typo分支,那么只需创建一个名为fix-typo的指针,并指向一个快照。因此,在Git中创建一个新分支非常容易,而且开销非常低。

Git有一个特殊的指针HEAD,它始终指向当前分支中最新的那个快照。另外,Git还提供了快捷方式。例如,HEAD^指向HEAD之前的快照(父节点),而HEAD~6指向HEAD之前的第六个快照。

每个分支的指针都是一个文本文件,存储在.git/refs/heads/目录中。文件的内容是它指向的快照的二进制文件名(哈希值)。

标签Tag

什么是Git标签?

Git标签是代码库的一个里程碑,通常用于标记代码库的特定版本或发布版本。

它可以是一个版本号、一个预发布版本或是其他重要的代码点。

在Git中,标签分为轻量标签和带注释的标签。

​ 轻量标签只是一个指向提交对象的引用,不包含任何元数据。

​ 带注释的标签则是一个独立的对象,包含了标签的名称、日期、标签描述等信息,以及指向提交对象的引用

为什么需要Git标签?

  1. 标记重要版本:通过为重要的版本打上标签,可以方便地回溯到该版本,进行问题排查和修复。
  2. 标记发布版本:对于需要发布的版本,打上标签可以方便地追踪和回溯发布记录。
  3. 管理依赖:当你的代码依赖于其他人的代码时,打上标签可以方便地管理依赖关系,确保你的代码能够正常运行。
  4. 分支管理:通过打标签,可以方便地将分支合并到主分支时进行校验,确保没有未解决的冲突。

Git checkout的作用

git checkout 命令用于创建、切换分支或恢复工作树文件。

创建分支

基于本地库

效果是:创建分支,并切换到该分支
git checkout -b 

单纯的创建分支:
git branch 

基于远程库

git checkout -b <new-branch> origin/<old-branch>

示例:以远程库中的 liang 分支为起点,在本地创建一个 dev 分支

git checkout -b dev origin/liang

基于指定标签创建分支

1.切换到标签对应的提交记录
git checkout <tagname>

2.创建并切换到新分支
git checkout -b <branch>

基于指定 commit id 创建分支

1.切换到指定提交记录
git checkout <commit id>

2.创建并切换到新分支
git checkout -b <branch>

切换分支

使用 checkout 切换分支时,先从本地库查找分支,在本地库没找到时,就去远程库中查找,在远程库也没有找到就会报错

git checkout <branch>

Git详解_第14张图片

重置分支

删除已存在的分支且重新创建,分支不存在也不会报错

git checkout -B 

切换分支后的提示信息

当我们切换到 master 分支后,出现这个提示说明: 本地分支和上游分支的最新提交记录是同一个

# 您的分支 “origin/master” 是最新的
Your branch is up to date with 'origin/master'.

将一个远程仓库中的分支 liang 签出到本地时的提示

# 本地库中的分支 liang 的上游分支是远程仓库中的分支 liang
Branch 'liang' set up to track remote branch 'liang' from 'origin'.
# 切换到了一个新的分支 liang
Switched to a new branch 'liang'

当本地库有了新的提交记录

# 本地分支比远程分支多了一次提交记录
# 可以使用 git push 将本地的提交记录推送到远程库
Your branch is ahead of 'origin/liang' by 1 commit.
(use "git push" to publish your local commits)

切换提交快照

git checkout命令,我们可以切换到某个快照。

git checkout c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

git show命令,我们可以显示某个快照的所有代码变更。

git show c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

撤销更改

用于让工作区中的文件回到最近一次 git addgit commit 的状态

# 让工作区中的某些文件撤销更改
git checkout -- <file1> <file2>

# 让工作区中的所有文件撤销更改
git checkout -- .

场景一、本地库中已有 某个文件,在工作区修改了该文件,但是没有提交到暂存区,此时撤销更改是从版本库中恢复内容

场景二、本地库中已有 某个文件,在工作区修改了该文件,并且已提交到暂存区,此时撤销更改是从暂存区中恢复内容

Git安装

Linux版本

Centos系列安装

yum源方式安装

安装旧版本

CentOS 7 光盘里软件包默认包含git 的安装包

[root@git ~]# sudo yum install git

Git详解_第15张图片

查看版本

[root@git ~]# git --version
git version 1.8.3.1

yum源方式安装新版本

另外的yum源参考:centos7.x yum源安装git2.x版本

# 纯下载rpm包需要解决依赖问题,而且还是循环依赖,还是配置软件仓库方便
1.配置yum源
# cat <<-EOF:那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。这可以解决由于脚本中的自然缩进产生的制表符
# <<- 必须连写;'EOF'必须带单引号
[root@git ~]# cat > /etc/yum.repos.d/wandisco-git.repo <<- 'EOF'
[wandisco-git]
name=Wandisco GIT Repository
baseurl=http://opensource.wandisco.com/centos/7/git/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
EOF


2.安装
[root@git ~]# yum install git

3.验证版本
[root@git ~]# git --version
git version 2.39.1

Git详解_第16张图片

编译方式安装

在Linux服务器上,如果git版本过低,使用的时候可能会由于低版本不支持遇到各种问题,比如Centos 7自带的 git版本一般是1.8.3.1的,比较旧,通常建议升级git后再使用。

1.安装依赖包

[root@git ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc -y

2.安装编译器

[root@git ~]# yum install gcc perl-ExtUtils-MakeMaker -y

3.下载git源码

[root@git data]# wget https://github.com/git/git/archive/refs/tags/v2.41.0.tar.gz
[root@git data]# ll -h
total 11M
-rw-r--r-- 1 root root 11M Jul 12 16:16 v2.41.0.tar.gz

git下载源码

官网:https://git-scm.com/
GitHub地址:https://github.com/git/git

Git详解_第17张图片

Git详解_第18张图片

4.安装git

[root@git data]# tar zxvf v2.41.0.tar.gz 
[root@git data]# cd git-2.41.0/
[root@git git-2.41.0]# make prefix=/usr/local/git all
[root@git git-2.41.0]# make prefix=/usr/local/git install

5.创建软连接

[root@git git-2.41.0]# rm -f /usr/bin/git		# 删除已经存在的旧链接
[root@git git-2.41.0]# ln -s /usr/local/git/bin/git /usr/bin/git

6.验证安装完成

[root@git git-2.41.0]# git --version
git version 2.41.0

Windows

直接在官网下载

Git详解_第19张图片

直接下一步即可

检查版本:打开Git Bash

image-20230712143729298

Git命令使用

比较文件异同

工作区与暂存区的差异

什么参数都不加的使用情況,比对的是「工作目录」与「索引」之间的差异。这是个很常用的指令,因为当你执行 git add . 指令之前,先通过 git diff 查看你自己到底改了哪些东西。

git diff 

Git详解_第20张图片

查看已经add 没有commit 的改动

git diff --cached

查看任意两个版本之间的改动:

git diff 版本号1 版本号2

比较两个版本号的src 文件夹的差异

git diff 版本号1 版本号2  src

工作区与某分支的差异

远程分支这样写:remotes/origin/分支名

git diff 分支名

Git详解_第21张图片

工作区与HEAD指针指向的内容差异

git diff HEAD

Git详解_第22张图片

  • git diff 提交id 文件路径 工作区某文件当前版本与历史版本的差异
  • git diff -stage 工作区文件与上次提交的差异(1.6 版本前用 -cached)
  • git diff 版本TAG 查看从某个版本后都改动内容
  • git diff 分支A 分支B 比较从分支A和分支B的差异(也支持比较两个TAG)
  • git diff 分支A…分支B 比较两分支在分开后各自的改动

查看历史版本

查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)

git log 

Git详解_第23张图片

查看最近多少次的提交记录

git log -p -次数 

Git详解_第24张图片

简略显示每次提交的内容更改

git log --stat 

Git详解_第25张图片

仅显示已修改的文件清单

git log --name-only 

显示新增,修改,删除的文件清单

git log --name-status 

让提交记录以精简的一行输出

git log --oneline 

Git详解_第26张图片

图形展示分支的合并历史

git log --oneline --graph --all 

Git详解_第27张图片

查询作者的提交记录(和grep同时使用要加一个-all-match参数)

git log --author=作者

列出提交信息中包含过滤信息的提交记录

git log --grep=过滤信息

和 -grep类似,S和查询内容间没有空格

git log -S查询内容 

查看某文件的修改记录

git log fileName 

版本回滚

当前版本: HEAD (指向master的一个指针叫HEAD)

上一个版本: HEAD^

上上个版本:HEAD^^

第100个版本:HEAD~100

切换上一个版本

git reset --hard HEAD^

切换到指定版本

git reset --hard db896  # commit id的前几位就可以

如果切换到旧版本,忘记了最新版本的commit id,使用命令:

git reflog

Git详解_第28张图片

远程仓库相关操作

Git详解_第29张图片

从远程仓库下载项目到本地

git clone [email protected]:<your_githubname>/<repository>.git

将远程仓库映射为映射为本地仓库的别名

git remote add <remoteaddress_aliasname> [email protected]:帐号名/仓库名.git

Git详解_第30张图片

删除远程仓库的别名

git remote rm name

image-20230713150233842

修改远程仓库的别名

git remote rename <old_name> <new_name>

image-20230713150434445

查看远程库映射信息:

git remote

显示所有远程仓库
git remote -v

image-20230713144154263

显示某个远程仓库的信息

git remote show 

示例:

[root@git csdn-picgo]# git remote show csdn
* remote csdn
  Fetch URL: [email protected]:yuansetiankong/csdn-picgo.git
  Push  URL: [email protected]:yuansetiankong/csdn-picgo.git
  HEAD branch: main
  Remote branches:
    main     tracked
    pictures tracked
  Local branch configured for 'git pull':
    pictures merges with remote pictures
  Local ref configured for 'git push':
    pictures pushes to pictures (up to date)

Git详解_第31张图片

上传数据到远程仓库

git push <remoteaddress_aliasname> <local_branchname>:<reomote_branchname>

如果当前所在分支和远端分支相同,可省略的写为:
git push <remoteaddress_aliasname> <local_branchname>

image-20230713143938605

拉取远程分支到本地仓库:

git checkout -b 本地分支 远程分支 					# 会在本地新建分支,并自动切换到该分支
git fetch origin 远程分支:本地分支 					# 会在本地新建分支,但不会自动切换,还需checkout
git branch -set-upstream 本地分支 远程分支		  	# 建立本地分支与远程分支的链接

同步远程仓库更新

git fetch origin master

分支相关操作

查看分支:

git branch

image-20230713122344512

创建并切换分支

git checkout -b dev  			# -b表示创建并切换分支

上面一条命令相当于一面的二条:
git branch dev  				# 创建分支
git checkout dev  				# 切换分支

image-20230713122547524

合并分支

分支文件中存储的是当前分支的最新一次提交的commitID,也就是版本号,而每一个版本号对应的 objects 文件中都存储着 parent 版本号(首次提交没有 parent),以此将版本串起来,每一个分支都有自己的串。

比如将分支A合并到分支B,其实就意味着使分支B和分支A的内容完全一致,那么要达到这个目的最快的方式就是将分支A中的最新的commitID复制到分支B的文件中,这样分支B也就拥有了分支A的串,就达到了合并的效果。

如果在合并的时候出现了冲突,需要手动编辑解决冲突,然后提交一个commit,但是分支A上还是之前的内容。
参考:git深入理解(九):git分支管理与应用

git merge dev 										# 用于合并指定分支到当前分支
git merge -no-ff -m "merge with no-ff" dev			# 加上-no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并

image-20230713123140343

删除分支

git branch -d dev

image-20230713123358329

查看分支合并图

git log --graph --pretty=oneline --abbrev-commit

Git详解_第32张图片

git相关配置

安装完Git后第一件要做的事,设置用户信息(global可换成local在单独项目生效)git config -global user.name "用户名" 				  # 设置用户名
git config -global user.email "用户邮箱"			 # 设置邮箱

git config -global user.name 						# 查看用户名是否配置成功
git config -global user.email 						# 查看邮箱是否配置

其他配置

git config -global -list 			# 查看全局设置相关参数列表
git config -local -list 			# 查看本地设置相关参数列表
git config -system -list 			# 查看系统配置参数列表
git config -list 					# 查看所有Git的配置(全局+本地+系统)
git config -global color.ui true 	# 显示git相关颜色

标签

打标签(默认为HEAD)

git tag <tag_name>

创建一个带有附注的标签,其中包含更详细的信息,如作者、日期和注释:
git tag -a <tag_name> -m "标签注释"

image-20230713131214378

给某个commit版本添加标签

git tag <tag_name> <version_number>

显示所有标签

git tag 
git tga -l

Git详解_第33张图片

显示某个标签的详细信息

git show 标签

推送标签到远程仓库

git push origin <tag_name>

image-20230713130344946

Git详解_第34张图片

Git详解_第35张图片

git初始化

[root@git data]# mkdir Myporject
[root@git data]# cd Myporject/
[root@git Myporject]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint: 	git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint: 	git branch -m <name>
Initialized empty Git repository in /data/Myporject/.git/


[root@git Myporject]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-merge-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── push-to-checkout.sample
│   ├── sendemail-validate.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

9 directories, 18 files

Git详解_第36张图片

更新分支

下面我们将演示如何更新分支。首先,修改test.txt。

$ echo "hello world again" > test.txt

然后保存二进制对象。

$ git hash-object -w test.txt

c90c5155ccd6661aed956510f5bd57828eec9ddb

接下来,将该对象写入索引,并保存目录结构。

$ git update-index test.txt
$ git write-tree

1552fd52bc14497c11313aa91547255c95728f37

最后,提交目录结构,并生成一个快照。

$ echo "second commit" | git commit-tree 1552fd52bc14497c11313aa91547255c95728f37 -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

785f188674ef3c6ddc5b516307884e1d551f53ca

在上述代码中,我们可以通过git commit-tree命令的参数-p来指定父节点,即以哪个快照为基础。

下面我们把快照的哈希值写入到.git/refs/heads/master文件中,并让master指针指向该快照。

$ echo 785f188674ef3c6ddc5b516307884e1d551f53ca > .git/refs/heads/master

现在,通过git log命令你可以看到两个快照了。

$ git log

commit 785f188674ef3c6ddc5b516307884e1d551f53ca (HEAD -> master)
Author: jam 
Date:   Sun Oct 7 13:38:00 2018 +0800

    second commit

commit c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
Author: jam 
Date:   Sun Oct 7 13:12:14 2018 +0800

    first commit

git log命令的运行过程大致如下:

  • 找到HEAD指针对应的分支。在上述示例中为master。
  • 找到master指针指向的快照。在上述示例中为785f188674ef3c6ddc5b516307884e1d551f53ca。
  • 找到父节点(即前一个快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa。
  • 等等,最后显示当前分支中所有的快照。

另外,上述我们曾提到分支指针是动态的,下述三个命令会自动覆盖分支指针。

  • Git commit:当前分支的指针将移动到新创建的快照上。
  • Git pull:在当前分支和远程分支合并后,指针会指向新创建的快照。
  • Git reset [commit_sha]:当前分支的指针将被复位到某个指定的快照上。

拉取远程库的数据,代码

拉取GitHub远程代码,无需先与远程建立建立

语法

git clone -b <branch> <url>    # -b 远程分支名称

示例:获取GitHub的项目中pictures分支的数据

[root@git Myporject]# git clone -b pictures https://github.com/yuansetiankong/csdn-picgo.git

image-20230713003750056

url为GitHub项目对应分支下的HTTPS路径

Git详解_第37张图片

Git详解_第38张图片

检验github中文件与拉取的内容一致

Git详解_第39张图片

Git的实际使用过程中,如果每次提交给远程仓库都使用链接的话,那会显得很长,且当有多个仓库在管理时,就会显得很麻烦。所以Git提供了一个给远程仓库重新起个简单的名字的操作,也叫做创建远程仓库,其实就是将本地的某个名字与远程的某个仓库对应起来。

语法

git remote add  

查看现有远程

git remote -v

修改名称

git remote rename  

修改名称对应的链接

git remote set-url  

删除本地的远程连接映射

git remote rm 

示例:

[root@git Myporject]# git remote add csdn https://github.com/yuansetiankong/csdn-picgo.git

Git详解_第40张图片

上传代码到远程仓库

语法

git push <远程主机名> <本地分支名>:<远程分支名>
git push csdn pictures:pictures

切换远程库的分支

[root@git csdn-picgo]# git checkout main
Switched to branch 'main'
Your branch is up to date with 'csdn/main'.

[root@git csdn-picgo]# ll
total 4
-rw-r--r-- 1 root root 12 Jul 13 00:40 README.md

[root@git csdn-picgo]# git checkout pictures
Switched to branch 'pictures'
Your branch is ahead of 'csdn/pictures' by 1 commit.
  (use "git push" to publish your local commits)
[root@git csdn-picgo]# ll
total 12
-rw-r--r-- 1 root root   5 Jul 13 01:14 a.txt
drwxr-xr-x 2 root root 131 Jul 13 01:14 csdn
-rw-r--r-- 1 root root  12 Jul 13 00:40 README.md
-rw-r--r-- 1 root root  12 Jul 13 01:14 test.txt

Git详解_第41张图片

用户信息配置

config 配置有system级别、global(用户级别)、和local(当前仓库)三个级别

查看git的配置列表

[root@git csdn-picgo]# git config --list

–global 表示全局的,即当前用户都有效,该配置会出现在 ~/.gitconfig 文件中,~表示当前用户的家目录

局部是只对当前仓库起效的,它的配置信息会在当前仓库根目录/.git/config文件下

Git快速上传数据到GitHub

使用 SSH 协议:SSH 协议比 HTTPS 协议更快,而且不需要输入账号密码,可以提高 push 速度。

1.生成SSH Key

[root@git csdn-picgo]# ssh-keygen -t rsa -C "[email protected]"   # [email protected]是在github上注册的那个邮箱
直接点回车,说明会在默认文件id_rsa上生成ssh key。
然后系统要求输入密码,直接按回车表示不设密码
重复密码时也是直接回车,之后提示你shh key已经生成成功

[root@git csdn-picgo]# ll /root/.ssh/
total 12
-rw------- 1 root root 1675 Jul 13 01:26 id_rsa
-rw-r--r-- 1 root root  399 Jul 13 01:26 id_rsa.pub

打开id_rsa.pub,复制里面的key。里面的key是一对看不懂的字符数字组合,不用管它,直接复制

GitHub设置

右上角点击头像,进入Account Settings

Git详解_第42张图片

2.设置用户邮箱

git config --global user.name xxxx
git config --global user.email [email protected]

3.下载上传代码

[root@git Myporject]# git clone -b pictures [email protected]:yuansetiankong/csdn-picgo.git

1.添加新文件到clone的项目里
[root@git Myporject]# cp a.txt csdn-picgo/
[root@git Myporject]# cp test.txt csdn-picgo/
[root@git Myporject]# cd csdn-picgo/

[root@git csdn-picgo]# ll
total 12
-rw-r--r-- 1 root root   5 Jul 13 01:51 a.txt
drwxr-xr-x 2 root root 131 Jul 13 01:51 csdn
-rw-r--r-- 1 root root  12 Jul 13 01:51 README.md
-rw-r--r-- 1 root root  12 Jul 13 01:51 test.txt

2.提交到本地仓库
[root@git csdn-picgo]# git add .
[root@git csdn-picgo]# git commit -m "CSDN图床"
[pictures 90a9ccb] CSDN图床
 2 files changed, 2 insertions(+)
 create mode 100644 a.txt
 create mode 100644 test.txt

[root@git csdn-picgo]# git remote -v
origin	[email protected]:yuansetiankong/csdn-picgo.git (fetch)
origin	[email protected]:yuansetiankong/csdn-picgo.git (push)
[root@git csdn-picgo]# git remote rename origin csdn
Renaming remote references: 100% (4/4), done.

3.上传到远程仓库
[root@git csdn-picgo]# git push csdn pictures:pictures
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 373 bytes | 373.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:yuansetiankong/csdn-picgo.git
   d968abc..90a9ccb  pictures -> pictures

Git详解_第43张图片

Github验证

Git详解_第44张图片

使用https时,总是链接不上,报TCP 链接错误,或者输用户名密码,显示权限不允许

image-20230713021100014

Git详解_第45张图片

参考:

git初始化和基础概

git checkout 命令详解

git常用命令

20 分钟教你搞懂 Git!

git远程仓库分支的各命令的具体解析(git remote add)

Git使用教程,最详细,最傻瓜,最浅显,真正手把手教

你可能感兴趣的:(git,github)