Git基本操作的全流程介绍及实践

这篇文章主要介绍的是git基本操作,包括创建新仓库、克隆仓库、提交、创建分支、拉取、查询仓库项目变动情况和仓库融合等内容。

创建新仓库

创建新仓库的命令如下:

git init .

命令解释git init命令用于创建一个新的仓库,后面跟的“.”是指在当前路径创建一个git仓库,在实际使用过程中可以把“.”换成自己的路径。

动手实践:创建一个名为remoterepo的仓库,并在仓库中随便添加一些文件,如下图所示。这个仓库会在后续的实践中起到模拟远程仓库的作用。
创建仓库

现象描述:在创建新仓库成功后,当前路径下会新增一个名为remoterepo的目录,目录下会有一个.git文件夹,这就是跟踪维护git仓库的文件夹,里面包含所有git操作所需要的东西。

注意:需要注意的是git init只能用于在一个空目录中新建仓库,如果需要克隆远程目录到本地,就需要用到下面的git clone命令。

克隆仓库

克隆仓库的命令如下:

git clone [url] [dir]

命令解释git clone命令用于克隆一个远程仓库。url是要克隆的远程仓库的地址;dir是在本地创建的目录名,如果不指定则默认使用远程仓库的仓库名。

动手实践:将“远程仓库”remoterepo克隆到本地,克隆的路径指定为当前路径下的localrepo文件夹。如下图所示:
克隆仓库

现象描述:在上图中的git clone命令中file:///home/xxx/homework/remoterepo为远程仓库的地址,这里由于我们使用的本地模拟的远程仓库,所以地址的描述需要使用file协议,正常从GitHub上克隆远程仓库地址的一般描述是httphttps协议,举个例子:https://github.com/WongKinYiu/yolov7.git

注意:这里我们看到执行命令后,终端打印了一条警告:warning: You appear to have cloned an empty repository,并且使用ls命令查看本地localrepo,发现它是一个仅包含.git文件夹的空目录。这是因为我们在远程仓库中添加文件后没有进行提交,所以这个远程仓库从外部看来就是一个空仓库。接下来我们就要在remoterepo仓库中提交内容了。

提交更新的内容到暂存区

Git的管理划分了4个过程,分别是工作区、暂存区、本地仓库和远程仓库。
“提交更新的内容到暂存区”是指从工作区提交到暂存区。这个操作涉及到两条命令:

git status
git add [files]

命令解释

  1. git status:用于查看当前仓库状态,包括未暂存的和已暂存的文件改动。
  2. git add:用于将指定文件的改动提交到暂存区,这条命令后面接files的可以是一个文件,也可以是多个文件,如果想要将当前目录下的所有文件都提交到暂存区,可以执行git add .命令。

动手实践:使用git status命令查看当前仓库状态,使用git add命令将仓库中的修改提交到暂存区,以remoterepo仓库为例,我们需要做的就是把main.c、readme和test.sh文件提交到暂存区。如下图所示:
提交更新的内容到暂存区

现象描述

  1. 在提交之前执行git status命令,可以看到git提示我们在主分支上(On branch master)已发生改动但未提交暂存区的文件有main.c、readme和test.sh;
  2. 提交暂存区,我们即可以自己手动指定要提交的文件,如git add main.c,也可以使用git add .一次性将当前目录所有文件提交到暂存区;
  3. 在提交之后再次执行git status命令,可以看到main.c、readme和test.sh三个文件均为待commit的状态,说明它们都已提交至暂存区了。

注意:这个时候git还提示我们可以使用git rm --cache命令来从暂存区移除一个或多个文件(这个命令只会影响暂存区,不会删除真正目录下的文件),感兴趣的同学可以自行尝试。

将暂存区的内容提交至本地仓库

本阶段是将暂存区的内容提交到本地仓库。这个操作同样涉及到两条命令:

git commit -m "xxx"
git log

命令解释

  1. git commit:将暂存区的内容提交到本地仓库,提交后git可以在我们工作时跟踪我们的进度和更改。每个提交点都被git认为是一个“节点”或“保存点”,如果我们发现了一个bug,或者想要进行更改,是可以返回到项目中的这个“节点”的。-m后面接的是对这个提交的描述,主要说对这个仓库做了哪些改动,一定要认真填写!认真填写!认真填写!重要的事情说三遍,从一开始就养成良好的说明习惯;
  2. git log:查看提交的历史记录。

动手实践:使用git commit命令将暂存区的内容提交至本地仓库,并使用git log命令打印提交的历史记录。如下图所示:
将暂存区的内容提交至本地仓库

现象描述

  1. 使用git commit命令提交后,终端会输出一些改动信息,如上图所示,提示我们在主分支上新增了main.c、readme和test.sh三个文件;
  2. git log命令的输出内容包括提交的哈希值(就是图中一长串黄色的数字)、提交的作者、提交的日期和提交的信息(就是-m参数后面接的描述信息)。如果想要查看每次提交所影响的文件和代码行数的统计信息,可以在命令后面添加--stat参数。
  3. 最后,我们再用git status命令查看当前仓库状态,可以看到仓库处于最新状态,没有什么可提交的了。

创建和切换分支

一个仓库通包含好几个分支,常见分支类型有:

  • master:主要的分支,用于存放稳定的、已经发布的或即将发布的版本。master分支应该始终保持可部署的状态。
  • develop:开发的分支,用于存放最新的开发进度和功能。develop分支应该始终保持可运行的状态。
  • feature:功能的分支,用于开发某个特定的功能或需求。feature分支应该从develop分支创建,并在完成后合并回develop分支。
  • release:发布的分支,用于准备即将发布的版本。release分支应该从develop分支创建,并在发布后合并回master和develop分支。

创建和切换分支的命令如下:

git branch [branch-name]
git checkout [branch-name]

命令解释git branch命令用于创建新的分支;git checkout命令用于切换分支,它也有切换到指定提交点和恢复指定文件到最近一次提交状态的作用,此处不展开。branch-name是指分支名。

动手实践:首先使用git branch命令创建一个develop分支,然后使用git checkout命令切换至该分支,最后在该分支中添加一个index.html文件。如下图所示:
创建和切换分支

现象描述

  1. 使用git branch命令创建一个develop分支,如果执行正常,则不会输出任何信息;
  2. 使用git checkout命令切换到develop分支,切换成功后git会有相应提示;
  3. 创建文件后,依然要进行git addgit commit的操作,这里就当复习了前面的命令吧~提交成功后,终端会提示我们在develop分支上添加了一个文件。

注意:切换到develop分支了,要记得切回去,要记得切回去,要记得切回去!!我们之后的实践操作都是在master分支上进行的。

将远程仓库拉取至本地仓库

目前为止,我们的remoterepo这个模拟的“远程仓库”已经初具雏形,现在我们就可以将更新后的远程仓库拉取到本地仓库。用到的命令如下:

git fetch [remote] [branch]

命令解释remote是要获取的远程仓库的名称,branch是要获取的远程分支的名称。如果不指定remotebranch,则默认获取所有远程仓库和分支的信息。

动手实践:将remoterepo远程仓库的master分支拉取到本地仓库localrepo。如下图所示:
拉取远程仓库至本地仓库
现象描述:使用cd命令切换到本地仓库的目录,然后执行拉取操作,origin表示我们这次要拉取的远程仓库名称,一般情况下远程仓库的名称都是origin,可以使用git remote -v命令查询;master表示告诉git我们想拉取的是master分支而不是develop分支。执行成功后会提示我们一些信息:

  • branch master -> FETCH_HEAD:表示将远程仓库的master分支的最新提交信息存储到本地仓库的FETCH_HEAD文件中,以便在合并时使用;
  • [new branch] master -> origin/master:表示在本地仓库中创建了一个新的分支origin/master,用于跟踪远程仓库的master分支,并将其指向远程仓库的master分支的最新提交。

注意git fetch命令用于从远程仓库获取最新的提交和分支信息,但不会自动合并或修改本地仓库的内容,因此我们可以使用git fetch命令查看远程仓库的更新情况,或者在合并前预览和比较不同的版本。接下来我们就来比较本地仓库和远程仓库的不同,查看远程仓库中的项目做了哪些改动。

查询仓库项目变动情况

这一步我们查询仓库项目变动情况,即比较Git仓库中的文件或代码的差异。用到的命令如下:

git diff [branch1] [branch2]

命令解释branch1branch2是需要比较的两个分支。

动手实践:比较本地仓库localrepo和远程仓库remoterepo的不同。如下图所示:
查询仓库项目变动情况

现象描述:命令中master表示本地仓库的master分支,FETCH_HEAD表示远程仓库的master分支,这个FETCH_HEAD就是我们在上一步中用git fetch命令拉取下来生成的指针。

注意:当我们第一次执行git diff master FETCH_HEAD命令的时候,git会提示失败,由于我们的本地仓库中没有master分支,或者master分支没有任何提交,导致命令无法识别master分支作为一个有效的参数。我们用git log命令查看提交历史,发现我们的本地仓库确实没有任何提交。这个时候,我们只需要使用git addgit commit命令向master分支中随便提交一个文件即可,我这里添加的是test.sh文件。再次执行git diff master FETCH_HEAD命令,就能够正常输出本地仓库和远程仓科的差异了。

合并仓库

之前提到过git fetch命令仅用于从远程仓库获取最新的提交和分支信息,但不会自动合并或修改本地仓库的内容。我们想要合并仓库需要用到的命令如下:

git merge [branch]

命令解释branch是指定的分支,git merge会将这个指定的分支合并到当前分支,如果没有冲突,会自动创建一个合并提交。

动手实践:将之前用git fetch命令从远程仓库拉下来的master分支,与本地仓库的master分支合并且提交。如下图所示:
合并仓库

现象描述git merge后面接的是FETCH_HEAD,这个FETCH_HEAD是我们之前使用git fetch命令拉取后生成的指向远程仓库master分支的指针。此处第一次合并命令报错,是因为我们第一次克隆远程仓库生成本地仓库时,远程仓库还没有任何提交,是一个空仓库,然后又分别修改了两个仓库的master分支,所以导致两个仓库的master分支没有共同的祖先。弄清楚这一点,只需要执行git rebase FETCH_HEAD命令即可。然后就可以使用git merge命令来合并了。

注意:执行git rebase FETCH_HEAD命令后,git会将当前分支的所有提交移动到FETCH_HEAD指针指向的分支之后,如上图所示,如果遇到无法直接应用提交的情况,这条命令会自动回退使用别的方式来处理提交,并在最后进行自动合并。我们从上图也可以看出,第二次执行git merge命令后输出的是Already up to date,表示仓库已经处于最新状态,说明前面的自动合并已生效。

这两段话看上去好像很复杂,但是一般正常情况下是不会遇到这种情况的。出现这种现象是纯粹因为我们第一次克隆时克隆的是一个空仓库,然后又分别修改了两个仓库的master分支,而我们一般克隆别人的仓库不太可能克隆到一个空仓库。

将远程仓库直接拉取到工作区

前面提到过git fetch只会从远程仓库获取最新的提交和分支信息,但不会自动合并或修改本地仓库的内容。那有没有什么办法可以一次性获取+合并呢?答案当然是有的,需要用到的命令如下:

git pull [remote] [branch]

命令解释remote是要获取的远程仓库的名称,branch是要获取和合并的远程分支的名称。如果不指定remotebranch,则默认获取和合并当前分支关联的远程分支。

动手实践:由于我们之前已经使用git merge命令合并过一次了,所以需要修改远程仓库内文件的内容,并重新提交。做完这些,再使用git pull命令进行获取和合并。如下图所示:
将远程仓库拉取至工作区

现象描述:命令执行成功后,会执行fetch+mgerge操作,所以git在终端既会显示远程仓库拉取的信息,也会显示合并的情况。

将本地仓库的内容推送到远程仓库

之前介绍了从工作区提交到暂存区git add、从暂存区提交到本地仓库git commit,和将远程仓库拉取到本地仓库git fetch、合并仓库git merge,以及将远程仓库直接拉取至工作区git pull,这是最后一个命令啦!~将本地仓库的内容推送到远程仓库,需要使用到的命令如下:

git push [remote] [branch]

命令解释remote是要推送的远程仓库的名称,branch是要推送的本地分支的名称。如果不指定remotebranch,则默认推送当前分支关联的远程分支。

动手实践:由于我们之前已经使用git pull命令合并过一次了,所以需要新修改本地仓库的文件,并提交。然后使用git push命令将本地仓库master分支的修改推送至远程仓库的master分支。
将本地仓库的内容推送到远程仓库

现象描述:如果在git push命令后报上图所示错误,可以依据提示尝试修改远程仓库的配置,在远程仓库的目录下执行命令git config receive.denyCurrentBranch ignore,再次执行推送命令即可顺利完成推送。

注意:不知道为什么推送成功后,而且使用git log命令查询是能够看到推送的提交历史的,但是远程仓库的内容并没有更新。希望知道的小伙伴能够留言指点一下,感激不尽!

如果你坚持看到了这里,并且手动实践了以上命令,相信你已经对git有了初步的了解,为你点赞!~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值