取り急ぎのGitとGitHubの使い方

Webエンジニアのo8nです。

Webだろうが組み込みだろうが競プロだろうが、普段プログラミングをしている方は、ソースコードのバージョン管理ツールとしてGit、レポジトリのホスティングツールとしてGitHub(とかGitLabとかBitbucket)を使うことが多いです。

しかし、中にはGitを全く使ったことがない、もしくは使う場面がないというプログラマ、ソフトウェアエンジニア、研究者、学生の方もいらっしゃると思います。

この記事では、「普段GitとかGitHubを使わないけど、ハッカソンやアルバイトなど、複数人で使う必要が出てきた。使い方が分からない」という方に向けて、他人に迷惑をかけない程度には使いこなせるといった具合の温度感で、GitおよびGitHubの使い方を記します。GitLab、Bitbucketは解説できなくてごめんなさい…

まずはじめに一番伝えたいことなのですが、GitもGitHubも、公式ドキュメントに書いていることが一番正しいので、分からないことがあればまずは公式ドキュメントを探し、試してみてください。よろしくお願いします。

Gitの公式ドキュメント(日本語)

GitHubの公式ドキュメント(日本語

環境構築

Gitを使うには自身のコンピュータにGitをインストールをする必要があります。

1.5 使い始める - Gitのインストール

Gitのドキュメントでサポートされているのでこちらを参考に頑張っていただきたいです。Macの方もWindowsの方もLinuxの方も。

インストールできたら、最初にすることはユーザー名とEmailアドレスの設定です。

git config --global user.name "John Doe"
git config --global user.email [email protected]

詳しいことは以下をチェックしていただきたいです。

1.6 使い始める - 最初のGitの構成

チーム開発でGitHubを使うときの流れ

TL;DR

  1. https://github.com/new から共有レポジトリを作成
  2. レポジトリをローカル環境にクローン
  3. 作業用ブランチを作成
  4. ローカルからリモートレポジトリへ作業内容をpush
  5. プルリクエストの作成、mainブランチへのマージまで

1~2は以下のドキュメントを読んでいただくとよいです。

リポジトリの作成、クローン、アーカイブ - GitHub Docs

1.レポジトリの作成

https://github.com/newにアクセスし、レポジトリを作成します。

レポジトリ名は変更可能ですしgitignoreは後から付け加えることができますし、private/pablicもあとで変えることができますし、READMEもあとで加えることができます。LICENCEに関しても同様です。

参考

新しいリポジトリの作成 - GitHub Docs

2. レポジトリのクローン

レポジトリを新規に作成した場合、遷移先でfirst commitまでの手順が示されると思いますが、念のためクローンについて。

レポジトリのページに行くと緑色のcodeというボタンがあります。

code

HTTPSのURLがデフォルトで提示されていると思います。それをコピーし、コマンドライン上で

git clone `コピーしたURL`

この時、コマンドを実行するレポジトリに注意してください。例えばappliacation_nameというレポジトリを作成するとして、

User/your_name/project/application_name

というディレクトリ構成にしたいと思います。

ローカルで先にapplication_nameというディレクトリは作らず、project配下でクローンするようにしてください。

3. 作業用ブランチの作成

master(main)ブランチを起点に、作業用のブランチを作成します。

git branch `作業ブランチの名前`

git checkout `作業ブランチの名前`

4. ローカルでの変更をリモートにpush

作成したブランチで作業をして、その内容をリモートレポジトリの方に反映させましょう。

(改めて、ローカルレポジトリは自分がクローンしたレポジトリ、リモートレポジトリはgithub.comでホスティングされている共有レポジトリです。念のため)

git add .
git commit -m 'ここに何かしらのコミットメッセージを書き入れる。'
git push -u origin `作業ブランチ名`

変更ファイルが複数ある場合は、git add -pとしてあげると、コミットするファイルを選択することができます。

addしたファイルはgit statusで確認できます。

push origin masterって打つのめんどくさくなってきたらpush.defaultの設定を見直すとよいです。git pushを引数なしで実行した時の挙動をカスタムすることができます。

以下の記事が参考になります。消えてたらごめんなさい。

git push.default の意味と設定方法

git config --list

というコマンドを打つとpush.defaultの設定が見られます。僕はpush.default=simpleにしています。

仮にsimpleにしたい場合は

git config --global push.default simple

で設定できると思います。

もしも

  • コミットを取り消して一つ前のコミット時点に戻りたい場合
    • git reset —hard HEAD^
  • コミットメッセージをタイポなどして書き換えたい場合
    • git commit —amend

あとはGoogleさんにお任せします…

こういう場合にはコミット番号が必要になるので後述のgit logで確認してください。

5. プルリクエストの作成、マージまで

いいドキュメントがあります。 プルリクエストについて - GitHub Docs

レポジトリにpush、mainにマージされたらローカルレポジトリにリモートの変更を反映させましょう。

git checkout main

git fetch
もしくは
git pull origin main

知っていると便利なコマンドやツールなど

自分がよく使っているものです。まだまだ知らないことはたくさんあると思います。

git remote -v

git remote -v

origin https://github.com/okamotchan/kansai_train_info.git (fetch)
origin https://github.com/okamotchan/kansai_train_info.git (push)

originとはリモートレポジトリの略称という認識でよいと思います。

fetch先とpush先のURLの確認に使います。

git log --oneline

git log --onelineを実行するとコミット番号とコミットメッセージが確認できます。

e112ca0 (HEAD -> main, origin/main) to 2.5 return statement
514cda7 to 2.4 let statement
dc733d5 start REPL
75476c7 pass 1.4
cd26a68 pass p.9
7fcf51e first commit
(END)

git log

だとゴチャゴチャ色々いうてきます

commit e112ca08eb9894ce65b22a2910d1f5a39a3706e5 (HEAD -> main, origin/main)
Author: okamotchan <[email protected]>
pubDate:   Wed Oct 7 21:32:58 2020 +0900

    to 2.5 return statement

commit 514cda7f32facf04243175a8dcb89d75beee7a6a
Author: okamotchan <[email protected]>
pubDate:   Wed Oct 7 20:09:24 2020 +0900

    to 2.4 let statement

:

複数のコミットをrebaseとsquashでまとめる

git rebaseとgit squashについて。

一つのPRでfixなど粒度の細かいコミットをしまくって、あとでレビューを行うレビュワーを困らせないようにするためにも積極的に用いたいところです。

まずコマンドライン上でgit log --onelineを入力し,これまでのコミットを確認します

7cb4121c (HEAD -> ブランチ名, origin/ブランチ名) last commit
9412b112 sample3
27f45d93 sample2
df061a03 sample1
5931f611 first commit

sample3,sample2,sample1のコミットを一つの塊としてまとめることにします。

ターミナル上で

git rebase -i 5931f611

を入力するとvi(m)エディタが開きます。

pick df061a03 sample1
pick 27f45d93 sample2
pick 9412b112 sample3
pick 7cb4121c last commit

# Rebase 24468cf5..7cb4101c onto 24468cf5 (10 commands)
 13 #
 14 # Commands:
 15 # p, pick <commit> = use commit
 16 # r, reword <commit> = use commit, but edit the commit message
 17 # e, edit <commit> = use commit, but stop for amending
 18 # s, squash <commit> = use commit, but meld into previous commit
 19 # f, fixup <commit> = like "squash", but discard this commit's log message
 20 # x, exec <command> = run command (the rest of the line) using shell
 21 # b, break = stop here (continue rebase later with 'git rebase --continue')
 22 # d, drop <commit> = remove commit
 23 # l, label <label> = label current HEAD with a name
 24 # t, reset <label> = reset HEAD to a label

今回はsample2 sample3のpicksにします。sはsquashのことです。

ここではsample1にsample2 sample3のコミットおよびコミットメッセージが含まれることになります。

squashと似たものにfixup!というものがあるようです。ここではsample2と3のコミットが保存されていますが、fixup!だと新しいコミットとして作り直せるようです。1

pick df061a03 sample1
s 27f45d93 sample2
s 9412b112 sample3
pick 7cb4121c last commit

vimを終了(:wq)したらコミットメッセージが表示されます

# This is a combination of 3 commits
# The first commit message is:
sample1

# This is the 2nd commit message:
sample 2

# This is the 3rd commit message:
sample  3

一つ目のコミットメッセージに3つ分のコミットを一言で表すメッセを残しましょう 仮に「まとめました」というコミットメッセージに変更することにします(もうちょっとマシなメッセを考えた方がいい)

# This is a combination of 3 commits
# The first commit message is:
まとめました

# This is the 2nd commit message:
sample 2

# This is the 3rd commit message:
sample  3

git log --oneline

でチェックすると大方こうなっているはず。

7cb4121c (HEAD -> ブランチ名, origin/ブランチ名) last commit
df061a03 まとめました
5931f611 first commit

この変更をリモートに反映する際、

git push -f origin ブランチ名

します。rebase・squashしたコミットはforce pushしないと正常にpushできません。それ以外の場面で無闇にforce pushするのはオススメできません。

jonas/tig

tig

tigはコマンドライン上でリモートレポジトリのログが確認できるツールです。誰がどのようなコミットをしたのかが確認できます。

hub browse

originに登録されているURLにアクセスできます。

参考になりそうな資料

Footnotes

  1. git コミットログを綺麗にしたい。fixupとsquash