如何使用git

首先,需要了解git大致原理:

image

分为四个区域:

  • 工作区(即Workspace) 工作区,就是你平时存放项目代码的地方, 就是指 我们在本地编辑代码的地方

  • 暂存区(即Index/Stage) 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息, 是 为了防止误操作而建立的一个区

  • 本地库(即Repository) 仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本, 是 用于管理历史版本的区域

  • 远程仓库(即Remote) 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换, 是 放置在远端的协作库(即github或gitlab上的远程库)

在此基础上,再对其他操作做阐述

clone远程库

在电脑上创建一个文件夹a,并在该文件夹a中右键打开git bash

$ git clone https://xxx.git

再输入用户名(注册账号时英文的username)以及密码即可

此步骤后,本地仓库获得远程库中的数据,并连接到远程库。

上传本地仓库内容

在完成上述步骤后,应该确保文件夹a中有.git文件夹,该文件夹存在代表已经连接远程库。但连接之后,对于所有在工作区(即文件夹a)中文件的改动,还需要经过一系列操作才能上传到远程仓库(gitlab中的项目仓库)

添加到本地暂存区index

$ git add .

以上操作将本地仓库中的所有已经改变(包括:增减改动)的文件均上传到暂存区,等待进一步地操作

添加到本地库

$ git commit -m "备注信息"

将远程库与本地进行同步并拉取

进行这一步的原因是:

①当项目无需采取多分支结构进行协同开发时,仅需推送到一个主分支上即可,后续有需求也可开多分支。

②确保每次本地的开发者是从最新版本开始进行开发的

以下操作是为了解决在一个分支上时:本地库与远程库的同步问题【在进行推送之前进行同步与拉取是必须的操作】

$ git pull origin <分支名称> 
#此处的分支名称是指本地分支的名称,必须是gitlab远程库中已经存在的分支才行
//如在此项目中使用main分支:git pull origin main

查看所有本地分支:git branch -v

推送到远程库

$ git push -u origin <远程库分支名称>
#某本地分支首次推送必须带-u【这是因为第一次需要建立本地分支与远程分支之间的追踪关系】,后续再进行push就可以不用带了
//如此项目中:git push -u origin main

查看推送记录:git log

# 如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数
$ git push --force origin “远程分支名称” #但是一般进行pull同步操作后都不会发生有差异的情况了

就此完成一次推送,还可以通过 git status 检查文件状态

Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过 git add xxx(文件名) 后状态将变为Staged。

Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改(指被用户修改内容), 而变为Modified. 如果使用 git rm --cached xxx(文件路径) 移出版本库, 或者 直接清空暂存区 rm .git/index ,通过以上两个方式操作后文件则成为Untracked文件。

Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过 git add xxx(文件名)可进入暂存staged状态, 使用 git checkout 则丢弃修改过的内容, 返回到Unmodify状态, 此处的 git checkout 即从库中取出文件, 覆盖当前修改过后的内容 !

Staged: 暂存状态. 执行 git commit -m "信息备注" 则将修改同步到本地库中, 这时本地库中的文件和工作区文件又变为一致, 文件为Unmodify状态. 执行 git reset HEAD xxx(文件名) 取消暂存, 文件状态将变为Modified。

回退版本

首先,需要先将项目对应的 分支保护解除,解除之后才能将本地回退后的版本推送到远程仓库上。

在此处开启/解除某一分支的保护:

image-20240601020340337

查看版本情况

//此命令用于查看git的提交记录,但不能查看已经删除的记录
$ git log

一条提交日志项结构如下:

image-20240601021904562

可以看到:

当我们在如图所示master分支上时【即HEAD -> master】:我们看到的是master分支上的文件提交记录相关信息

( HEAD可以理解为一个指针,指向的是 目前的版本 )

每一项显示的是一个提交对象(commit)的详细信息,包含以下字段:

  • commit xxxxxxxxxx

    xxxxxxxxxx是该提交的SHA-1 hash值,用于唯一标识这个提交。

  • (HEAD -> master, origin/master, origin/HEAD)

    • HEAD -> master: 表示此提交是本地master分支的末端

    • origin/master: 表示此提交也是远程origin仓库的master分支末端

    • origin/HEAD: 表示此提交也是远程origin仓库的HEAD所指向的提交

  • Author: skym1 < xxxxxxxx @qq.com >

    这显示了该提交的作者名称和邮箱

  • Date: Tue May 2 17:15:54 2023 +0000

    这是该提交的时间

  • Initial commit

    这是该提交的提交注释(commit message)

    所以,每一项就包含了一个提交对象的所有基本属性,以及该提交在本地和远程仓库中的位置信息。

进行回退操作

有以下几种不同情况下的回退操作命令,根据情况进行选择:

  • git reset --hard

    对于 已修改 或 暂存 ,但未提交文件的回退

  • git reset --hard origin/master

    对于 已提交,但未推送的版本回退

  • git reset --hard HEAD^git push -f

    这两条命令是进行已提交且推送的回退,这两个操作比较常用

    git reset --hard HEAD^:先回退到上一个版本;

    git push -f:强制推送,覆盖远程分支(若想要强制推送并覆盖远程分支必须先解除相应的分支保护

    上面的--hard可以替换成其它的恢复等级,如:mixed、soft

    视具体情况而定:

    • --soft

      仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。

    • --mixed

      仅将HEAD指向恢复,已经add的暂存区也会丢失掉,工作空间的代码不变。

    • --hard

      一切全都恢复,HEAD指向变,add的暂存区消失,代码也恢复到以前状态。

回退的几种方式:

$ git reset --hard head #当前版本
$ git reset --hard HEAD^ #回退到上一个版本
$ git reset --hard HEAD^^ #回退到上上一个版本
$ git reset --hard HEAD~3 #回退到往上3个版本
$ git reset --hard xxx #直接回退到索引xxx对应的版本(更常用于生产环境)

回退后,可使用 git reflog 查看所有分支下的所有操作的记录,每一项第一个元素即 版本索引

找到想要回退的索引号,就能保证能够回退到对应版本,所以要求在commit时,一定要备注好信息,才能更好地辨识出版本。

也可以直接用远程仓库的代码直接覆盖本地的仓库:

$ git fetch —all #仅下载远程库的内容,不做任务的合并
$ git reset —hard orgin/master  #git resetHEAD指向刚刚下载的最新版本(master可以修改成其它要覆盖的分支)
$ git pull 

分支管理

在高级的git协同开发中,使用分支进行开发是必要的。

创建并切换本地分支

在项目目录中执行以下命令创建并切换到新分支

$ git checkout -b <新分支名>

#等效于以下的两个命令
$ git branch <新分支名称>
$ git checkout <分支名称>

随着分支的切换,本地仓库中的文件夹中也切换为 新创建分支上的文件

查看本地/远程分支

一些查看本地/远程分支的命令:

$ git branch #查看本地分支
$ git branch -v #查看本地分支+提交该本地分支时的备注信息
$ git branch -vv #查看本地分支+提交该本地分支时的备注信息+本地分支和远程分支的追踪关系(蓝色)
$ git branch -vv -a #查看本地分支+提交该本地分支时的备注信息+本地分支和远程分支的追踪关系(蓝色)+远程分支(红色)

注意:需要将本地的分支与远程库中的对应分支需要建立追踪关系

一般来说,有三种方式建立:

①手动建立追踪关系 $ git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名>

②push时建立追踪关系 $ git push -u <远程主机名> <本地分支名> 加上-u参数,这样push时,本地指定分支就和远程主机的同名分支建立追踪关系。

③新建分支时建立跟踪关系 $ git checkout -b <本地分支名> <远程主机名>/<远程分支名> 新分支指针指向 <远程主机名>/<远程分支名> 所指的位置。具体位置可用 git log --oneline --graph 查看。

更改、提交、同步、推送

更改、add、commit、pull、push见 上传本地仓库 章节

分支合并

在进行团队多分支开发时,在各分支中不同模块的开发结束之后,需要将各个分支中的内容合并到主分支中,这时通常有两个方式:

  • 提交 pull request,通过代码审验后合并到 master 分支

  • 在本地 master 分支上合并后再 push 到远端的 master 分支

在此,仅介绍第二种方式:

比如我们想要将 master 分支合并到 main 分支,需要先切换到将 main 分支上,

$ git checkout main

再将 master 分支合并到 main 分支上,

$ git merge master

再解决冲突并且确认没有 bug 后(以上操作都是本地操作)

再将本地的main分支提交到远端,

$ git push  #之前已经进行了追踪,直接push即可

分支清理

完成合并后,就可以将没用的 master 分支删除。删除分支也有两种方式:

  • 在远端和本地分别删除 master 分支

  • 在本地删除 master 分支后推送到远端

在此,介绍第二种方式:

先删除本地分支,

$ git branch -d  <本地分支名称>

再删除该本地分支远程库中对应的分支,

$ git push origin -d <远程分支名称>