(※2020年に書いた記事です)
はじめに
この記事は、無知な新人(私)がGitを使うことになったときの記録です。
自分用の備忘録としてここにおいておきます。
参考にさせていただいた記事
- Gitの基本概念の理解:「図解! Gitのブランチ・ツリーをちゃんと読む」
- 使い方の基礎:「[Git] 基礎 ~master反映まで~」
- リモートにSSH接続するための準備:「GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~」
- GitHub での Pull Request について:「【GitHub】Pull Requestの手順」
0歩目:リポジトリ管理の流れ(GitHub Flow)をざっくり知る
変更の樹形図
commit は、ある状態と、それに対する変更(差分)を保存します。
commit の履歴は、最初の状態から commit の連なりとして、樹形図のような構造で保存されます。
この樹形図をたどることで、任意の状態まで遡ることができます。
樹形図の枝をbranchといいます。
ざっくり GitHub Flow
こんな感じでしょうか...
- リモートの master ブランチの状態をローカルに反映(cloneまたはpull = fetch + merge)
- ローカルの hoge ブランチで編集して変更を保存(commit)
- ローカルの hoge ブランチをリモートの hoge ブランチに反映(push)
- リモートの hoge ブランチを master に merge する許可を乞う(pull request)
- 許可が出ない → コメントや指摘をもらって2に戻る
- 許可が出た → リモートの hoge ブランチをリモートの master ブランチに merge する
- 1に戻る
大事なこと
- リモートとローカルは常に同じブランチ構造を保つ
- リモートのmasterブランチに直接pushしない(できない設定にする)
- ローカルのいろんなブランチからpushしない
- コミットの粒度はできるだけ小さく
1歩目:ローカルにリポジトリを作る
ここから、練習で一連の流れをやってみましょう。
練習用にローカルにディレクトリを作ります。
$ mkdir gittest
$ cd gittest
このディレクトリをGitリポジトリにします。
$ git init
管理するテキストファイル(sample.txt
とする)を作ります。
$ echo "Hello Git" >> sample.txt
変更を登録します。(commit
するものを選択)
$ git add sample.txt
git status
で状態を確認できます。
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: sample.txt
コミットします。-m
はコミットメッセージ( "my first commit"
とする)を追加するオプションです。
$ git commit -m "my first commit"
ローカルのmaster
ブランチができているのを確認します。 *
は現在のブランチを表しています。
$ git branch -a
* master
変更はすべて保存されました。
$ git status
On branch master
nothing to commit, working tree clean
2歩目:リモートにリポジトリを作る
準備
リモートのリポジトリを準備しておきます。今回はGitHubでリモートリポジトリを作りました。
- GitHub.comで、サインインまたはサインアップして、"Create Repository" から適当な名前をつけてリポジトリを作ります。
- リポジトリの "Setting" タブの "Deploy keys" にSSH接続のための公開鍵を追加します。公開鍵生成などの設定の仕方は「GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~」を参考にしました。
リモートのリポジトリを追加します。ちなみに、origin
はリモートリポジトリを指すラベルのようなものですが、origin
でなくても好きな名前をつけて大丈夫です。
$ git remote add origin git@github.com:[ユーザー名]/[リポジトリ名].git
リモートのリポジトリが追加されているのを確認します。
$ git remote -v
origin git@github.com:[ユーザー名]/[リポジトリ名].git (fetch)
origin git@github.[ユーザー名]/[リポジトリ名].git (push)
3歩目:ローカルの変更をリモートに反映する
ローカルでブランチの生成と切り替え、コミットまではできるようになりました。
$ git push origin [push元(ローカル)のブランチ名] : [push先(リモート)のブランチ名(master以外)]
- :以下を省略すると、
push
元と同じ名前のリモートのブランチにmerge
される。 - 同じ名前のブランチがない場合は、自動で同じ名前のブランチが生成される。
4歩目:プルリクエスト
というわけで、「プルリクエスト」をやってみます。
3歩目でリモートのmaster以外のブランチに反映させた変更を、リモートの master
にmerge
する際にプルリクエストを作成します。プルリクエストが承認されれば、merge
できます。「create pull request」からプルリクエストの投稿を行います。変更がリモートのmaster
に無事merge
されれば、一時的にできていたブランチを消すことができます(と言われます)。
注意事項
※ローカルでmergeはしない!!
ローカルの(masterでない)作業用ブランチからリモートにpushする。
※ローカルと違う名前でpushしない!!
同じ樹形図を保てない。
※リモートの設定によってはいきなりmasterにpushしようとするとはじくことができる。
「ブランチのアクセス権」を設定しておくことでmasterへのやらかしを防げる。
できればCI環境を整えたい。
おまけ(もっとわかりたいときのためのメモ)
- こちらオライリーの蝙蝠本:Gitの仕組みがわかって面白いし勉強になります。
- リモートブランチについて:Git公式
- リポジトリのcloneとforkの違い
- 詳しくてわかりやすい図解
- 詳しくてわかりやすい記事がまとまってた