Git がインストールされていること、 GitHub のアカウントがあることが前提。
Git, GitHub の基礎知識があればなおよい。
- git インストール, github アカウント作成
- 共同開発の「お作法」
- GitHub 以外のサービスを使う場合
- Git内部の仕組み、コマンド等の詳細な説明
-
Git =>分散型バージョン管理システム
- 「分散型」: リポジトリ を分散して管理。複数人でも管理しやすく。
- 「リポジトリ」 : 保管場所とログのまとまりのようなもの
- 「バージョン管理システム」: ログの管理。リポジトリの差分を利用。
- 「分散型」: リポジトリ を分散して管理。複数人でも管理しやすく。
-
GitHub => Git を Webサービスにして、さらに機能を追加したもの。リモートリポジトリを提供する。
「リポジトリ」: 保管場所とログのまとまり
リポジトリは2種類
-
リモートリポジトリ:
専用のサーバなどにある。複数人のコードがここに統合・共有される。 -
ローカルリポジトリ:
個人のマシンなどの中にある。使用者はそのユーザのみの想定。
開発者はローカルリポジトリで開発を行い、その変更をリモートリポジトリにアップロードする(push)。
また他の人が行ったリモートリポジトリの変更を、自分のローカルリポジトリに適用させることもある(pull)。
基本的には以下のような流れで、変更をリポジトリに更新する。
* 作業ディレクトリ: 私たちが普段使っている素のディレクトリ。(ワークツリーとも)
|
|- Add コマンド: ファイルをインデックスに登録し、次のコミットのターゲットとする。`add` されたファイルは「その時の状態」で登録される。つまり変更した場合は再度 `add` する必要がある。
V
* インデックス: コミットを行う準備をするための場所。コミット予定のファイルを追跡。無駄なファイルのコミットを防ぐ。(ステージングエリアとも)
|
|- Commit コマンド: インデックスからローカルリポジトリへ差分を更新。コミット(差分)の生成。
V
* リポジトリ: ローカルリポジトリ
このワークフローがあることで、無駄なファイルのコミットで履歴を複雑にすることを防いでいる。
以下のようなコマンドを使い、ローカルリポジトリの変更をリモートリポジトリに適用、もしくは逆にリモートリポジトリからローカルリポジトリへ更新する。
また clone では リモートにあるリポジトリを丸ごと(branch, 変更履歴を含めて) ローカルにコピーすることができる。
コマンドと説明:
| コマンド | 説明 |
|---|---|
| Push | ローカルリポジトリの変化をリモートリポジトリに反映 |
| Pull | リモートリポジトリの変化をローカルリポジトリに反映 |
| Clone | リポジトリを丸ごとローカル環境にコピーする |
ブランチというものを使用すると、本流はそのまま残した上で、それから分離した作業ディレクトリ、ステージングエリア、履歴を持つことができる。
またブランチは統合(merge)することができる。
branch-b +---+----+-------
/ \
branch-a +--+--+------------+------
| ┗ branch-b の変更を branch-a に統合している
branch-a から branch-b
を派生させている
なにもないところから、自分のPCで git を用いて管理をする。
もしくはすでに自分のPCにあるプロジェクトを Git で管理する。
- ディレクトリを作成
git initで初期化- するとカレントディレクトリをリポジトリになり、
.gitフォルダが作成される - はじめから何かファイルがあっても問題ない
- しかしその場合は、add する前に
.gitignoreを書かないと、個人情報等悲惨なことに- add, commit 後でも修正できるが面倒。remote に push した場合は終わり。
.gitignore書いたらgit statusで適用されていることを確認
- しかしその場合は、add する前に
- するとカレントディレクトリをリポジトリになり、
git branch -M mainで デフォルトブランチを変更- github の仕様変更に合わせてデフォルトブランチを
masterからmainに変更 - 行わなくても問題ない
- github の仕様変更に合わせてデフォルトブランチを
- GitHub でからのプロジェクトを作成。
- GitHub にアクセスし、 New Repository をする。
- プロジェクト名は URL の一部になる。
git remote add origin <URL>で リモートブランチを追加- リモートブランチを
originとして追加。 <URL>は先ほど作った空のプロジェクトのもの。作成するとわかりやすく出てくる。
例えばhttps://github.com/{GitHubアカウント名}/{プロジェクト名}.gitのようなもの。
- リモートブランチを
ここでは、共同開発等で誰かがすでに作ったリポジトリを clone して始めることを想定している。
共同編集者であることが前提。 GitHub で招待してもらう。
もし共同編集者ではない場合、一度自分のアカウントに fork して、それを clone する。ものによって、いろいろなお作法があるかもしれないので注意する。
git clone <URL>で clone する- 履歴やブランチ等が丸ごとコピーされる。
- リポジトリの権限を持っていれば
git add remoteは必要ない
git add <filename>で ステージングエリアにファイルの中身を追加- カレントディレクトリ全てのファイルの場合、
git add . - commit する前に変更があった場合、再度 git add する必要がある。
- その時は
git diffやgit statusを使って現在の作業ディレクトリと、ステージングエリアの差を比較する。
- その時は
.gitignoreのファイルは add されない- もしステージングエリアへの追加を取消たいなら
git reset <filename>をする。- まだコミットしていない場合のみ
- カレントディレクトリ全てのファイルの場合、
git commit -m "コミットメッセージ"でステージングエリアにあるファイルの状態をリポジトリに追加する。- コミットメッセージはなるべくわかりやすく書く
git diff --stagedやgit statusでステージングエリアとリポジトリを差を比較する- コミットをある状態に戻すには
git reset --soft <commit id>かgit reset --mixed <を使うgit reset --soft <commit id>: コミットのみを取り消し、ある時点のコミットと同じ状態にする。ステージングエリアは変更しない。HARDで直前のコミットと同じ状態にする。^HEADで直前のコミットを取り消し。git reset --mixed <commit id>: --soft と似ているがステージングエリアも変化。git reset --hard <commit id>: 上記2つと似るが、ファイル⾃体も指定されたコミットと同じ状態にする。
ブランチというものを使用すると、本流はそのまま残した上で、それから分離した作業ディレクトリ、ステージングエリア、履歴を持つことができる。
またブランチは統合(merge)することができる。
git branchで今あるブランチの一覧を確認できる。- 現在 自分がいるブランチは アスタリスクが付き、緑色でハイライト される。
git branch -aとすると、リモートブランチも表示される
git branch <branch name>で現在のブランチから別のブランチを派生させる。このブランチは派生元のブランチの履歴等を受け継ぐことができる。git switch <branch name>で指定したブランチへ移動することができる。git merge <branch name>で現在のブランチにそのブランチの変更を統合できる- 現在のブランチが
feature-ea-fetchjsでgit merge mainとした場合、メインブランチの変更を現在のブランチに適用できる。
- 現在のブランチが
git branch -d <branch name>でそのブランチを削除できる- ただし、
git branch --mergedで表示されるマージ済みのブランチしか削除できない
- ただし、
GitHub などのサービスを使えば、リモートにもリポジトリを置くことができる。またこれを用いて共同開発をすることができる。(後述)
git pushでローカルブランチの変更をリモートに適用できる- ただしこのように使うには「上流ブランチ」を定める必要がある。(そのローカルが追跡するリモートブランチのこと)
git push -u origin <remote branch>で設定できるgit push origin <local branch>:<remote branch>で都度指定してあげることもできる
git pullでリモートの変更をローカルに適用できる(上流ブランチを定めていた場合)pull = fetch + mergeである。fetch:- 「リモート追跡ブランチ」という「ローカルリポジトリにあるブランチで、(当該のブランチの)リモートリポジトリを追跡するもの」ものがある
- それに対して、リモートリポジトリの変更を追加するもの。
- リモート追跡ブランチは
origin/<branch name>というように表される。 git fetchした後に、git show origin/<branch name>とすれば、リモート追跡ブランチとローカルブランチの差異を見ることができる
- ブランチの差異を見た後、それでよければ現在のブランチで
git merge origin/<branch name>とする。すると現在のブランチに変更が適用される。 - つまり
git pullは、「リモート追跡ブランチに変更を適用したあと」「現在のブランチにリモート追跡ブランチの変更を適用する」ということを一気にしている
共同開発はざっくりと以下のような流れで行うことが多い
- まずは自分自身ののブランチを切り、そこで作業
- 派生もとは github-flow なら
main - コマンドは
git branch <new branch>でブランチ派生(自分がどこのブランチにいるか確かめてから行う)git switch <new branch>で移動add,commit...etc
- 派生もとは github-flow なら
- 作業したらリモートの作業ブランチ に push
- 上流ブランチを定めたうえで
git push(自分でローカルでつくったブランチはリモートにはないので、必ず上流ブランチを定める) - GitHub 上で確かめる
- 上流ブランチを定めたうえで
- GitHub 上でプルリクエストを出して main 等に merge
- GitHub 上でプルリクエストを出す
- コンフリクトしなかったら merge
- しちゃったらブラウザ上で直すか、ローカルで作業して push
- 他の人が行った変更を自分のローカルの
mainブランチに pull- これは結構頻繁に行うべき。
- なぜなら他の人の実装が変わることで自分のが動かなくなる
- コンフリクトが起きやすくなるという危険が増すから
mainにてgit pull
- これは結構頻繁に行うべき。
- ローカルの
mainを、作業しているブランチに merge- 作業ブランチに移動し
git merge main- もしコンフリクトが起きたら
git checkout --theirs <filename>:mainブランチを優先git checkout --ours <filename>: 作業しているブランチを優先 ...等する
- 繰り返し
これが理解できれば大丈夫!
Git の管理下に置きたくないファイル等を記述する。例えば以下のようなものは置きたくない
- 個人情報等公開できない情報
- ライブラリ、パッケージのディレクトリ等
- 一時ファイル等
.gitignore には1行で1つのものを記述する
例)
# `#` はコメントアウト
# ----------------
# --+
# |
# +- .git/
# +- .gitignore
# +- hoge.txt --- (1)
# +- q.pdf --- (4)
# +- dir3/
# | +- p.pdf --- (4)
# | +- die2/ --- (2)
# | +- b.txt --- (2)
# +- dir1/
# +- piyo.txt
# +- hoge.txt --- (1)
# +- huga.txt --- (3)
# +- dir2/ --- (2)
# +- a.txt --- (2)
# ----------------
hoge.txt # 全てのディレクトリにある `hoge.txt` を無視 --- (1)
dir2/ # 全てのディレクトリにある dir2 ディレクトリより下を無視 --- (2)
/dir1/huga.txt # `.gitignore` があるパスから相対パス --- (3)
*.pdf # 全ての pdf ファイルを無視 --- (4)-
LeadingTech. "gitignoreの書き方チートシート【テンプレあり】". WiseLoan Engineer Blog.
https://leadingtech.co.jp/wiseloan/gitignore/, (accessed: Oct. 18, 2023). -
@inabe49. ".gitignore の書き方". qiita.
https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff, (accessed: Oct. 18, 2023).
git reset <filename>:ステージングエリアをクリアする- ファイル名を指定したら、そのファイルの add だけ取消
git reset --soft <commit id>: 現在の状態(HEAD)を指定されたコミットと同じ状態にする git reset --softed HEAD^: で直前のコミットを取消.- ステージングエリアは消えない
- ファイル名を指定したら、そのファイルの add だけ取消
git reset --mixed <commit id>: --soft と似ているがステージングエリアも変化git reset --mixed HEAD^で直前のコミットを取消、ステージングエリアも削除
git reset --hard <commit id>: 上記2つと似るが、ファイル⾃体も指定されたコミットと同じ状態にする。- add 前のファイルを⼀⻫に訂正可。 その場合は
git reset --hard HEAD
- add 前のファイルを⼀⻫に訂正可。 その場合は
- 現在 local の origin にもないブランチを remote からもってきたい(
git branch -aにないもの)git branch -aで表示されるものは普通にあるのでgit switch <branch name>で移動できる。(ここに出てくるものは「リモート追跡ブランチ」でorigin/<branch name>のようなもの)
- やり方 1
git feetchを行うことで、すべてのリモートブランチに対してリモート追跡ブランチを置くことができるgit switch <branch name>で移れるように# リモートから `foo` ブランチを持ってきたい(リモートにあるのは main, hoge, piyo, foo, baz) > git branch -a # `foo` ブランチはない * main hoge remotes/origin/main # `main` の リモート追跡ブランチ remotes/origin/hoge # `hoge` のリモート追跡ブランチ remotes/origin/piyo # 途中から clone した場合など、リモート追跡ブランチのみがある場合も > git fetch # 全てのリモートのリモート追跡ブランチを置く > git branch -a * main hoge remotes/origin/main remotes/origin/hoge remotes/origin/piyo remotes/origin/foo # `foo` を持ってこれた remotes/origin/baz # でも `baz` も持ってきちゃった > git switch foo Switched to a new branch 'foo' branch 'foo' set up to track 'origin/foo'.
- やり方 2 1.
-
git. "1.1 Getting Started - About Version Control". Git Documentation.
https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control, (cited: Mar. 26, 2023). -
git. "1.3 Getting Started - What is Git?". Git Documentation.
https://git-scm.com/book/en/v2/Getting-Started-What-is-Git, (cited: Apr. 26, 2023). -
EaGitro. "Presantation_Git_GitHub_long". GitHub.
https://github.com/EaGitro/Presantation_Git_GitHub_long, (accessed: Aug. 23, 2023).
- https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe
- https://codelikes.com/git-fetch/
- https://backlog.com/ja/git-tutorial/
- https://zenn.dev/kaityo256/articles/inside_the_branch
- https://dev.classmethod.jp/articles/howtogit_forbeginner/
- https://tracpath.com/docs/git-fetch/
- https://www.agent-grow.com/self20percent/2019/01/21/github-pull-request-marge-3-type/
- https://www-creators.com/archives/4931
- https://qiita.com/uasi/items/69368c17c79e99aaddbf
- https://ottan.jp/posts/2019/04/git-basis-beginner-remote-repository/
- https://qiita.com/wann/items/688bc17460a457104d7d
- https://kaityo256.github.io/github/remote/index.html
- https://tech-blog.rakus.co.jp/entry/20220805/git
- https://qiita.com/nt-7/items/c5ea999a2638e03ee418
- https://www.youtube.com/watch?v=f4BRgGAXyek
- https://www.youtube.com/watch?v=_RLmIG8rRIc
- https://aoyama.udemy.com/course/git100test/learn/lecture/29034050#overview
- https://www.r-staffing.co.jp/engineer/entry/20191129_1
