6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RCC (立命館コンピュータークラブ)Advent Calendar 2024

Day 8

このコマンドを知っていれば作業はできる????っていうGitコマンドをまとめてみる

Posted at

大半の企業や開発では、みなさんGitやGitHubを使っていると思います。

ですが、開発学びたての頃とかはあまり使い方がわからなかったりして、友達とハッカソンを出るときに困ったりすることが多いと思います。

今回は、個人の見解ではありますがこのコマンドを知っていれば作業ができるのではないかというGitの基本的なコマンドをまとめてみようと思います。

そもそもGitとは

Gitは、分散型バージョンシステムと呼ばれるものです。
ソースコードをのバージョンを管理して簡単に戻したり、複数のバージョンを確保して並行で進めたりと開発を効率化させるために生まれました。

Githubとの違いは?

Githubは、インターネットを介してGitで管理しているソースコードやデザインなどを共有することのできるwebサービスです。

Gitはローカルデバイス(自身のパソコン等)で管理するのに対して、Githubはインターネット上で管理できるという違いがあります。

Gitコマンド一覧

Gitの操作はCLI上でコマンドで行います。

SourceTreeなどGUIで操作することもできますが、個人的にはコマンドの方が問題解決に関する情報が多いので、コマンドに慣れておくことをお勧めします。

リポジトリの初期化

リポジトリの初期化の前にまずcdコマンドでGitに反映させたいプロジェクトのルートディレクトリに移動します。

その位置でinitコマンドをすることでgitリポジトリを初期化することができます。

git
git init

initコマンドを使った現在いるディレクトリ(作業ディレクトリ)に.gitが作成されます。
.gitディレクトリにはgitのメタデータが入っており、それがリポジトリの役割を担うことになります。
新しいブランチ(mainブランチ)も作成されます。

ベアリポジトリとノンベアリポジトリとは

ドキュメントを読むとベアリポジトリとノンベアリポジトリという用語が出てきます。
ベアリポジトリとノンベアリポジトリの違いは、作業ディレクトリがあるかどうかになっています。

リポジトリ 作業用ディレクトリ 用途
ベアリポジトリ なし 更新管理用
ノンベアリポジトリ あり 作業用ディレクトリ

Githubで作成するリモートリポジトリはベアリポジトリ
initコマンドで作成するローカルリポジトリはノンベアリポジトリに当たります

ローカルリポジトリのファイル状況を確認する

リポジトリで管理しているファイルは状態が付与されます。

まずファイルには、untrackedとtrackedという状態があります。
これはリポジトリがそのファイルを追跡しているか(管理しているかを表しています。

そこからtrackedにはUnmodified,Modified,Stagedの3つ状態があります。

状態 意味
Untracked 未追跡のファイル
tracked 追跡済みのファイル
Unmodified 追跡済みかつ変更されていない
Modified 追跡済みかつ変更されている
Staged ステージされている

これらを確認するにはstatusコマンドを使います。

git
git status

初期状態では、このようになっておりファイルには何もない状態と表示されます。

zsh
nothing to commit, working directory clean

もしファイルに変更があれば下のように表示されます。
表示されているようにREADMEというUntracked、未追跡のファイルがあることがわかります。

zsh
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

もしtrackedのファイルを修正していた場合は下のように表示されます。

git
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

ファイルをステージングする

UntrackedTrackedに変える、Modifiedでステージングされていないものはaddコマンドでstagedに持っていきます。
このことをステージングと言います。

とは言ってもステージングはわかりにくいと思います。

ステージングは、コミット前にコミットする対象を選ぶことと認識すると良いと思います。

addコマンドは下のように使います。

git
git add <file_path>

ここでstatusコマンドで状態を表示すると、もしUntrackedTrackedに変えた場合は下のように表示されます。

zsh
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

Trackedであったファイルをステージングすると下のようになります。

zsh
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   CONTRIBUTING.md

git add .は無闇に使わない

下のコマンドで全ての変更ファイルをステージングできます。

git
git add .

非常に便利ですが、意図しないファイルをステージングしてしまうので、無闇に使わないようにしましょう。

変更の差分を見る

diffコマンドで、ステージされていないファイルの変更した部分を確認することができます。

git
git diff

すると下のように変更されたファイルは+++、元のファイルの状態は---と表示されます。

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md

ステージされているものを見る場合は下のコマンドになります。

git
git diff --staged

変更のコミット

先ほど出てきたコミットという動作をするにはcommitコマンドを使います。

git
git commit -m "message"

-mはコメントをつけるオプションです。

-mをつけなかった場合

もしコメントをつけずにcommitした場合は下のようにエディタが立ち上がってしまいます。

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#	new file:   README
#	modified:   CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C

エディタを立ち上げるよりは-mでコメントを書いてしまった方が早いので、-mで書いてしまいましょう。

-aをつけることで、addコマンドを省略してコミットすることもできます。

git
git commit -m -a "message"

非常に便意なコマンドですが、変更したファイルを全てステージに持っていってしまうため、意図しないファイルを追加する可能性があります。

できるだけ、addコマンドでファイルを指定しましょう。

リポジトリからファイルを削除

リポジトリかつ作業ディレクトリからファイルを削除したいときは、rmコマンドで削除します。

git
git rm <file_name>

作業ディレクトリには残したい場合は--cachedを使います。

git
git rm --cached <file_name>

このコマンドは間違えて.vscode.idaなど、エディタの設定ファイルや、.envなどのリポジトリに含めたくないファイルをステージングやコミットしてしまった時に使います。

rmを使わないために

.gitignoreでファイルを無視することも可能です。

下のようにルートディレクトリに下のように記述したら.envは無視されます。

.gitignore
.env

ブランチの一覧・作成・削除

ブランチの一覧・作成・削除はbranchコマンドを使います。

  • ローカルブランチ一覧
git
git branch
  • リモートブランチ一覧
git
git branch -r
  • 全てのブランチ一覧
git
git branch -a
  • 作成
git
git branch <branch_name>
  • 削除
git
git branch -D <branch_name>

ブランチの変更・作成

ローカルリポジトリにおいてブランチの移動をするにはswitchコマンドを使用します。

git
git switch <branch_name>

ブランチの作成には-cオプションで行うことができます。

git
git switch -c <branch_name>

checkoutとswitchの使い分け

switchで行える作業は、元々checkoutで行っていました。

ただ、checkoutは作業ディレクトリをリセットしたり、コミット履歴を戻したりなど色々な操作が必要になるため、かなりややこしいコマンドになってしまっていました。

これを解決するためにブランチの移動をswitchが作られました。

なので、できるだけブランチの移動はswitchで行いましょう。

別ブランチと現在のブランチを結合する(マージ)

別ブランチにあるコードと現在にあるブランチにいい感じに反映させたいとなった場合は、mergeコマンドを使います。

git
git merge <branch_name>

mergeには種類が3つほどあります。

1つは、fast forwardで親ブランチの先に派生ブランチのコミットがやってきます。

これは、親ブランチから派生した後、親ブランチの変更が何もない場合に簡単にfeatureブランチの取り込みが行える時に起きます。

image.png

image.png

2つ目は、Automergeです。
二つのブランチが同時刻において別々の変更があった場合に、両方のブランチのコミットを取り込むことができます。

image.png

3つ目は、conflictです。
上で紹介したautomergeを行った場合に、変更差分が重複してGitがよしなにコミットを取り込めない状態を指します。
image.png

リモートリポジトリを設定

Githubなどのリモートリポジトリにローカルリポジトリの状況を反映させるために、ローカルリポジトリにリモートリポジトリの情報を設定します。

remote addコマンドを使って設定します。

git
git remote add <repo_URL>

リモートリポジトリのURLは、Githubのソースコードが確認できるリポジトリのページの下のところから確認します。

image.png

リモートリポジトリにプッシュ

Githubなどのリモートリポジトリにデバイス上にあるローカルリポジトリの内容を反映させるには、pushコマンドを使います。

git
git push <remote_repository> <branch_name>

例えばoriginと登録したリモートリポジトリのmainブランチにpushするには下のように行います。

git
git push origin main

リポジトリをクローンする

共同開発する場合は代表の人がリポジトリを作成してGithubにあげる、そしてそれを自分のローカルのパソコンに持ってくるという作業が必要になります。ローカルのパソコンにリモートリポジトリを持ってくることをクローンと言います。

クローンは下のコマンドで行います。

git
git clone <repo url>

URLはHTTPSSSHなどあります。

HTTPSって?

HTTPを使った通信をSSLやTLSといった暗号方式を使って、通信を暗号化する通信プロトコル(方法)のことです。

SSHって?

手元にないリモート上のコンピューターと接続するためのプロトコルをSSHと言います。
Gitでは、公開鍵暗号認証を行うことで、安全に通信することができます。

リモートリポジトリの状態を持ってくる(フェッチ)

リモートリポジトリのデータを持ってくるにはfetchコマンドを使います。

これをすることでリモートリポジトリのブランチの情報やリモートとの差分を確認するようにできるようになります。

git
git fetch

リモートリポジトリのコードをプルする

リモートのリポジトリをブランチをフェッチして、マージするにはpullコマンドを使います。

git
git pull origin <ブランチ名>

ここで注意したほうがいいこと

経験則ではありますが、なるべくfetchコマンドを打ってからcloneしたほうがいいと思っています。

cloneしたのに何故かリモートリポジトリの状況と一緒にならないということが起きたりします。

なのでできるだけfetchしてからcloneするようにしましょう。

ケース一覧

先ほどあげたコマンドで実際にどのように操作していくのかをケース毎に紹介したいと思います。

全てのケースを網羅はできておらず先ほど紹介したコマンドの中でも使ってないものもありますが、参考にしていただきたいです。

個人でリポジトリを作って管理する場合

Githubでリポジトリを作成する。

リポジトリをinitコマンドで作成する

git
git init


remote addでリモートリポジトリを追加する

git
git remote add <url>


addコマンドを使って現在の状態をステージング

git
git add <file>


commitコマンドでローカルリポジトリに反映

git
git commit -m "messageを書く"


pushコマンドでリモートリポジトリに反映

git
git push origin <branch>

共同開発で管理する場合

リモートブランチをクローンして作業

GithubからリポジトリのURLをメモする

cloneコマンドでクローンする

git
git clone 


switchコマンドでブランチを分ける

git
git switch -c feature/<name>


作業する

addコマンドを使って現在の状態をステージング

git
git add <file>


commitコマンドでローカルリポジトリに反映

git
git commit -m "messageを書く"


pushコマンドでリモートリポジトリに反映

git
git push origin <branch>


GithubでPRを作成して統合用ブランチ(mainとかdevelop)にマージする
image.png

統合用ブランチに移動する

git
git switch <branch_name>
git fetch


統合内容を反映する

git
git pull origin <branch_name>

統合用ブランチの状態を作業ブランチにマージする

上記で作業しているときに統合用ブランチに入った変更を現在の作業ブランチに持ってきたい時のケースを紹介します。(コンフリクトは起きてない前提です)

統合用ブランチに最新の情報を引っ張ります。

git
git fetch

もしくはローカルの統合用ブランチにpullします。

git
git switch <branch_name>
git pull origin <branch_name>


作業ディレクトリにいる状態でマージします。branch_nameには統合用ブランチを指定します。

  • ひとつ前でfetchを使った場合
git
git merge origin/<branch_name>
  • ひとつ前で統合用ブランチにリモートの状態を反映させた場合
git
git merge <branch_name>

まとめ

コマンド一覧は以下のようになっています。

コマンド 機能
add ファイルをステージング
status 変更のあるファイルを確認
branch ブランチの一覧・作成・削除
switch ブランチに移動と作成
merge いい感じにブランチを結合
rm ファイルをリポジトリから削除
remote add リモートリポジトリのURLを設定
push リモートリポジトリに反映
clone リモートリポジトリを持ってくる
fetch リモートリポジトリの状況を持ってくる
pull リモートリポジトリの状況を反映
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?