見出し画像

gitlabではじめてのbranch,fetch,mergeを触ってみる


はじめに

こんにちは。SHIFTのDevOps推進部に所属しているozakiです。

現在は7月より参画しているテックブーストプロジェクトで、開発の知識を学んでいます。これからブログを通じて、学んだ事のアウトプットをしていけたらと思います。

初めてのGitLab

VCS(Version Control System)としてGitLabを使うことになりました。
私はGitHubを少しかじったことがあるくらいで、ブランチやマージといった未知の部分にかなり苦労しました。

ということで今回は、ブランチを作る、fetch, mergeする、ところについてまとめようと思います。

branch

「develop」ブランチを作成してみます。

$ git branch develop
$ git branch  
  develop
 *master

switchまたはcheckoutでブランチの切り替え

$ git switch develop
Switched to branch 'develop'

$ git checkout develop
Switched to branch 'develop'

オプションを付けることでブランチの作成と切り替えを一気に行うこともできます。

$ git switch -c develop

$ git checkout -b develop

checkoutとswitch、何が違う?

git checkoutは多機能なコマンドであるが、機能が多すぎるためswitchという切り替え専用のコマンドが作られたみたいです。
Gitのversion2.23においてswitchとrestoreが試験的に導入されました。

fetch

他のリポジトリから最新の履歴をダウンロードしてくるコマンド

例えば、リモートリポジトリ(origin)にあるリモートブランチ(develop)の内容をローカルリポジトリのリモート追跡ブランチ(origin/develop)に反映させたい場合

$ git fetch origin develop  

と記述します。

merge

2つ以上の履歴を統合するコマンド

$ git merge <統合したいブランチの名前>  

ローカルリポジトリのリモート追跡ブランチ(origin/develop)の内容をローカルブランチ(develop)に統合したい場合、developブランチに移動して

$ git merge origin/develop  

と記述します。

pull

pullはfetchとmergeを一気にできるコマンド

ではpullでいいのではと思ってしまいますが、gitの動きを意識するために最初のうちはfetchとmergeをするのもいいなと思います。

リモートブランチ(develop)の内容を今いるブランチに反映させたい場合

$ git pull origin develop

と記述します。

説明からも何となくfetchとmergeの組み合わせていることが分かります。
説明を読んでみるとオプションによってrebaseとmergeを使い分けられるみたいですね。
なのでイメージとしては

pull = fetch + ( merge or rebase )
だと考えられます。

clone

ローカルの新しいディレクトリにリポジトリを複製するコマンド

なんとなくpullと似たような感じだなと思っていました。
しかし、cloneは複製されたリポジトリのブランチと各ブランチの追跡ブランチも作ってくれます。

$ git clone <URL>  

ローカルがまっさらな状態からリモートリポジトリの内容が欲しければclone
そのあと作業し、各ブランチでの変更を取り入れたいときはpull(fetch & merge)を使うのが良いでしょう。

まとめ

初めてブランチを切ってfetch, mergeをしてみました。
今まで意識したことがなかった「リモート追跡ブランチ」、「HEAD」などを知ることができました。
Git操作のミスは他人のコミットを消してしまいかねないので、こういった基礎的な知識をしっかりと理解するのが大切だと思います。
今回は調べたことの羅列になってしまいましたが、次は実験的なことをしてみたいです。

参考

「gitのreference」
https://git-scm.com/docs
「いまさらだけどGitを基本からわかりやすくまとめてみた」
https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0

おまけ(エラー集)

ブランチが作れない

$ git init  
$ git remote add origin https://gitlab.~.git  

したのちにブランチを作ろうと思いましたが、出来ませんでした。

$ git branch develop  
fatal: not a valid object name: 'master'

原因は、新しいブランチを作成するには最低1回はマスターブランチにコミットする必要があるということでした。
最初のコミットが完了するまではマスターブランチが存在しないということになります。
つまり、

  • なにかコミットをする

  • 空のコミットをする

必要があります。

空のコミットをするにはaddをせずに以下のコマンド

$ git commit --allow-empty -m ""  
$ git push origin master

これでブランチを切れるようになります。

参考:https://qiita.com/Sakuya_wd/items/b83161111b1b28098008

mergeができない

fatal: refusing to merge unrelated histories

というエラーでmergeができませんでした。
原因は、gitlab上でmasterブランチに変更をしてしまっていたことでした。
developブランチを切った時点のmasterブランチとは違う履歴になってしまっていたようです。

加えた変更を取り消せば解決しそうでしたが、今回は

$ git merge --allow-unrelated-histories origin/master

というオプションで解決しました。

デフォルトでは、共通の履歴を持たないもの同士のmergeは安全性の観点から拒否されてしまいます。
したがってこの機能を無視するために、このオプションを使う必要があります。

参考:https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa

この公式ブロガーのおすすめ記事


執筆者プロフィール:Ozaki Yohei
23年に新卒でSHIFTに入社。現在は開発部門のプロジェクトに参画し、技術を学んでいます。


お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/

PHOTO:UnsplashSergey Zolkin