随着了解git概念,逐渐掌握git命令

理解概念并使用命令,以防止冲突等问题。

顺序的话,因为我使用了一段时间的git,所以遇到了冲突,然后查了一下相关概念,终于理解了。除了冲突之外,还有一些古老的服务器旧系统,需要在实际环境中进行修改,这导致无法直接进行pull的情况不少。
重要的是从git的机制来理解问题的原因并采取对应措施,因为冲突是关于哪个是正确的问题,所以对代码的理解更加重要,我学到了这一点。
总之,今后要注意了。此次内容会比上一篇文章深入一些,并用更多的文字进行总结而不是使用图表来解释。我担心自己无法表达清楚,所以还请谅解。

此外,在这里有一篇更多关于命令可用功能方面的详细说明文章。
基本的Git命令只需记住功能即可~几乎按操作顺序~

概念与指令 (Concepts and commands)

git的本质是什么

目录和文件的差异管理。不是简单复制,而是利用哈希(提交ID)或分支来管理差异。

仓库和分支

仓库

这是存放开发中源代码等的仓库。该仓库的名称默认为origin。在github上创建仓库时可以自行决定仓库名称,但该名称与该默认名称无关。

分支

在存储库中设置指针以对源代码进行更改,并将其作为差分创建新文件。这样,将分支分开的部分就像被隔离的状态一样,彼此之间不会干扰。简而言之,分支是在存储库中创建了一个墙壁来将其分隔开,并且被墙壁分开的是发生更改的差异状态。

出现这种情况的原因,在抽象的层面上说,是因为存储库中需要分离的元素产生了,具体来说,是因为添加了新功能,多人正在进行开发,或者已经有master分支在生产环境中运行等。

本地和远程存储库

库中包含远程和本地。将本地库视为自己的工作环境,将推送至GitHub的库视为远程库。将本地表示为工作环境是因为工作环境可能是自己的个人电脑,也可能是部署服务器。作者一提到本地就会立刻想到自己的电脑。自己所在的地方就是本地。

分支的本地和远程。

如果存储库中存在本地和远程概念,那么分支也是理所当然的。可以通过使用命令大致理解本地分支(origin)和远程分支的工作原理。本地分支成为origin,并且当本地分支被推送时,远程分支将会被更新。

$ git checkout -b branch_name

使用这个命令,可以在本地仓库中创建一个本地分支。此时,远程仓库还没有创建远程分支。当从本地仓库推送到远程仓库时,远程仓库会创建远程分支。

$ git checkout branch_name

您可以使用以上的命令来切换分支。

删除本地分支和远程分支

关于删除分支的问题,我会在这里写下来,先撇开闲话不谈。

分支被删除的时机是当合并到主分支(master)时。在GitHub的网页上,在合并Pull Request的时候,有一个勾选框可以关闭分支,但这样只会删除远程分支,本地分支还会保留。我建议在合并到主分支后清理完毕,可以从本地和远程两个方向上删除已经完成任务的分支,以彻底清理干净。

$ git push --delete origin branch_name・・・リモートブランチの削除
$ git branch --delete branch_name・・・・・・・・・ローカルブランチの削除

将本地代码推送到远程仓库中的远程分支。

如果你了解仓库和分支的概念,对于这个标题的内容应该也能够理解。如果你是一个有洞察力的人,你可能已经知道如何使用push命令进行推送了。

关于推送的步骤,我认为是这样的:添加(add)=> 提交(commit)=> 推送(push)这三个阶段。为什么要经过这三个阶段呢?因为在git init的时候,本地会创建大约四个区域作为空间。虽然有三个阶段,但为什么会有四个区域呢?这是因为其中一个区域会在使用其他命令时被利用。

这个区域会在使用stash命令的时候被利用到。关于stash命令的内容,请参考这里:git在推送过程中遇到问题时的解决方法。

暫時使用的區域在這個過程中有三個。
第一個是工作區(ワーキングスペース),這是修改原始碼的地方。
第二個是暫存區(ステージング),當使用add指令時,文件會移動到這個地方。
第三個是本地儲存庫(ローカルリポジトリ),當使用commit指令時,文件會移動到這個地方。
只有在之後進行push操作,才會真正地移動到遠端儲存庫(リモートリポジトリ)中。

$ git init・・・・・・・・・・・・・・・・・・・・・・・ワーキングスペース・ステージング・ローカルリポジトリ・
$ git add file_name・・・・・・・・・・・・ステージンング領域に移動
$ git commit -m "message"・・・・・ローカルリポジトリに移動
$ git push origin master・・・・・・リモートリポジトリに移動

通过`add`命令,我们可以将目录和文件分开,并且准备好将工作中的文件除外并放入远程仓库中。
通过`commit`命令,我们可以在代码中附上功能说明和意图,并附带消息进行发送。
在`push`命令中,我们编写了将已提交到本地仓库的文件发送到远程仓库中的命令,也就是说,当第一次接触git时,对于这个”origin”是什么东西,我曾经感到困惑,但是在理解了前面提到的仓库的概念后,我终于明白了。这个”origin”指的是远程仓库,并且它的意思是将推送内容推送到远程仓库的名为”master”的远程分支上。

git pull是git fetch和git merge的组合。

当我执行git pull时,我感到奇怪的是,当一个开发者说要merge之后才能pull的时候,我担心如果我在pull之后我的工作内容会消失,所以犹豫不决。但是周围的人都开始了pull,我也忐忑不安地pull了下来,结果发现我的工作内容没有消失,只有那个开发者merge的地方被反映出来了。我以为pull是将远程仓库的文件复制过来覆盖本地文件的,但是git根据差异管理的概念,只重新创建有差异的文件。要了解pull的机制,就需要理解git fetch和git merge的机制,因为pull其实就是同时执行这两个命令。

在继续之前,这里还有一个概念需要理解。

远程跟踪分支与上游分支

这个分支可能会让人觉得奇怪,但它承担着重要的角色。在命令中,它被表示为origin/master。
首先,远程跟踪分支是本地分支的上级存在,并存在于本地存储库中。嗯?尽管名字里有“远程”,但它却存在于本地?你可能会觉得奇怪,但这似乎是日语修饰的多样性导致的一个说明不完整的情况。关于这个问题,稍后会再讨论。
理解远程跟踪分支和上游分支的区别需要理解pull命令和fetch、merge命令的机制。远程存储库中的文件并不会直接掉落到本地存储库中。首先,它们会掉落到远程跟踪分支中。实际上,是从这个远程跟踪分支中掉落到本地存储库中的。这个过程分为两步:fetch和merge。
从远程到远程跟踪分支的掉落是fetch。从远程跟踪分支到本地分支的掉落是merge。如果你能想象一下从上方掉落的过程,就可以很快地理解上游分支的概念。是的,上游分支是指在执行git pull时无需指定参数即可获取差异的分支。

虽然刚才说了“remote”这个词,但实际上它是与本地相关的。我知道有人可能不会考虑这种情况,但是我认为这个“remote”一词是指关联到分支上的。而不是这个“remote”是与“tracking”这个词相关。如果准确地加入宾语和助词,就会更容易理解。远程跟踪分支意味着“追踪远程分支的分支”。

因为有这样一个追踪远程分支的分支,当远程和本地两边有差异时,会造成无法进行pull的错误情况。关于解决无法进行pull的情况,我将在下文中提到。

将命令整合起来,如下所示。merge命令的参数origin/master表示远程跟踪分支,由仓库名称/分支名称表示。仓库名称默认为origin。

$ git pull・・・ リモートブランチからリモート追跡ブランチ(上流ブランチ)にファイルを落とした後にリモート追跡ブランチからローカルリポジトリにファイルを落としてマージする


$ git fetch origin branch_name       ・・・リモートブランチからリモート追跡ブランチにファイルを落とす
$ git merge origin/branch_name       ・・・リモート追跡ブランチからローカルリポジトリにファイルを落としてマージする

在这个阶段,我所思考的是如何正确使用pull、fetch和merge。因为commit以哈希值的方式保存,所以在合并后,如果想要撤销合并,也可以轻松地实现。因此,无论合并与否似乎都没有问题,关键是如何在合适的时机使用它们。

目前的用法是,当我想要确认远程仓库的更新内容时,我会使用fetch。因为如果其他人对我所创建的分支进行了任何合并操作,我也需要将其合并到我的本地分支中。除此之外,其他情况下,我认为使用普通的pull即可。

另外,对于这个话题,如果有进展,我会继续添加或修正。

如果能掌握这个概念,处理竞合时,只需知道撤销命令或者撤退命令,问题就能顺利处理。关于竞合时频繁使用的命令,我打算在另一篇文章中总结。

对于我们应该时刻注意的是远程和本地。

因为远程追踪分支也有本地副本,所以请不要忘记从本地的远程追踪分支推送到远程的追踪分支(origin)。

bannerAds