Webエンジニアのo8nです。
Webだろうが組み込みだろうが競プロだろうが、普段プログラミングをしている方は、ソースコードのバージョン管理ツールとしてGit、レポジトリのホスティングツールとしてGitHub(とかGitLabとかBitbucket)を使うことが多いです。
しかし、中にはGitを全く使ったことがない、もしくは使う場面がないというプログラマ、ソフトウェアエンジニア、研究者、学生の方もいらっしゃると思います。
この記事では、「普段GitとかGitHubを使わないけど、ハッカソンやアルバイトなど、複数人で使う必要が出てきた。使い方が分からない」という方に向けて、他人に迷惑をかけない程度には使いこなせるといった具合の温度感で、GitおよびGitHubの使い方を記します。GitLab、Bitbucketは解説できなくてごめんなさい…
まずはじめに一番伝えたいことなのですが、GitもGitHubも、公式ドキュメントに書いていることが一番正しいので、分からないことがあればまずは公式ドキュメントを探し、試してみてください。よろしくお願いします。
環境構築
Gitを使うには自身のコンピュータにGitをインストールをする必要があります。
Gitのドキュメントでサポートされているのでこちらを参考に頑張っていただきたいです。Macの方もWindowsの方もLinuxの方も。
インストールできたら、最初にすることはユーザー名とEmailアドレスの設定です。
git config --global user.name "John Doe"
git config --global user.email [email protected]
詳しいことは以下をチェックしていただきたいです。
チーム開発でGitHubを使うときの流れ
TL;DR
- https://github.com/new から共有レポジトリを作成
- レポジトリをローカル環境にクローン
- 作業用ブランチを作成
- ローカルからリモートレポジトリへ作業内容をpush
- プルリクエストの作成、mainブランチへのマージまで
1~2は以下のドキュメントを読んでいただくとよいです。
リポジトリの作成、クローン、アーカイブ - GitHub Docs
1.レポジトリの作成
https://github.com/newにアクセスし、レポジトリを作成します。
レポジトリ名は変更可能ですしgitignoreは後から付け加えることができますし、private/pablicもあとで変えることができますし、READMEもあとで加えることができます。LICENCEに関しても同様です。
参考
2. レポジトリのクローン
レポジトリを新規に作成した場合、遷移先でfirst commitまでの手順が示されると思いますが、念のためクローンについて。
レポジトリのページに行くと緑色の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 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のpick
をs
にします。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はコマンドライン上でリモートレポジトリのログが確認できるツールです。誰がどのようなコミットをしたのかが確認できます。
hub browse
originに登録されているURLにアクセスできます。
参考になりそうな資料
- 30分でできるRuby on RailsとGitHubやエディタまわりの環境構築
- MacユーザーかつVScodeユーザーの方にオススメ