type
Post
status
Published
date
Jul 8, 2024
slug
git
summary
一个简单方便的、免费开源的分布式版本控制系统,简单了解一下git的使用方法及其命令语句
tags
工具
git
category
技术分享
icon
fa-solid fa-file
password

1. Git 基本使用

1.1 创建 ssh key

.pub 后缀文件内容添加到 GitHub 或 Gitee 的 ssh 管理库中,这样我们的机器就已经实现了和远端 ssh 链接的能力,但是要想使用还需要配置一下 config 文件。

1.2 拉取与创建仓库

有几种方式获取一个 Git 仓库。一种是从网络上或者其他地方拷贝一个现有的仓库,另一种就是在一个目录中创建一个新的仓库。
  1. 创建一个本地仓库:git init。该命令可以将一个目录转变成一个 Git 仓库。
  1. 克隆一个远程仓库:git clone git@github.com:<用户名>/<仓库名>.git <本地目录>

    1.3 全局与本地配置

    1. 全局配置
      1. 全局配置对所有项目的当前用户可用,并存储在 ~/.gitconfig 文件下。可以通过传递选项 --global 使 git 从 Global 读取和写入,如下。
      2. 全局配置
        1. 删除全局配置
        1. 本地配置
          1. 本地配置仅适用于当前存储库(文件夹)。您可以通过传递选项 --local 使 git 从本地读取和写入。
            一般不会用,除非你电脑上有多个 GitHub / Gitee 账号需要配置,每个账号下又有各自的仓库,此时就可以用到本地配置,以防在 123@qq.com 账号的仓库中留下 456@gmail.com 的提交信息,甚至提交失败。
          2. 首先进入项目的根目录,也就是 .git 所在的文件夹
            1. 配置本地
              1. 或者

          1.4 配置 config 文件(选)

          该文件在 ~/.ssh/config,可以使多个 GitHub / Gitee 账号在同一电脑上共存。
          接下来做一点简单的解释,如下是使用 ssh 连接到远端服务器的一个命令:
          在这里,我们想要连接到 Github,就需要改变 UsergitHostNamessh.github.com
          那么 Host 是什么?
          我将其称之为 HostName 的别名,还是上面那段命令 ssh root@localhost -p 22 ,是不是有点长?若是服务器没有域名只有 IP ,那么一堆无规则的数字一般不太好记。只要我们配置了 UserHostName,那么就可以使用 ssh 别名 来实现连接。
          IdentityFile 是私钥的文件地址,如果我们使用 ssh root@localhost -p 22 来远程连接 ,那么还需要输入密码,每次都这样非常麻烦,而有了私钥和公钥就可以省去这一过程。
          注:#1.6.3 关联远程仓库也同样适用

          1.5 测试连接

          有别名的写别名,没别名的写 github.comgitee.com,返回 Hi xxx! ... 则说明成功,如下。
          notion image

          1.6 Git 操作流程

          说明:
          • workspace:工作区
          • staging area:暂存区/缓存区
          • local repository:本地仓库
          • remote repository:远程仓库
          notion image
          一般修改文件后提交就三个命令:git add .git commit -m ""git push -u origin main。如下查看具体说明。

          1.6.1 基本操作:

          命令
          说明
          git init
          初始化仓库
          git clone
          拷贝一份远程仓库,也就是下载一个项目
          git add .
          添加已修改文件到暂存区
          git status
          查看仓库当前的状态,显示有变更的文件
          git diff
          比较文件的不同,即暂存区和工作区的差异
          git commit -m "修改xxx文件"
          提交暂存区到本地仓库,并注释
          git commit --amend
          修改上一个提交的注释信息,详情请看#2.5
          git reset --hard <版本号>
          回退版本。版本号用 git log --online 查看
          git rm
          将文件从暂存区和工作区中删除
          git mv
          移动或重命名工作区文件
          git branch
          查看所有分支
          git checkout <分支名>
          分支切换
          git merge <分支名>
          合并分支,先切换为主分支
          git rebase <分支名>
          分支变基
          git switch
          更清晰地切换分支
          git restore
          恢复或撤销文件的更改

          1.6.2 提交日志:

          命令
          说明
          git log
          查看历史提交记录
          git log --online
          查看版本记录
          git blame <file>
          以列表形式查看指定文件的历史修改记录

          1.6.3 远程操作:

          以下 git@github.com 也可以更换为 别名git@别名
          命令
          说明
          git remote -v
          查看关联的远程库
          git remote remove origin
          取消关联的远程库
          git remote add origin git@github.com:<用户名>/<仓库名>.git
          关联远程仓库
          git remote set-url origin git@github.com:<用户名>/<仓库名>.git
          修改 https 通道为 ssh
          git fetch
          从远程获取代码库
          git pull
          下载远程代码并合并
          git push -u origin main
          上传远程代码并合并
          git push origin <标签名>
          上传远程标签
          git push -f origin main
          强推,删除远仓所有文件,将本地文件全推上去,慎用!!

          2 功能详解

          2.1 分支

          2.1.1 分支概念

          分支是 git 的一个重要特性,它可以让开发人员从主线上分离出来,在一个独立的线路上继续开发,最后可以灵活的选择合并分支,还是丢弃分支。用一个生活中的例子,来理解分支:
          比如我们正在写一本小说,这本小说的当前内容就像是 git 中的 master 分支,现在我们有几个新的想法,比如:新的角色、新的剧情,但不确定这些是否最终一定出现在故事里,所以我们可以这样做:
          1. 可以为每个新的想法,创建一个新的笔记本(一个笔记本就相当于 git 中的一个新分支)
          1. 每个笔记本(分支)中都可以自由地探索想法,且不会搅乱你的当前内容(master 分支)
          1. 当我们觉得一个剧情线非常好,并且想要将其包含在故事中时,就会把那个笔记本的内容(分支)合并到你的当前内容(master 分支)中。
          1. 如果某个想法实验失败,可以选择抛弃那个笔记本(相当于 git 中的删除分支),且这个过程不会影响当前内容(master 分支)

          2.1.2 创建分支

          • 使用 git branch xxx 可以创建分支;
          • 使用 git checkout xxx 可以更改分支,其中 xxx 是分支名字。
            • 创建完分支后,分支并不是空的,而且保留了 master 分支当前所有的提交记录。
          Caution
          1. 切换分支前,最好把当前分支管理好,即最好进行:addcommit 操作。
          1. 切换分支后,工作区、暂存区、会受到影响,具体为:
              • 工作区:会变为切换到的分支的最后一次提交的状态
              • 暂存区:同上,且如果暂存区有未提交的更改,那这些更改会被带到新分支的暂存区上。
              比如:在 test 分支对 1.txt 文件进行了暂存,没提交,随后切换到 master 分支时,1.txt 文件会自动加在 master 分支的暂存区

          2.1.3 合并分支

          将两个分支的历史合并在一起,gti 会创建一个新的 " 合并提交 ",所有的分支和合并点都会被保留在历史中,有完整的历史记录。
          notion image

          2.1.4 分支变基

          将一个分支(test)上的提交重新应用到另一个分支(master)上,变基会重写项目历史,因为它实际上是在创建一系列新的提交,会产生一个更线性的历史记录,看起来更干净、更简单。
          notion image

          2.1.5 游离分支

          git checkout 也可以将代码签出到指定版本,即可以执行 git checkout <具体版本号>,当签出到指定版本时,签出的代码出于一个游离分支中,如下图操作。
          notion image
          游离分支上可以对代码进行版本控制,但要注意:一旦从游离分支切走,游离分支的提交不会交给任何一个分支,所以对于游离分支我们的原则是:
          1. 尽量不修改游离分支的代码(只是看一看某个版本的代码)。
          1. 若确实需要修改游离分支代码,应该从当前游离分支,创建出一个新的分支,随后去修改。
          1. 若修在游离分支上发生了提交,随后从游离分支切走了,就要使用 reflog 寻找游离分支的提交。

          2.2 tag(标签)

          在 Git 中,标签(Tag)是用来指向特定提交的引用,通常用于标记项目中的重要点,比如版本发布。标签分为两种类型:
          1. 轻量标签(Lightweight)
            1. 轻量标签只是简单地指向一个提交,不包含其他信息,创建轻量标签不会存储任何额外的信息。
          1. 附注标签(Annotated)
            1. 附注标签存储了额外的信息,例如:标签名、标签信息、创建者名字、电子邮件、创建日期等。因为它们包含了更多的信息,附注标签更适用于公共或正式发布的场合,比如软件版本的发布。

          2.2.1 创建标签

          命令
          作用
          git tag 标签名 版本号
          给指定提交打轻量标签。不写:最新
          git tag -a 标签名 版本号 -m " 标签描述 "
          给指定提交打附注标签。不写:最新
          git tag
          查看标签
          git show 标签名
          查看标签信息
          git tag -d 标签名
          删除标签
          git push origin 标签名
          提交标签

          2.3 GitFlow

          GitFlow 是团队开发的一种最佳实践,将代码划分为以下几个分支
          notion image
          分支
          含义
          master
          主分支,只保存正式发布的代码。
          develop
          开发分支,开发者的编写的代码最终要出现在这个分支。
          hotfix
          线上 bug 修复分支,修复完毕后要合并回 master 和 develop 分支,同时在 master 分支上打一个 tag。
          feature
          功能分支,当开发某个功能时创建一个单独的分支,开发完毕后再合并到 dev 分支。
          release
          待发布分支,Release 分支基于 Develop 分支创建,在这个 Release 分支上测试。

          2.4 Git 三区位置

          notion image

          2.5 修改提交

          git commit --amend 命令可以修改最近一次提交,它可以:
          1. 重新编辑上次的提交信息。
            1. 如果在一次提交后,意识到提交信息有误或不够详细,可以使用 git commit --amend 来重新编辑上次提交信息
          1. 将新的更改添加到上次提交中。
            1. 如果在一次提交后,意识到忘记将某文件提交了,可以先使用 git add . 将这些遗漏的更改添加到暂存区,然后通过 git commit --amend 将它们添加到上一个提交中。

          2.6 忽略文件

          在项目开发过程中有些文件不应该存储到版本库中,这个时候配置忽略这些文件。 git 中需要创建一个文件 .gitignore 文件来设置忽略,.gitignore 文件与 .git 目录同级,常用规则如下:
          内容
          含义
          temp
          忽略任何路径下的名为 temp 的文件、文件夹。
          *.log
          忽略任何路径下以.log 结尾的文件。
          /dist
          忽略根目录下的 dist 文件,不会忽略其他目录下的 dist 文件

          3. 报错

          3.1 git error:invalid path

          git pull 的时候报错 git error:invalid path
          原因:
          解决办法:
          进入仓库目录打开 Git Bash:
          再重新 pull 原分支:

          3.2 Permission denied (publickey)

          git clonessh -T git@github.com 的时候报错 git@github.com: Permission denied (publickey)
          解决办法:
          然后提示:
          接着再输入:
          • 注意,如果出现错误提示:
            • 请执行命令:eval ssh-agent -s 后,继续执行命令 ssh-add ~/.ssh/id_rsa,这时候一般 OK 了。
          最后将 id_rsa.pub 的内容复制到 GitHub 账号,输入 ssh -T git@github.com 测试,出现 Hi xxx 则成功。

          3.3 kex_exchange_identification: read: Software caused connection abortbanner exchange: Connection to 20.205.243.166 port 22: Software caused connection abort

          去 ~/.ssh/config 文件中把 HostName 修改为 ssh.github.com

          3.4 Connection closed by 180.76.199.13 port 443

          请注意,Gitee 和 Github 的端口可能不一样,Github 使用的是 443 端口,Gitee 使用的还是 22 端口,因此要注意 config 文件中端口是否配置正确,或者取消端口配置。
          notion image
          相关文章
          共情是人类最伟大的情感JVM内存优化
          Loading...