目 录CONTENT

文章目录

Git 笔记

Nicholas
2023-09-15 / 0 评论 / 0 点赞 / 58 阅读 / 34886 字

版本说明:本文最后更新于2023-09-15,详细更新记录参见文末表格。

若链接或图片失效,对文中内容有任何疑义和勘误意见,欢迎留言反馈。

精选程度:★★★★★|博文状态:已完结|本地标签:是


Git笔记

本文是关于Git的使用方法笔记。git是一个开源的分布式版本控制系统,也是目前最普遍使用的版本控制系统,次之的主流版本管理系统还有SVN

尤其是协同开发的时候,开发者共同开发一个项目,每个人分别写不同的代码,然后把代码汇总到一起,并且相互需要彼此写的代码。这就需要版本控制系统,把大家写的代码存储到一个地方进行统一管理。

〇、相关教程

【Git官网链接】https://git-scm.com/

【Git官方文档】https://git-scm.com/docs

【Git教程 | 菜鸟教程】(推荐)https://www.runoob.com/git/git-tutorial.html

【Git教程 | 莫烦Python】(不推荐)https://mofanpy.com/tutorials/others/git/

一、Git下载安装

1.1、Git下载安装

GitLinux/UnixMacWindows平台上均支持运行。

官网下载git安装包:https://git-scm.com/download/win

【注意】点击安装后会跳转到github相应库中下载,可能需要VPN连接。

20230915171558_544854.png

20230915171558_565834.png

双击安装,按照默认选项,直接一直点击下一步,安装完毕即可。

20230915171559_550597.png

20230915171558_581188.png

通过git version命令可以查看当前安装的git版本。

20230915171558_596768.png

1.2、Git配置

Git提供了一个叫做git config的工具,专门用来配置或读取相应的工作环境变量。

它们可能存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。

  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。

  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。

【注】每一个级别的配置都会覆盖上层的相同配置,例如.git/config里的配置会覆盖 /etc/gitconfig中的同名变量。

在 Windows 系统上,可以看到配置文件在如下位置。

20230915171558_612655.png

1.2.1、用户信息配置

配置个人的用户名称和电子邮件地址。

git config --global user.name "Nicholas Cool"
git config --global user.email "nico@email.com"
 
git config user.name   # 查看当前用户名
git config user.email  # 查看当前用户邮箱

【注】如果用了**--global**选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

如果要在某个特定的项目中使用其他名字或者电邮,只要去掉--global选项重新配置即可,新的设定保存在当前项目的.git/config文件里。

1.2.2、查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令。

git config --list

1.2.3、编辑配置文件

git config -e    # 针对当前仓库
git config -e --global   # 针对当前用户所有仓库
git config -e --system   # 针对系统上所有仓库

二、Git基础概念

先来理解下Git工作区、版本库和暂存区概念:

  • 工作区: 就是你在电脑里能看到的目录。
  • 版本库: 工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库。
  • 暂存区: 英文叫stageindex。一般存放在**.git**目录下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

20230915171558_628750.png

对于该图的解释(部分解释请先阅读后续内容):

  • 标记为"master" 的是master分支所代表的目录树,此时 "HEAD" 实际是指向master分支的一个"游标"。所以图示的命令中出现HEAD的地方可以用master来替换。
  • 图中的objects标识的区域为Git的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作**git commit**时,暂存区的目录树写到版本库(对象库)中,master分支会做相应的更新。即master指向的目录树就是提交时暂存区的目录树。
  • 当执行**git reset HEAD**命令时,暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。
  • 当执行**git rm --cached <file>**命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行**git checkout .** 或者**git checkout -- <file>**命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
  • 当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

三、Git工作流程

Git的工作就是创建和保存你项目的快照及与之后的快照进行对比。

20230915171558_644636.png

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

3.1、创建仓库

3.1.1、git init命令

Git使用**git init命令来初始化一个Git仓库。Git的很多命令都需要在Git的仓库中运行,所以git init**是使用Git的第一个命令。

git init   # 初始化当前目录为 Git 仓库
git init newrepo   # 初始化指定目录为 Git 仓库

初始化后,会在目标仓库下生成一个名为.git的目录,该目录包含了Git需要的资源的所有元数据,其他的项目目录保持不变。

3.1.2、git clone命令

使用**git clone**从现有的远程Git仓库中拷贝项目(包括所有分支和历史记录等)。

git clone <repo_url>    # 克隆Git仓库
git clone <repo_url> <directory>    # 克隆Git仓库到指定的目录

在已有项目的基础上做修改,一般流程如下。

  • 克隆Git资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改和提交。
20230915171559_566784.png

例如,要克隆Ruby语言的Git代码仓库Grit,并设置新建的项目目录名称为mygrit。可以用下面的命令:

git clone git://github.com/schacon/grit.git mygrit

# 如果使用git协议无法连接,可以换成https协议
git clone https://github.com/schacon/grit.git mygrit

20230915171558_660032.png

3.2、基本操作

3.2.1、git add命令

**git add**命令可将该文件的修改添加到暂存区。

通过运行**git add**命令,你可以告诉Git哪些文件的修改应该包含在下一次提交(commit)中。

git add [file1] [file2] ...   # 添加一个或多个文件到暂存区
git add [dir]     # 添加指定目录到暂存区,包括子目录
git add .         # 添加当前目录下的所有文件到暂存区

例如添加demo.py文件。

20230915171558_675405.png

通过git status命令查看当前仓库的状态。此时可以看到demo.py属于**Untracked状态**。

20230915171558_691318.png

通过git add demo.py命令将该文件添加到git管理中。再次查看当前仓库状态。

20230915171558_706504.png

3.2.2、git status命令

**git status**是一个用于查看Git仓库当前状态的命令。

**git status**命令会列出所有新增或修改过的文件,可以查看在上次提交之后是否有对文件进行再次修改。

git status命令会显示以下信息:

  • 当前分支的名称。
  • 当前分支与远程分支的关系(例如,是否是最新的)。
  • 未暂存的修改:显示已修改但尚未使用git add添加到暂存区的文件列表。
  • 未跟踪的文件:显示尚未纳入版本控制的新文件列表。

上述初步使用了git status命令。也可以使用-s参数查看简略信息。

例如,下图所示信息表明:

  • 文件demo.py的修改已经add到了暂存区。
  • 文件tool.py的修改在上次add到缓存区后又有改动。
  • 文件readme.md暂未仍处于untracked状态。

20230915171558_722176.png

全部再次add到缓存区,再次检查结果如下。

20230915171559_582311.png

删除tool.py文件,查看status结果如下。

20230915171558_737578.png

再次更新到缓存区,最终显示结果如下。

20230915171558_752678.png

3.2.3、git diff命令

git diff命令比较文件的不同,即比较文件在工作区和暂存区的差异。

  • 尚未缓存的改动(暂存区和工作区的差异):git diff [file]
  • 查看已缓存的改动(暂存区和上一次commit的差异):git diff --cached/git diff --staged
  • 查看已缓存的与未缓存的所有改动(工作区和上一次commit的差异):git diff HEAD
  • 显示摘要而非整个 diff:命令最后添加**--stat**参数
  • 显示两个commit之间的差异:git diff <commit1> <commit2>,即如何从commit1变化到commit2
  • 查看当前工作目录与某个特定提交之间的差异:git diff <commit>,此命令以指定的<commit>作为基准。

【注】Untracked状态的文件不会显示在diff结果中。


首先对demo.pyreadme.py文件均做出修改。通过git diff查看差异。

20230915171558_768533.png

将修改add到缓存区后,通过git diff --cached查看暂存区和上次commit差异。

20230915171559_598179.png

通过git commit -m "first commit"提交后,再次查看差异,发现没有了。

20230915171558_784222.png

3.2.4、git commit 命令

git commit命令将暂存区内容添加到本地仓库中。

# 提交暂存区的全部文件到本地仓库
git commit -m "[descriptive message]"

# 提交暂存区的指定文件到本地仓库
git commit [file1] [file2] ... -m "[descriptive message]"

【注】**-a**参数设置修改文件后不需要执行git add命令,直接来提交(将工作区提交到本地仓库,但注意不包含Untracked文件)。

git commit -am "[descriptive message]"

20230915171558_800346.png

如果你没有设置-m选项,Git会尝试为你打开一个编辑器以填写提交信息。 如果Git在你对它的配置中找不到相关信息,默认会打开vim

此时再执行git status,以下输出说明我们在最近一次提交之后,没有做任何改动,是一个 "working directory clean",即干净的工作目录。

20230915171558_816255.png

通过git log命令可以查看各次提交的日志信息。

20230915171558_831656.png

通过git commit --amend --no-edit可以将当前的修改文件并入到上一个Commit中而不是新开一个Commit

3.2.5、git reset命令

git reset命令用于将仓库中的HEAD和分支引用移动到不同的位置。这个命令通常用于撤销之前的提交、取消已经暂存的更改或者重新设置工作目录和暂存区状态。

git reset [--soft | --mixed | --hard] <commit>

**--mixed**为默认,可以不用带该参数。这个命令会将HEAD指针和当前分支的引用移到指定的提交(commit),并且会重置暂存区,但不会更改工作目录的内容。这样,之前的add的更改会被取消暂存,需要重新添加到暂存区,然后再提交。

git reset --mixed <commit>

# 举例如下
git reset HEAD             # 取消已缓存的内容
git reset HEAD^            # 回退所有内容到上一个版本  
git reset 26c8a81          # 回退到指定版本

--soft 参数,这个命令会将HEAD指针和当前分支的引用移到指定的提交(commit),但不会更改工作目录或索引(暂存区)的内容。这意味着之前提交到暂存区的更改会保存。

git reset --soft <commit>

# 举例如下
git reset --soft HEAD~3   # 回退上3个版本 

--hard 参数,这个命令会将HEAD指针和当前分支的引用移到指定的提交(commit),并且会重置暂存区和工作目录的内容,使它们与指定提交的内容完全一致。这个命令会永久丢失工作目录中未提交的更改,慎用。

git reset --hard <commit>

# 举例如下
git reset --hard HEAD~3  # 回退上3个版本
git reset –-hard 26c8a81  # 回退到某个特定提交
git reset --hard origin/master # 将本地的状态回退到和远程的一样 

如果你只想回退暂存区中特定文件到某个commit的状态,可以使用这个命令。它将指定文件从暂存区移除,但保留工作目录中的更改,让你可以重新暂存它们或者撤销它们。

git reset <commit> <file>

# 举例如下
git reset HEAD hello.php   # 取消 hello.php 文件暂存区的内容
git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本

HEAD 说明:

  • HEAD 表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本,以此类推...
  • HEAD~0 表示当前版本
  • HEAD~1 上一个版本
  • HEAD^2 上上一个版本,以此类推...

例如,修改12.txtdemo.py文件。

20230915171558_847036.png

使用git reset HEAD后,即取消了缓存区的内容。

20230915171558_862950.png

3.2.6、git rm命令

git rm命令用于删除文件。

git rm <file>  # 将文件从暂存区和工作区中删除(相当于手工删除后,git add <file>)

# 如果删除之前修改过并且已经放到暂存区域的话,则需要用强制删除选项 -f
git rm -f <file>

20230915171558_878464.png

20230915171558_893631.png

如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可(相应文件会变成Untracked状态):

git rm --cached <file>

20230915171558_908837.png

可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件。

git rm -r <folder>   # 递归删除
git rm -r *          # 删除当前目录下的所有文件和子目录

3.2.7、git mv 命令

git mv命令用于移动或重命名一个文件、目录或软连接。

git mv [file] [newfile]

# 如果新文件名已经存在,但还是要覆盖它,可以使用 -f 参数
git mv -f [file] [newfile]

20230915171558_924639.png

3.4、提交日志

Git 提交历史一般常用两个命令:

  • git log:查看历史提交记录。
  • git blame <file> :以列表形式查看指定文件的历史修改记录。

3.4.1、git log命令

在使用Git提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用**git log**命令查看。

**git log**命令用于查看Git仓库中提交历史记录。

git log 显示了从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。

git log [选项] [分支名/提交哈希]

常用的选项包括:

  • -p:显示提交的补丁(具体更改内容)。
  • --oneline:以简洁的一行格式显示提交信息。
  • --reverse:逆向的顺序输出。
  • --graph:以图形化方式显示分支和合并历史。
  • --decorate:显示分支和标签指向的提交。
  • --author=<作者>:只显示特定作者的提交。
  • --since=<时间>:只显示指定时间之后的提交。
  • --until=<时间>:只显示指定时间之前的提交。
  • --grep=<模式>:只显示包含指定模式的提交消息。
  • --no-merges:不显示合并提交。
  • --stat:显示简略统计信息,包括修改的文件和行数。
  • --abbrev-commit:使用短提交哈希值。
  • --pretty=<格式>:使用自定义的提交信息显示格式。
  • -<数字>:限制显示的提交信息条数。

使用git log命令示例输出如下。

20230915171558_940198.png

我们可以用 --oneline 选项来查看历史记录的简洁的版本。

20230915171558_955479.png

我们可以用 --graph 选项,查看历史中什么时候出现了分支、合并。现在我们可以更清楚明了地看到何时工作分叉、又何时归并。

20230915171558_971448.png

我们可以用 --reverse 参数来逆向显示所有日志。

20230915171558_987449.png

如果只想查找指定用户的提交日志可以使用命令:git log --author。 例如,比方说我们要找Git源码中Nicholas Cool提交的部分:

git log --author="Nicholas Cool" --oneline

20230915171559_002970.png

如果要指定日期,可以执行几个选项:--since--until,也可以用--before--after

# 查看 Git 项目中 1 天前其在 9月11日之后 的所有提交
git log --before={1.days.ago} --after={2023-09-11}

20230915171559_018229.png

3.4.2、git blame命令

**git blame**命令用于逐行显示指定文件的每一行代码是由谁在什么时候引入或修改的。

**git blame**可以追踪文件中每一行的变更历史,包括作者、提交哈希、提交日期和提交消息等信息。

如果要查看指定文件的修改记录可以使用 git blame命令,格式如下:

  git blame [选项] <文件路径>
  • 常用的选项包括:

  • -L <起始行号>,<结束行号>:只显示指定行号范围内的代码注释。

  • -C:对于重命名或拷贝的代码行,也进行代码行溯源。

  • -M:对于移动的代码行,也进行代码行溯源。

  • -C -C-M -M:对于较多改动的代码行,进行更进一步的溯源。

  • --show-stats:显示包含每个作者的行数统计信息。

使用git blame命令示例输出如下。

20230915171559_034195.png

只显示指定行号范围内的代码注释:

git blame -L <起始行号>,<结束行号> <文件路径>

3.4.3、git show命令

git show命令用于显示Git仓库中的提交(commit)或对象(object)的详细信息,包括提交的元数据和更改的内容。该命令通常用于查看特定提交的详细信息。

以下是 git show 命令的基本用法:

git show <commit>

其中 <commit> 是要查看的提交的标识符,可以是提交的哈希值、分支名、标签名等。

3.3、分支管理

几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

20230915171559_049667.png

有人把Git的分支模型称为必杀技特性,而正是因为它,将Git从版本控制系统家族里区分出来。

当你切换分支的时候,Git会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

3.3.1、git branch命令

git branch命令可用于查看可用的分支和标签,创建分支等。

1、查看可用分支和标签:

以下命令可以让你列出可用的本地分支和标签,以便快速选择要切换的目标:

git branch

2、创建分支:

git branch <branchname>

3、删除分支:

注意需要不在此分区下时,才能执行删除操作。

git branch -d <branchname>

3.3.2、git checkout命令

**git checkout**命令用于在不同的分支之间切换、恢复文件、创建新分支等操作。

注意:git checkout命令在Git 2.23版本后引入了git switchgit restore命令,分别用于分支切换和文件恢复,以提供更清晰的语义和错误检查。如果你使用较新的Git版本,可以考虑使用这些命令代替git checkout

1、切换分支:

以下命令允许你从当前分支切换到指定的分支<branch-name>

git checkout <branch-name>

# 例如将工作目录切换到主分支
git checkout master

2、创建新分支并切换:

以下命令用于创建一个新分支<new-branch-name>并立即切换到新创建的分支:

git checkout -b <new-branch-name>

# 例如创建一个名为 feature-branch 的新分支并切换到它
git checkout -b feature-branch

3、切换到前一个分支:

以下命令可以让你快速切换回前一个分支,无需记住分支名称:

git checkout -

4、切换到标签:

如果你有一个标签<tag-name>,你可以使用这个命令来切换到该标签所指向的提交状态。

git checkout tags/<tag-name>

5、检出文件:

以下命令可以将指定文件<file>恢复到最新的提交状态,丢弃所有未提交的更改,这对于撤销不需要的更改非常有用:

git checkout -- <file>

6、切换到特定提交:

你可以使用提交的哈希值<commit-hash>来切换到特定的提交状态。这将使你进入"分离头指针"状态,只能查看历史记录,而不能进行分支操作。通常情况下,不建议在分离头指针状态下工作,因为更改可能会丢失。

git checkout <commit-hash>

如下示例所示。

20230915171559_613840.png 20230915171559_628966.png 20230915171559_644913.png 20230915171559_660701.png

使用git checkout [commit-id] -- demo.py可以让单个文件返回某个commit的状态。

例如使用如下操作,此时会发现demo.py的内容已经改变到4560d7ecommit状态下了。

20230915171559_675953.png

3.3.3、git switch命令(Git 2.23引入)

**git switch**命令用于更清晰地切换分支。

**git switch**命令作用与git checkout类似,但提供了更清晰的语义和错误检查。

git checkout 不同,git switch更容易理解和使用,因为它专注于分支切换的操作,此外,git switch还提供了更好的错误检查,可以避免一些常见的错误操作。

注意:git switchGit 2.23 版本引入的一个新命令,如果你使用的是Git的旧版本,可能无法使用git switch命令,但你仍然可以使用git checkout进行相同的操作。

1、切换分支:

以下命令允许你从当前分支切换到指定的分支<branch-name>

git switch <branch-name>

# 例如将工作目录切换到主分支
git switch master

2、创建新分支并切换:

如果你想同时创建一个新分支并切换到该分支,可以在**git switch命令后面加上-c--create**选项,然后指定分支名称。

以下命令用于创建一个新分支 <new-branch-name> 并立即切换到新创建的分支:

git switch -c <new-branch-name>

# 例如创建一个名为 feature-branch 的新分支并切换到它
git switch -c feature-branch

3、切换到前一个分支:

以下命令可以让你快速切换回前一个分支,无需记住分支名称:

git switch -

4、切换到标签:

如果你有一个标签<tag-name>,你可以使用这个命令来切换到该标签所指向的提交状态:

git switch tags/<tag-name>

3.3.4、git restore命令(Git 2.23引入)

**git restore**命令用于恢复或撤销文件的更改。

**git restore**命令作用包括还原文件到最新提交的状态、丢弃未暂存的更改、丢弃已暂存但未提交的更改等。

git restore的目标是提供一种更直观、易于理解的方式来管理文件的状态,它的引入使得Git用户能够更容易地处理不同阶段的更改,从而提高了工作流的效率。

注意:git restoreGit 2.23版本引入的一个命令,如果你使用的是较早版本的Git,可能无法使用git restore命令,但你仍然可以使用git checkout等命令来进行类似的操作。

1、还原文件到最新提交的状态

以下命令可以将指定文件<file>恢复到最新的提交状态,丢弃所有未提交的更改:

git restore <file>

这个命令对于撤销不需要的更改非常有用。

2、还原文件到暂存区的状态

如果你已经使用git add将文件添加到暂存区,但希望撤销这些更改,可以使用这个命令:

git restore --staged <file>

以上命令将文件<file>恢复到暂存区的状态,但不影响工作目录中的文件。

3、还原全部更改

以下命令将还原所有未提交的更改,包括工作目录和暂存区的更改:

git restore .

使用这个命令要谨慎,因为它会清除所有未提交的修改。

4、还原文件到指定提交的状态

如果你想将文件<file>恢复到特定提交 <commit>的状态,可以使用以下命令:

git restore --source=<commit> <file>

这个命令在需要查看历史状态或将文件还原到历史版本时非常有用。

5、交互式还原:

以下命令允许你以交互方式选择要还原或保留的更改:

git restore -i

执行这个命令它会打开一个交互式界面,让你选择如何处理每个更改。

3.3.2、git merge命令

git merge命令用于合并分支。

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用git merge命令将任何分支合并到当前分支中去。

首先新建一个仓库,用于演示分支操作。

20230915171559_064865.png

此时通过git branch命令查看,只有master分支,且当前位于master分支。再次在此分支上进行两次新的提交。

20230915171559_080678.png

20230915171559_096243.png

创建一个分支testing

git branch testing

20230915171559_111767.png

在当前分支新建一个文件test.txt

20230915171559_127551.png

查看此时的提交(commit)记录图。可以看到master分支的指针和testing分支的指针。

20230915171559_143357.png

我们用 git checkout (branch) 切换到我们要修改的分支。此时会发现test.txt文件已经消失了,因为回到了testing分支的commit的状态。

git checkout testing

20230915171559_159427.png

testing分支下提交两次新的commit

20230915171559_175012.png

我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

git checkout -b newtest

20230915171559_190422.png

此时查看git log --graph,可以看到当前的完整路径。并且路径上有两个commit分别是testing分支和newtest分支的最后提交。

20230915171559_205765.png

分支合并

此时尝试将newtest分支合并到主分支。

20230915171559_221419.png

再次查看当前的提交历史图,如下图所示。

20230915171559_237035.png

合并完就可以删除分支了。实际上,可以看出,删除分支只是删除了指向该分支最后一次提交的指针,并没有删除提交的历史记录。

20230915171559_253176.png

合并冲突

合并并不仅仅是简单的文件添加、移除的操作,Git也会合并修改。

首先创建分支conflict,并切换到该分支。

20230915171559_268602.png

新增一个conflict.txt文件。

20230915171559_284563.png

切换回master分支,也新建一个conflict.txt文件,但内容不同,提交修改。

20230915171559_299989.png

此时尝试将conflict分支合并过来。

20230915171559_315277.png

打开文件,发现conflict.txt文件已经变成如下所示。

20230915171559_331070.png

20230915171559_347161.png

手动处理冲突文件后,使用git add命令告诉Git文件冲突已解决。

20230915171559_363069.png

20230915171559_378944.png

查看此时的提交历史图,如下所示。

20230915171559_394367.png

3.4、Git标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用git tag 给它打上标签。

比如说,我们想为我们的项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交(HEAD)打上v1.0的标签。

-a 选项意为"创建一个带注解的标签"。 不用-a选项也可以执行的,但它不会记录这标签是啥时候打的、谁打的,也不会让你添加标签的注解。 推荐一直创建带注解的标签。

git tag -a v1.0

当你执行git tag -a命令时,Git会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。或者使用下面的命令:

git tag -a v1.0 -m "first tag for demo"

此时可以看到标签的信息。

20230915171559_409740.png

如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。

例如,假设在上述实例中,我们发布了提交01fc424,但是那时候忘了给它打标签。 我们现在也可以:

git tag -a v0.2 -m "add the tag" 01fc424

20230915171559_425531.png

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

20230915171559_441630.png

3.5、.gitignore文件

按照如下格式编写.gitignore文件,可以保持相应文件Untracked状态。

logs/
*.notes
pattern*/

3.6、远程仓库

Git并不像SVN那样有个中心服务器。

目前我们使用到的Git命令都是在本地执行,如果你想通过Git分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。例如使用Github或者Gitee作为远程仓库。

20230915171559_457362.png

3.6.1、git remote命令

**git remote**命令用于用于管理 Git 仓库中的远程仓库。

**git remote**命令提供了一些用于查看、添加、重命名和删除远程仓库的功能。

以下是git remote命令的常见用法:

  • git remote:列出当前仓库中已配置的远程仓库。
  • git remote -v:列出当前仓库中已配置的远程仓库,并显示它们的URL。
  • git remote add <remote_name> <remote_url>:添加一个新的远程仓库。指定一个远程仓库的名称和URL,将其添加到当前仓库中。
  • git remote rename <old_name> <new_name>:将已配置的远程仓库重命名。
  • git remote remove <remote_name>:从当前仓库中删除指定的远程仓库。
  • git remote rm <remote_name>:从当前仓库中删除指定的远程仓库。
  • git remote set-url <remote_name> <new_url>:修改指定远程仓库的URL。
  • git remote show <remote_name>:显示指定远程仓库的详细信息,包括URL和跟踪分支。

**git remote -v**可以查看当前仓库中配置的远程仓库列表以及它们的 URL。可以看到此时还没有配置任何远程仓库。

20230915171559_472625.png

我们从远程克隆一个Git仓库,查看其信息。其中,origin为远程地址的别名。

20230915171559_488348.png

通过git remote show命令显示某个远程仓库的信息:

git remote show https://github.com/tianqixin/runoob-git-test

20230915171559_504077.png

添加远程版本库:

git remote add <alias> <remote_url>
  • <alias>:要添加的远程仓库的名称。通常,远程仓库的名称为 origin,但你也可以自定义一个名称。
  • <remote_url>:远程仓库的 URL。它可以是一个指向远程 Git 仓库的 HTTPSSSHGit 协议链接。

添加远程仓库后,你就可以使用其他Git命令与远程仓库进行交互,例如推送本地代码到远程仓库、拉取远程仓库的代码等。

3.6.2、git fetch命令

**git fetch**命令用于从远程获取代码库。该命令执行完后需要执行git merge 远程分支到你所在的分支。

git fetch [<远程仓库>] [<远程分支名>]

20230915171559_519343.png

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行**git fetch [alias]告诉Git去获取它有你没有的数据,然后你可以执行git merge [alias]/[branch]**将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

例如,在Github上点击" README.md" 并在线修改它。

20230915171559_534711.jpg

然后在本地更新修改。

$ git fetch origin
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:tianqixin/runoob-git-test
   0205aab..febd8ed  master     -> origin/master

以上信息"0205aab..febd8ed master -> origin/master" 说明master分支已被更新,可以使用以下命令将更新同步到本地:

$ git merge origin/master
Updating 0205aab..febd8ed
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

再次查看本地的README.md文件,会发现已经更新了修改。

3.6.3、git pull命令

**git pull**命令用于从远程获取代码并合并本地的版本。

**git pull其实就是同时实现了git fetchgit merge FETCH_HEAD**的功能。

git pull [<远程仓库>] [<远程分支名>:<本地分支名>]

例如:

# 获取 origin/master 分支,再与本地的 brantest 分支合并
git pull origin master:brantest

# 获取 origin/master 分支,再与本地的 master 分支合并
git pull origin master

3.6.4、git push命令

git push 命令用于从将本地的分支版本上传到远程并合并。

git push <远程仓库> <本地分支名>:<远程分支名>

# 如果本地分支名与远程分支名相同,则可以省略远程分支名
git push <远程仓库> <本地分支名>

举例如下:

# 将本地的 master 分支推送到 origin 主机的 master 分支
git push origin master
# 相等于
git push origin master:master

如果本地版本与远程版本有差异,但又要强制推送可以使用--force参数:

git push --force origin master

删除主机的分支可以使用--delete参数,以下命令表示删除origin主机的master分支。

git push origin --delete master

四、更多命令

4.1、统计commit总数

git rev-list --all --count

Q & A

暂无

更新记录

时间修改内容
2023-09-15首次发布版本
0

评论区