Githubでレポジトリを作成すると最初に以下のような画面が表示されます。
ここでは、表示される2番目のセクション
の中で実行している各コードの内容について実例で解説しています。
create a new repository on the command lineとは何か?
2つ目のセクションは「create a new repository on the command line」です。
「コマンドライン(黒画面)を使って新たなレポジトリを作成する」という意味です。
各コードを実行する前(コマンドをコピペする前)に、ローカル環境でプロジェクトがあるディレクトリに移動しておく必要があります。
以下で各コードの内容について解説しています。
echo “# test” >> README.md
echo “# test” >> README.mdは、READMEファイルを作成するコマンドです。
echo "# test" >> README.md
この処理で、今いるディレクトリにREADME.mdファイルを作成し、中身に「# test」を書き込んでいます。
「>>」はリダイレクト(追記)を指示する記号で、指定したファイルに内容を出力する指示です。指定したファイルがない場合はファイルを新規作成します。
README.mdの拡張子「.md」はマークダウン形式のファイルであることを表しています。
マークダウンはHTMLをより簡単に記述する書き方です。例えばh1タグで囲む場合、冒頭に「#」を記述するだけでh1タグになります。
git init
2行目のgit init
は自分のPCにローカルレポジトリを作成するためのコマンドです。
gitが存在していないプロジェクトで、gitを使用するために使用します。initはinitializeの略で初期化という意味です。
git init
コード実行例
コードを実行すると以下のように表示されます。
$ git init
Initialized empty Git repository in 現在のディレクトリパス/.git/
現在のディレクトリ配下に「.git」という隠しディレクトリを作成し、空のGitレポジトリーを初期化しましたという内容です。
フォルダ名の前の「.(ドット)」は隠しフォルダであることを表しています。
中にはフォルダやファイルなど、gitを使うために必要なもの一式が入っています。
ここら辺のファイルを直接いじることはあまりありません。変更が発生しやすい処理はコマンドが用意されています。
.gitというフォルダが作成され、その中にGitの関連ファイルが入っていることを認識してれば問題ありません。
git add README.md
3行目のgit add README.md
は、1行目のecho "# test" >> README.md
で作成したreadmeファイルをステージに追加する処理です。
git add とは何か?
Gitの中でも最もよく使うコードの一つgit add
が使われています。
git add パス
Gitではコードやファイルに作成や変更があった場合に、いきなりローカルレポジトリに反映させず、まずはステージング(またはインデックス)という状態を挟みます。
本番前といったニュアンスで、ステージングの段階ではまだコードの変更履歴には何も追加されません。
リモートレポジトリ(Github)
↑ push
ローカルレポジトリ
↑ commit
ステージ(インデックス)
↑ add ← ココ
作業中のディレクトリ
git addすると指定したファイルやディレクトリがステージに追加されます。ステージに追加することを動名詞でステージングと呼びます。
git commit -m “first commit”
4行名はgit commit -m "first commit"
です。git commit
もGitの中でも最もよく使うコードの一つです。
git commitはステージにあるコードをレポジトリに反映する処理です。この処理にGitのコード履歴に変更内容が反映されます。
リモートレポジトリ(Github)
↑ push
ローカルレポジトリ
↑ commit ← ココ
ステージ(インデックス)
↑ add
作業中のディレクトリ
git commitの「-m」オプションも非常によく使います。これは「message」の略で、 コードの変更履歴にメッセージをつけます。
コミットに対するメッセージなので、コミットメッセージと呼びます。
ここでは、3行目の処理 git add README.md
でステージングした変更内容(README.mdの新規追加)をGitのコード履歴に反映しています。
その際、コミットメッセージを「first commit」としています。
first commitは、慣習的に第1回目のコミットで使われるメッセージです。ここは空欄でなければfirst commit以外でも問題ありません。(誰が見ても作業内容がわかる端的なメッセージをつけるのが一般的です)
なお、メッセージが空だと「Aborting commit due to empty commit message.」というエラーが発生し、コミットできません。
コード実行例
$ git commit -m "first commit"
[master (root-commit) dc53f35] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
git branch -M main
5行目はgit branch -M main
です。これは、作業中のブランチの名前をmainに強制変更するコマンドです。
git branchはブランチに関するコマンドで、オプションによってブランチの作成、移動、名前変更などができます。
「-M」オプションは、強制的にブランチ名を変更するというオプションです。
git branch -M <ブランチ名>
コード実行例
$ git branch -M main
コードを実行しただけでは何も表示されません。現在のブランチ名を確かめるには、git branch
コマンドを実行します。
$ git branch
* main
ブランチ名が「main」になっていることがわかります。
なお、「*」は現在のブランチを表しています。
git remote add origin https://github.com/~/レポジトリ名.git
6行目のコマンドは git remote add origin https://github.com/~/レポジトリ名.git
です。
これまでの作業はすべて自分が作業しているローカルレポジトリで行ったものです。まだ他のユーザーたちと共有できるGithub上のレポジトリ(リモートレポジトリ)には何も変更を加えていません。
リモートレポジトリにGitのコード履歴をプッシュするためには、まずリモートレポジトリをローカル環境に登録する必要があります。
それが、git remote addの処理です。
git remote add <任意のリモートレポジトリ名> <リモートレポジトリのURL>
リモートレポジトリのURLを毎回指定してプッシュするのは大変なので、リモートレポジトリ名いわゆる、ニックネームをつけます。
慣習的に「origin」が使われるのが一般的ですが、origin以外でもなんでもかまいません。名前を変えれば、push先のリモートレポジトリを複数設定することもできます。
詳細については 【Git】リモートレポジトリ(origin)を変更・削除・上書き・追加する方法 をご参考ください。
コード実行例
$ git remote add origin https://github.com/~/レポジトリ名.git
コードを実行しただけでは何も表示されていません。リモートレポジトリが登録されているかを確認するには、git remote -v
コマンドを実行します。
$ git remote -v
origin https://github.com/〜/レポジトリ名.git (fetch)
origin https://github.com/〜/レポジトリ名.git (push)
originというリモートレポジトリ名で指定したURLが登録されていることがわかります。
git push -u origin main
最後の7行目はgit push -u origin main
です。ローカルレポジトリのGitのコード履歴をリモートレポジトリ(Github)にプッシュする処理です。
リモートレポジトリ(Github)
↑ push ← ココ
ローカルレポジトリ
↑ commit
ステージ(インデックス)
↑ add
作業中のディレクトリ
git pushも最も頻繁に使用するコードの一つです。git pushは以下のように使います。
git push [オプション] <リモートレポジトリ名> <ブランチ名>
git push -u origin main
は、6行目で登録したリモートレポジトリにmainブランチの内容をプッシュするという処理です。
ブランチ名の省略
git push origin main
という記述はよく使いますが、一つ知っておくべき重要なことがあります。それはブランチ名が省略されているということです。
git pushは本来次のように使います。
$ git push <リモートレポジトリ名> <ローカルブランチ名>:<プッシュ先のリモートレポジトリ名>
ブランチ名はローカルレポジトリのブランチ名と、push先のリモートレポジトリ名を記述します。
ローカルレポジトリのブランチ名と、push先のリモートレポジトリ名が同じ場合に、「:リモートレポジトリ名」の記述を省略することができます。
git push origin main
↓↑ 同じ
git push origin main:main
仮に、ローカルレポジトリのmainブランチの内容を、リモートレポジトリのtestブランチに送りたい場合は以下のように記述します。
git push origin master:test
「-u」オプションと上流ブランチ
「-u」は、指定したリモートレポジトリのブランチを上流ブランチ(upstream)として設定するオプションです。
上流ブランチとして設定すると、git push するときにリモートレポジトリ名とブランチ名を省略できます。
すなわちgit push
だけでプッシュできるということです。
上流ブランチがある場合とない場合のpushの違い
上流ブランチを指定していない場合はpushは以下のようになります。
git push <リモートレポジトリ名> <ブランチ名>
↓ 上流ブランチが設定してある場合
git push
上流ブランチの確認方法
上流ブランチが設定してあるかどうかはgit remote -vv
コマンドを実行することで確認できます。
#上流ブランチがない場合
$ git branch -vv
* main dc53f35 first commit
#上流ブランチある場合
$ git branch -vv
* main dc53f35 [origin/main] first commit
上流ブランチがある場合は、[リモートレポジトリ名/リモートレポジトリのブランチ名] が表示されます。
よって、このローカルレポジトリのmainブランチでgit push
を実行すると、リモートレポジトリ名originのmainブランチにpushを行います。
なお、ブランチ名の横の 数値(例 dc54f35)は最新のコミット番号、末尾の「first commit」はコミットメッセージです。
-uと–set-upstreamとの違い
「-u」オプションは「--set-upstream
」オプションの省略形です。
オプションの前にハイフンが2つ「--
」つくものをロングオプションと呼びます。冗長な書き方でオプションの実行内容が記載されている場合がほとんどです。
オプションの前にハイフンが1つ「-」つくものをショートオプションと呼びます。ハイフンの後にアルファベット1文字が続く、省略形の記述方法です。
git push -u origin main
↓↑ 同じ
git push --set-upstream origin main
同じ処理でも人によってショートオプションとロングオプションのどちらを使うかが分かれたりしますが、驚く必要はありません。
コード実行例
「-u」つきのgit pushを実行すると以下のようになります。
$ git push -u origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 228 bytes | 228.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/〜/レポジトリ名.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
・*[new branch] main -> main
新規にブランチを作成し、ローカルブランチmainのデータを、リモートブランチmainにプッシュしていることを示しています。
・Branch 'main' set up to track remote branch 'main' from 'origin'.
ローカルレポジトリのmainブランチに、リモートレポジトリ名originのmainブランチを上流ブランチとしてセットしたことを示してます。
これにより次回以降ローカルレポジトリのmainブランチから、リモートレポジトリoriginのmainブランチにプッシュするときはgit push
のみで実行できます。