Git下载与配置

Git安装

windows

https://git-scm.com/downloads

Git管理

Git原理图与简介

image

workspace​——工作区

Index​——缓存区

Repository​——本地仓库

Remope​——远程仓库

Git是一个什么工具,为什么使用Git?开始时候的我,一开始以为是Git就是Github等平台用来分享源码的工具。现在发现这个认识是完全不正确的。Git一言以蔽之就是一个版本管理工具,它可以记录你每一次保存文件对文件的修改,以便于你随时吃后悔药回退到某个版本中。这个功能对于开发而言是非常重要的。

实现这样的功能,Git使用了3个存储空间,分别是workspace​工作区、Index​缓存区(或索引区)、Repository​本地仓库。workspace​是你进行文件编辑的工作空间,就好比你上班时工作的桌面,你可以在你的工作桌面上书写或者修改一份一份的文件;Index​是你的暂时存放文件的一摞文件堆,你可以把workspace​写好或修改好的一份或者多份文件放到这个文件堆中,这个操作叫做add​;当你完成一次工作,就可以把Index​中的一摞文件打包成一个文件夹,打上一个标签记录你修改了做了什么,这个操作叫做commit​,然后放进一个柜子里,这个柜子叫做一个分支,Repository​就是管理这个柜子的仓库。

我们每次工作——新建、删除、修改文件,最终都以一次次commit​的形式存储到Repository​的分支中,每次commit​都有一个指针地址,称为commit_id​,它按照从近到远的时间顺序排序起来,我们可以随时回退到某个版本。

还有一个空间Remote​是远程仓库,它的结构和本地仓库是一样的,我们通过一些指令可以将本地仓库与远程仓库进行同步。

Git连接远程仓库操作

1. 远程仓库给本地授权

  1. 本地创建SSH key

    使用命令ssh-keygen -t rsa -C "myemail@example.com"​,然后一路回车即可
    然后在用户目录(Windows系统在C盘的user对应用户名目录下)可以找到id_rsa​(私钥)和id_rsa.pub​(公钥)两个文件
    Clip_2024-02-09_16-24-46

  2. 登陆GitHub,打开Setting​,选择SSH and GPG Keys​页面,然后New SSH key

    Clip_2024-02-09_16-26-02

    下面的Title随便写,key中填写id_rsa.pub​中的公钥内容

    Clip_2024-02-09_16-39-28

    这一步相当于在远程Remote上记录一下你的密钥,你在本地提交的时候只有远程仓库有记录,才能提交成功

2. 添加并初始化本地仓库

先在本地仓库运行git init​初始化本地仓库,init​就是初始化的意思

然后运行git add .​将本地仓库中的所有文件添加到缓存区,其中.​表示所有文件,这个指令的意思是把所有文件添加到缓存区。当然我们也可以利用git add file.md​只添加一个file.md​文件。

接着运行git commit -m"第一次提交代码"​,将缓存区中的文件记录提交给仓库,其中-m​表示提交的说明,为必填,每次提交代码我们都要进行提交说明,这是必要的。

再使用下面的方法进行关联远程仓库并进行第一次代码推送push。

3.1 添加远程仓库

  1. 创建远程仓库

    这里的步骤就不说了,可以用Github也可以用Gitee等

  2. 在本地关联远程仓库

    git remote add origin git@github.com:sumruler/yourRepo.git

    这里的origin​是远程库在本地的标记名字,通常习惯起名origin​,而git@github.com:sumruler/yourRepo.git​是远程仓库的地址,换成仓库中SSH下的字段

    Clip_2024-02-09_16-40-10

    然后你可以运行一下git remote -v​,就可以查看与远程仓库关联的信息

  3. 进行第一次代码提交

    在本地仓库运行git push origin master:main

    这里的命令结构是git push <远程仓库名> <本地仓库分支>:<远程仓库分支>
    master​是本地仓库的分支,当你运行git init​的时候,默认创建了这个分支,main​是Github远程仓库的分支,当你在Github上创建仓库的时候,默认创建了这个分支。如果远程仓库分支和本地仓库分支相同的时候可以省略后面,直接运行gut push origin​的,不过Github把主分支的名字改成了main​,所以给Github提交的时候要加上这个。

    还有一个办法是将git init​初始化的时候默认分支名称设置为main​,方法是修改.gitconfig​文件,地址在用户根目录(Windows系统在C盘的user对应用户名目录下)下,加入下面代码并保存:

    # vim ~/.gitconfig
    [init]
            defaultBranch = main

    Clip_2024-02-09_17-18-23

    第一次提交的时候,会出现这样的提示:

    Clip_2024-02-09_17-08-46

    意思是告诉你这个远程连接信息从来没有被记录过,确定记录下来并进行链接吗?这时候输入yes​然后敲回车就可以了

    你还可能会遇到这样的问题,push的时候被rejected了,这是由于远程仓库和本地仓库出现了冲突(比如远程仓库README.md这个文件和本地仓库不一样等等),这时候你可以git pull​一下,查看冲突的文件处理完冲突以后再重新push​,更加简单的你可以在git push​命令后面加上--force​这个命令,即git push --force origin master:main​,来进行强制推送,覆盖掉远程仓库的文件(第一次提交,远程仓库也没什么重要东西,直接覆盖就好了)

    如果是新建立一个项目,在本地并没有任何文件,或者想从远程仓库克隆一个项目,可以使用下面的3.2 从远程仓库克隆的方法

3.2 从远程仓库克隆

  1. 在某个目录下打开终端(Win系统可以在文件夹下按住Shift加鼠标右键,选择powershell,或者在窗口的地址栏输入cmd回车),运行git clone <仓库地址>​,例如git clone https://github.com/sumruler/typora-theme-phycat.git​拉取远程仓库

    Clip_2024-02-09_17-58-59

    仓库地址可以是HTTPS​下的,也可以是SSH​下的

  2. 运行cd <仓库名>​例如cd typora-theme-phycat​进入远程仓库

  3. 运行code .​(前提是安装了VScode)用VScode打开仓库,然后你就可以操作文件了。

Git版本控制

Git最强大的功能之一就要版本控制,你每次修改文件做提交的时候,Git会记录你修改(包括新增、删除、修改)了什么,得益于此你可以随时回退到被记录的任意一个版本。你有必要回顾一下前面介绍的这部分。

Git原理图与简介

Git提交

git add <文件名>​--将工作区的更改放到缓存区

例如,我们更改了README.md这个文件,就可以使用git add README.md​将该文件的更改放到缓存区。如果你更改了多个文件,可以使用git add .​一次性将所有更改放到缓存区。.​就表示所有更改。

git commit -m"<描述>"​--将缓存区的更改整合到本地仓库

-m"<描述>"​这个选项是必须要跟的,一般在开发过程中记录下来每个版本修改了什么是非常有必要的

git push <远程仓库名> <本地仓库分支>:<远程仓库分支>​--将本地仓库推送到远程仓库

我们之前进行了第一次远程提交,后面做完每次修改运行一下这个命令,就可以把本地仓库同步到远程仓库中。远程仓库名为origin​可以省略不写,如过本地仓库分支和远程仓库分支同名,可以省略不写。

Git提交记录和版本回退

git log​--查看本地仓库所有历史版本

在本地仓库下使用git log​命令查看所有的版本,运行后你会看到类似的结果:

Clip_2024-02-09_19-58-04

git reset --hard <commit_id>

使用git reset --hard <commit_id>​就可以把当前的workspace​、Reposity​都回退到这个版本,例如我可以使用git reset --hard 5b161​来回退到之前那个版本。commit_id​不需要写全,写前几位git就可以找到。

也可以用HEAD^​、HEAD^^​、HEAD^^^​、HEAD~100​来代替commit_id​,表示上一个、上上个、上上上个、往上100个。

git reflog​--查看所有操作记录

你可能会有这样的一个疑问,我回退了以后,回退之前的版本还有吗?如果我回退之后后悔了怎么办?怎么找到回退前那个版本的commit_id​。

Git还有个命令,我们可以使用git reflog​来查看你的命令记录,运行后你会看到:

Clip_2024-02-09_20-25-47

这里最前面的字符就是commit_id

Git分支操作

git-brance

主分支master​或者main​,往往是正式版本,它应该永远代表最稳定的一个版本。当开发进行中时,在main​分支上进行操作,让main​变得不稳定了,这时候我们就可以利用分支功能。

前面我们把Repository​比喻成管理柜子的仓库,分支就是一个一个的柜子。为了解决上面的问题,我们可以另外开一个柜子,叫做dev​,这个操作叫做branch​。然后我们在dev​上做开发,开发没问题了,再把dev​上地最后记录,合并到main​上,这个操作叫做merge​。我们还可以再开一些柜子,叫做bug1​,这些柜子专门用来解决各种各样的bug,没问题了再合并。我们还可以开一个Feature​,用来开发新功能。

总之,为了让主分支main​保持纯净,我们就用各种各样的分支来解决各种各样的问题。

Git分支的创建、管理与合并

git branch <分支名>​--创建分支
git branch​--查看所有分支
git switch <分支名>​或git checkout <分支名>​--切换到某个分支
git checkout -b <分支名>​或git switch -c <分支名>​--创建分支并立即切换到这个分支
git branch -d <分支名>​--删除某个分支
git merge <分支名>​--合并目标分支到当前分支

例如我们想把dev​分支合并到main​分支上,需要先使用git switch main​切换到主分支,然后运行git merge dev​将dev​分支合并到当前main​分支上

Git合并分支的冲突解决