【Git】我简明地总结了Git、GitLab和GitHub的基础知识
目录
-
- はじめに
-
- Gitとは
Gitのリポジトリとブランチの構成
Gitのリポジトリの構成
Gitのブランチの構成
Gitの2種類のマージ
fetchとpullの処理について
コンフリクトについて
コンフリクト発生時の対処
コンフリクトの発生を抑える方法
GitとGitLab/GitHubの違い~forkとマージ/プルリクエスト~
forkについて
マージ/プルリクエストについて
GitとGitLab/GitHubの違いを意識しよう
よく使うgitコマンド集
Gitの勉強おすすめサイト
首先
很多人只是凭感觉在操作Git,你觉得是这样吗?
-
- クローンとコミット&プッシュくらいしかGitのこと知らない
- マージ、フェッチ、プルとかよく聞くけどあんましわかってない
为了让像这样的人能够理解Git的基础知识,我写下了这篇文章。
Git 是什么?
Git的原型是由Linus Torvalds在2005年创建的。
虽然Linus以Linux的创始人而闻名,但在Linux内核开发时,他需要一个源代码管理工具,于是开发了Git。
据说Linus在两周内就完成了Git的开发。可以说,不仅仅是Linux,Git也是他的又一杰作。
关于Git的简史,在以下两篇文章中有详细讲述。
Git简史
Linus在两周内创造Git的故事。
在短短的两周内创建的Git是一种分散式版本控制系统。与集中式版本控制系统不同,分散式版本控制系统中的每个人都有自己的仓库。通过分散式版本控制系统,Git实现了高效的开发机制。
Git的仓库与分支结构
Git仓库的结构
Git有本地仓库和远程仓库两种存在。
远程仓库:由GitLab和GitHub进行管理的中央集权仓库
本地仓库:每台个人电脑上拥有的仓库
值得注意的是,本地仓库和远程仓库之间的通信是在线进行的。在离线状态下,通信将失败。
通过考虑操作是在本地仓库内进行还是与远程仓库通信,可以判断是否可以在离线状态下进行。例如,clone和push需要与远程连接,但是commit和checkout则不需要与远程连接。
我认为,思考自己输入的git命令是否与远程仓库通信,有助于理解git。
顺便提一下,一般来说,可以通过将本地仓库的差异推送到远程仓库来反映远程仓库的更改,但也可以直接修改远程仓库。
可以通过使用GitLab的”Web IDE”或GitHub的”Codespaces”功能来实现这一点。
闲谈一下,在GitLab以前,当直接编辑远程仓库时,会使用GitLab专用的IDE(不太好用)。但从2022年12月开始,可以使用VSCode进行编辑了。
个人而言,可能不会经常使用,但是、、、
GitLab已经以Visual Studio Code为基础推出了Web IDE的β版,使得可以通过终端访问远程环境。
Git的分支结构
在理解Git的操作过程时,理解以下术语将会使事情变得更容易:远程存储库和本地存储库、本地分支和远程追踪分支。在掌握了这些术语后,我们就可以更轻松地理解Git的处理过程。因此,让我们确保对这些术语有一个清晰的理解。
在以下文章中也进行了清晰易懂的解释。
【Git】所做的是从远程获取和向远程反映。
只需要一个选项,将以下内容以中文为母语进行改写:
Git有两种合并方式。
在Git中,当合并分支时,会执行一个名为merge的操作。
合并有两种主要方法。
①作为两个分支的共同祖先的提交
②源分支的提交
③目标分支的提交
在三路合并中,将(1)和(2)之间的差异以及(1)和(3)之间的差异合并到一个分支中。如果这些差异发生冲突,就会产生冲突。
快速合并的特点是最终不会出现类似于三路合并的分支,而是将提交树维持在一条直线上。
关于fetch和pull
在解释fetch和pull这两个Git的基本操作之前,首先需要掌握之前的术语。
-
- fetch
-
- フェッチは最新のブランチ状況を取得する処理です。
-
- ローカルリポジトリでフェッチを行うと、現在のリモートリポジトリのブランチ状況を参照し、リモート追跡ブランチを更新します。
-
- pull
-
- プルはリモートリポジトリの該当ブランチにおける最新の状態をローカルに反映する処理です。
-
- ローカルリポジトリでプルを行うと、まずフェッチが行われ、該当ブランチのリモート追跡ブランチが更新されます。その後、ローカルブランチに対して最新化したリモート追跡ブランチをマージします。こうしてローカルの該当ブランチがリモートリポジトリと同期が取れた状態となります。
- つまり、プルはフェッチ+マージの処理となるのです。
关于冲突
处理冲突时的方式
当两个或更多不同的修改尝试同时应用在同一部分时,Git冲突就会发生。
例如,当两个开发者对同一文件的同一行进行了不同的修改,并试图将它们合并时,Git无法确定哪个修改应该优先,从而导致冲突发生。
解决冲突需要手动修正冲突点,并且这可能需要一段时间。虽然有一个功能可以全面应用其中一方的编辑,但在发生冲突时,尽量要充分了解冲突的位置,理解原因后再进行修正。
避免冲突发生的方法
解决冲突既繁琐又会导致代码质量下降,因此必须尽可能减少冲突的发生。
主要有两种方法可供选择。
-
- 機能(feature)単位でブランチを切る
- 定期的にリモートリポジトリと同期を取る
让我们详细来看这两个事项。
按照功能单位进行分支切换
通过按功能单元切分分支,可以降低与创建其他功能的分支编辑相同部分的可能性。
通过按功能单元进行编辑者的划分,可以减少编辑同一文件的次数。
在编辑util包下的文件时,如果涉及到跨功能的文件被使用,很可能会发生冲突,请注意。
定期间隔与远程代码库进行同步
如果对于同一个分支有多个人进行了编辑,就应该定期进行拉取操作。
如果没有定期进行拉取操作,本地仓库和远程仓库之间就无法同步,会在推送时出现非快速推进错误。
在非快速推进错误发生时,请进行拉取并处理。
如果发生冲突,请手动修复,或者考虑重新思考分支的划分方式。
假设我们从main分支创建了feature分支,在main将要合并该feature分支时需要注意冲突问题。
由于冲突可能会降低代码质量,所以我们尽量不希望在main端处理冲突。
因此,在main合并feature之前,最好先让feature分支合并main的内容,检查是否存在冲突的可能。
在feature分支处理冲突后,确保在main端能够安全地进行合并,以减少主要代码质量降低的风险。
定期进行分支之间的同步也是一种解决方法。
为了减少主要分支(main)中的冲突,合并目标分支(feature)定期地将主要分支合并到自己,并解决每次的冲突,这种方法也出现在令和5年春季应用信息技术师考试中。
在下午题目的第8题(信息系统开发)的第5个问题中,为了减少在develop分支中出现冲突(在考试中称为竞争)的可能性,要求制定一项运营规则,即“feature的最新状态随时合并到develop分支的最新状态”。
令和5年春季应用信息技术师考试下午题目。
Git和GitLab/GitHub的区别 ~ fork和merge/pull request~
Git是一个提供版本管理的工具,GitLab/GitHub则是基于Git的基准创建的基于Web的平台。
GitLab/GitHub将远程仓库作为中央集权的仓库来管理。
借助这种远程仓库的特性,我们可以使用fork、merge/ pull request等功能。
关于叉子(fork)
可以通过在GitLab/GitHub上创建分支来创建一个新的项目,该项目是对原始项目内容的复制。在分支的仓库中,您可以自由修改代码,而不会对原始仓库产生任何影响。
此外,即使在原始存储库中未被授予源代码编辑权限的人,也可以在派生存储库中获得编辑权限。您可以编辑存储库,而无需考虑原始存储库及其权限。
另外,GitLab 在私人项目中只能分配 5 个成员,但可以通过使用 fork 来将其管理为不同的项目,从而可以在 fork 的项目中再次分配最多 5 个成员。通过准备多个 fork,可以实现大规模团队开发,因此记住这个小窍门。
此外,在将 Fork 的仓库合并到原仓库中时,可以通过进行合并/拉取请求来实现合并。
关于合并请求/拉取请求
在GitLab中,可以使用“合并请求(Merge Request)”这个功能来在合并之前对源代码的更改进行审查。而在GitHub中,则使用“拉取请求(Pull Request)”这个功能来实现同样的目的。尽管名称有所不同,但功能并无差异。
只是探讨一下:
基于Fork的操作是指原分支(source)回收合并到目标分支(target),行为类似于进行Pull操作。在GitHub中,重点放在Fork操作时的审查上,因此称之为Pull Request;而在GitLab中,重点放在合并不同分支时的审查上,因此称之为Merge Request。我认为有一位与我进行了相同的思考——Pull Request和Merge Request之间的区别。
在Git中,只需要进行合并操作,但在GitLab/GitHub中,我们建立了一个制度,使得在合并之前(或定期时间)可以进行代码审查,以促进团队开发。
我们通过创建一个环境来可视化变更,并提供编辑代码的建议,从而能够进行更好质量的开发。
让我们关注一下Git与GitLab/GitHub的区别。
除了fork、merge/pull request之外,GitLab/GitHub还增加了一些功能,如权限设置、CI/CD、问题管理等,以便更好地进行团队开发,充分发挥Git的功能。需要注意的是,GitLab/GitHub的附加功能并非Git本身的功能。也就是说,“进行fork”或者“进行merge/pull request”这样的git命令是不存在的。
当你需要执行一项操作时,如果是在Git的功能范围内,就使用相应的命令来完成;如果是在GitLab/GitHub的功能范围内,就意识到无法使用命令来完成。
常用的git命令集
我会总结一下我个人经常使用的git命令。
git checkout ローカルブランチ名
ブランチを移動したいときに使います。
git checkout -b 新規のブランチ名
bオプションを付けることで、git branch 新規ブランチA+git checkout 新規ブランチAの処理をやってくれます。
つまり、新規ブランチを作りかつそのブランチに移動するという処理です。
「git add .」+「git commit -m “コミットメッセージ”」+「git push」
「add .」でカレントディレクトリ配下の変更or新規追加ファイルをaddステージにあげ、commitでコミットします(mオプションはコミットメッセージをその場で付けるためのオプション)。
最後にコミットをプッシュしてリモートリポジトリに反映します。
git pull
編集中のブランチに対応するリモートリポジトリをプルします。
編集中ブランチが新規作成のもので、まだリモートに反映していない場合は失敗します。
git checkout ファイル名
addしていない編集したファイルを、最新コミットの状態(編集前の状態)に戻します。
IDEでロールバックという処理を行えば簡単にできるのでそちらの方が速いかもしれません。
推荐学习Git的网站
我之前写了关于Git基础的内容,但还远远不能覆盖到Git的全部。
我认为使用Git的同时不断学习是一种很好的方式。
然而,如果在遇到问题时没有基本知识的话会很困扰,因此我们应该事先在其他网站上学习基础知识。我会给你推荐一些值得推荐的网站。
用漫画理解Git~命令篇~
这部可爱的漫画以萌萌哒的画面向我们教授Git命令。
在第一集中,它向只凭借图形界面就认为自己可以使用Git的女孩敲响了警钟。
第一集,让我们创建仓库并尝试提交【连载】用漫画理解Git ~命令篇~。
东工大的课程
东工大的课程已经上传到了YouTube上,其中有一集讲述了Git。将Git和GitHub分开在不同的课程中讲授给人们留下了良好的印象。
第5和6集的内容是关于使用Git进行版本管理的(YouTube链接为:《系统开发项目应用第一 第5,6集 Git版本管理》)
第8和9集的内容是关于GitHub和Pull Request的(YouTube链接为:《系统开发项目应用第一 第8,9集 GitHub & Pull Request》)
混合研修视频
在YouTube上,Mixi公开了培训视频,其中一部分是关于Git的章节。
他们还提供了实用的建议,如在Pull Request时要写清楚评论。
Git培训讲座【Mixi 22届新员工技术培训】。
学习使用Git分支
这是一个可以用来练习git命令的网站。你可以通过它直观地确认git命令。学习git分支。
如果还有其他推荐的学习网站之类的,请在评论中告诉我,我会非常高兴的^^
文献引用
-
- Gitの歴史
Git略史
Linusが2週間でgitを作った話。
分散型バージョン管理と集中型バージョン管理の違い
GitとSVNの違いとは?
Gitのリポジトリとブランチ構成
GitLab、Visual Studio CodeベースのWeb IDEをβ版として提供開始。ターミナルからリモート環境へアクセス可能に
【Git】リモートからの取得とリモートへの反映で行っていること(fetch,pull,push)
コンフリクトについて
令和5年春期 応用情報技術者試験 午後問題 問8「バージョン管理ツールの運用」
GitとGitLab/GitHubの違い
プルリクエストとマージリクエストと。
Gitの学習にためになるサイト
マンガでわかるGit ~コマンド編~
システム開発プロジェクト応用第一 第5,6回 Gitによるバージョン管理(Youtube)
システム開発プロジェクト応用第一 第8,9回GitHub & Pull Request(Youtube)
Git研修講義【ミクシィ22新卒技術研修】
Learn Git Branching