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
この公式ブロガーのおすすめ記事
お問合せはお気軽に
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:UnsplashのSergey Zolkin