Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Gitまとめ

Last updated at Posted at 2023-03-03

初めに

この記事は新しいLinuxの教科書の備忘録です。
メモ程度に記録していきます。
非常にわかりやすいのでぜひ手に取ってみることをお勧めします。
ここではバージョン管理システムであるGitについてまとめます。

image.png

Gitとは

Gitはファイルの変更履歴を保存し管理するためのバージョン管理システムのことです。
Gitはバージョン管理システムとして広く使われているためほとんどのディストリビューションで提供されています。
※Ubuntuの場合は初めからインストールされていました。(ちなみにMacも)
インストールされているかはgit --versionなどで確認してみてください。インストールされていればバージョンが表示されるはずです。

$ git --version
git version 2.32.1 (Apple Git-133)

インストールする場合はgit-coreというパッケージをインストールします。

$ sudo apt-get install git-core

Windowsの場合は以下のリンクを参考にインストールしてみてください。

Gitの主な機能は二つです。

  • ファイルに対していつ 誰が どのような目的で どのような変更を加えたのかを記録し閲覧できる。
  • 必要に応じてファイルを過去の状態に戻す。

Gitの初期設定

Gitを使う為の初期設定として、ユーザー名メールアドレスの設定を行います。
初期設定にはgit configコマンドを使います。

$ git config --global user.name '<ユーザー名>'
$ git config --global user.email '<メールアドレス>'

ここではGitを使っている人の情報を設定しており、ファイルに変更を加えた際に誰が変更したのかを参照します。

設定した情報は~/.gitconfigファイルに保存されます。

~/.gitconfig
[user]
        name = <ユーザー名>
        email = <メールアドレス>

リポジトリの作成

そもそもリポジトリとは?

Gitがファイル変更を保存している場所のことです。ファイルの変更履歴はすべてこのリポジトリに登録されます。過去のファイルの状態に巻き戻す時にもこのリポジトリから内容を取り出します。

git init

リポジトリの作成にはバージョン管理をしたいディレクトリでgit initコマンドを実行します。
ちなみにバージョンを管理したいディレクトリをワークツリーと言います。Gitはワークツリー内のディレクトリやファイルの変更を管理します。

$ git init

実行したら実行したディレクトリ内に.gitというディレクトリが生成されます。
この.gitディレクトリがGitリポジトリの実体です。
リポジトリ(.git)に保存されたファイルはGitによって特別な形式に変換されているため、エディタなどで直接変更することはできません

リポジトリへ追加

ファイルに何かしら変更を加えたら次にリポジトリへ変更を追加していきます。変更を追加するにはgit addgit commitの二つのコマンドを用います。

git add

git addはどのファイルをリポジトリに履歴として追加するかを指定するコマンドです。

$ git add <ファイル名>

すべてのファイルを追加したい場合は.を指定します。

$ git add .

変更したすべてのファイルをまとめて追加したい場合は-uオプションを用いると便利です。
ただし新規作成して一度もコミットしていないファイルは含まれません。

$ git add -u

新規作成したファイルも含めて編集したファイルをすべて追加したい場合は-Aオプションを使います。

$ git add -A

この時点ではまだリポジトリに変更が登録されていません。
リポジトリへの登録待ちといった状況でしょうか。

git commit

git addで変更履歴を追加するファイルを指定したら、git commitコマンドで実際にリポジトリに変更を追加(反映)します。
git commitする際は-mオプションで修正に対するメッセージを入力します。

$ git commit -m <修正のメッセージ>

ここでGitリポジトリにファイルを変更した内容が登録されます。

深掘り

git addコマンドは追加するファイルを指定するコマンドでしたが、指定するだけではなくインデックスと呼ばれるワークツリーとはまた別の領域に編集したファイルを配置・登録するためのコマンドです。

git commitgit addによって登録されたインデックスの内容をリポジトリに登録するためのコマンドなのです。

リポジトリ説明.png

インデックスはいわばワークツリーとリポジトリを結ぶ橋渡し的な領域といったとこでしょうか。

差分の表示

git status

これは現在のワークツリーの状態を表示するためのコマンドです。

$ git status

変更が加わっているファイルには修正を意味するmodified:と表示されます。

git diff

これは変更の差分を確認するためのコマンドです。
差分はdiffコマンドのユニファイド形式で表示されます。

$ git diff

変更履歴の確認

変更履歴はgit logコマンドで確認することができます。

$ git log

変更履歴は以下の4つが表示されます。

  • commit:コミットを特定する一意のコミットのオブジェクト名(40文字の文字列)
  • Author:変更を加えたユーザ名
  • Date:変更を加えた日時
  • コミットメッセージ

-pオプションを加えることで差分も合わせて確認することができます。

$ git log -p

またgit diffコマンドでコミットのオブジェクト名を指定するとその時の差分を確認することができます。

$ git diff <コミットのオブジェクト名>

復旧

Gitの主な機能として、必要に応じてファイルを過去の状態に戻すという機能がありました。
ここでは復旧を行うコマンドについて紹介します。

ワークツリーの復旧

ワークツリー特定のファイル・フォルダの復旧にはcheckoutコマンドを使います。checkoutコマンドはブランチ移動にも使われるコマンドであるためコマンドの後に-- ファイル名(orフォルダ名)と指定することで変更を無かったことにできる。

$ git checkout --ファイル名
$ git checkout --フォルダ名

ワークツリーの復旧にはワークツリーの一番上のディレクトリに移動し以下のコマンドを実行します。

$ git checkout HEAD .

これにより、ファイルの編集や削除した状態がすべて元に戻ります。またインデックスに追加した内容も取り除かれるので、まだコミットしていない差分が取り除かれ、ワークツリーがリポジトリと同じ状態になります。

コミットの復旧

誤った内容をコミットしてしまった場合は以下のコマンドを実行します。

$ git revert <取り消したいコミットのオブジェクト名>

これによりコミットを打ち消す内容をコミットすることになります。つまり差分を見て手作業で修正を取り除いてコミットすることと同じことをおこなっています。

ブランチ

Gitでは同じファイルを並行して作業を行える機能もあります。片方で新しい機能を開発し、片方でバグの修正を行うようにそれぞれ別の領域で作業を行えます。
Gitのブランチは枝分かれのように表現されます。
スクリーンショット 2023-02-27 21.53.36.png

大元のブランチをmastermainブランチと呼びます。基本的にはこのmastermainブランチにコミットが反映されます。
派生したブランチは任意の名前をつけることができます。
なおGitのブランチは分岐した履歴の先頭にあるコミットを指し示すラベルのことです。

ブランチの確認

ブランチの一覧を見たい場合はgit branchコマンドを使用します。

$ git branch
* master

*がついているブランチ名が今いるブランチです。

ブランチの生成

新しくブランチを作成したい場合はブランチ名を指定することで作成できます。
生成したブランチでテストを行ったり修正をしたりします。

$ git branch <ブランチ名>

ブランチの切り替え

ブランチを切り替えたい場合はgit checkoutコマンドを使います。

$ git checkout <ブランチ名>

ブランチの取り込み

分岐させたブランチの内容を別のブランチに取り込むことができます。ブランチの取り込みをマージと呼びます。
ブランチをマージするには以下の手順で行います。

  1. マージしたいブランチにgit checkoutで移動
  2. git mergeコマンドでマージ
マージ先ブランチに移動
$ git checkout <マージ先ブランチ名>
ブランチをマージ
$ git merge <マージするブランチ名>

ブランチの削除

ブランチの削除にはgit branchコマンドに-dオプションをつけることで削除できます。

$ git branch -d <削除したいブランチ名>

バックアップ

Gitでは変更の履歴はすべてリポジトリに保存されていますが、このリポジトリを間違えて削除してしまった場合はどうすることもできません。このような万が一のために備えてGitではリポジトリのバックアップをとることができます。

バックアップは以下の手順で行います。

  1. バックアップ用のリポジトリの作成
  2. 変更履歴をバックアップ用リポジトリに送る

バックアップ用リポジトリの作成

まずはmkdirコマンドなどを用いてバックアップ用のフォルダを作成します。場所はどこでも良いです。
フォルダ名には最後に.gitをつけてください。

$ mkdir -p .../example.git

作成したフォルダにcdコマンドで移動し、git initコマンドを実行します。
この時--bareオプションを忘れないようにしてください。

$ cd .../example.git
$ git --bare init

--bareオプションはベアリポジトリを作成するためのオプションで、ベラリポジトリは簡単にいうと複製のためのリポジトリのこと。細かくいうと作業ディレクトリを持たないリポジトリのことです。

変更履歴をバックアップ用リポジトリに送る

バックアップ用のリポジトリを作成したら、そのリポジトリに元のリポジトリの内容を送ります。
まずは元のリポジトリに戻ります。
元のリポジトリは.gitフォルダでしたね。移動先は.gitフォルダがあるディレクトリ(ワークツリー)です。

$ cd <元のリポジトリのパス>

移動できたら変更の履歴をgit pushコマンドを用いて送ります。

$ git push <送信先リポジトリ> <送信元ブランチ>:<送信先ブランチ>

送信先リポジトリは先ほど作成したバックアップ用のリポジトリのパスを指定します。
送信元ブランチはバックアップしたいブランチを指定します。
送信先ブランチは送られた送信元ブランチをどのブランチに保存するのかを指定します。

送信元ブランチと送信先ブランチが同じ場合は:を省略できます。

$ git push <送信先リポジトリ> <ブランチ名>:

バックアップ用リポジトリから復元

バックアップしたリポジトリからファイルを復元したい場合はgit cloneコマンドを使います。

$ git clone <複製元リポジトリ>

リポジトリパスに名前を割り当てる

リポジトリパスは非常に長くなる場合があります。そんな場合リポジトリパスに別の名前をつけることでパスの入力を楽にすることができます。
リポジトリパスに別名をつけるにはgit remote addコマンドを使います。

$ git remote add <別名> <リポジトリパス>

別名のところにはoriginという名前を慣習となっています。

割り当てた名前はgit remote -vコマンドで確認できます。

$ git remote -v

別名に置き換えたことで変更履歴をバックアップ用リポジトリに送るコマンドがかなりスッキリします。

別名割り当てる前
$ git push <送信先リポジトリ> <送信元ブランチ>:<送信先ブランチ>
別名割り当て後
$ git push origin master

※masterブランチをバックアップする場合。

ここまでのGitコマンドが理解できればGitHubにアップロードする時に使うコマンドの意味がスッと理解できます。

$ git init
$ git add README.md
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin <GitHubのリポジトリURL>
$ git push -u origin main

以下解説。

$ git init
$ git add README.md
$ git commit -m "first commit"

ここでは自分のローカル環境のgitリポジトリに変更を反映させています。

$ git branch -M main

ここでは今いるブランチの名前を-Mオプションで強制的にmainという名前に変更しています。
オプションについてはこちらを参考してください。

$ git remote add origin <GitHubのリポジトリURL>

ここではバックアップ用のリポジトリであるGitHubのリポジトリURLのリポジトリ名をoriginという名前に変更しています。

$ git push -u origin main

最後に変更をGitHubのリポジトリにpushして反映させています。

リポジトリの共有

これまではGitを使って自分だけのファイル管理を行なっていましたが、実際の業務ではチーム開発のように複数人で開発することがあります。このように共同作業を行う場合にはリポジトリの共有を行い、それぞれのファイル変更を共有して開発を進めます。

スクリーンショット 2023-02-28 23.38.51.png

共有リポジトリは先ほど説明したバックアップ用のリポジトリににています。バックアップ用のリポジトリのリポジトリ名が共有されているといった状況です。
基本は各ユーザが自分専用のリポジトリを持っており、ファイル変更を加えたり、テストを行なったりして、ある程度作業が落ち着いたらgit pushコマンドで共有リポジトリに変更を反映させていきます。

逆に他の人が変更した内容を取り込み自分のリポジトリに反映させるには以下の手順を行います。

  1. git fetchコマンドで他のリポジトリの変更内容を取り込む
  2. git mergeコマンドで自分のリポジトリに変更を反映させる

git fetch

git fetchコマンドは指定したリポジトリの変更を取得できるコマンドです。

$ git fetch <リポジトリ名>

この時取得された履歴はリモート追跡ブランチというブランチに保存されます。このブランチは自分で作成したブランチとは別のブランチで、リモート名/ブランチ名という名前で自動的に作られます。
リモートブランチを表示するには以下のコマンドを実行します。

$ git branch -r

この時まだワークツリーやローカルブランチには反映されていません。

取得した変更を自分のワークツリーやブランチに反映するにはgit mergeコマンドを実行します。

$ git checkout <マージ先のブランチ名>
$ git merge <リモート名>/<ブランチ名>

git pull

  1. git fetchコマンドで他のリポジトリの変更内容を取り込む
  2. git mergeコマンドで自分のリポジトリに変更を反映させる

先ほど説明した上記の手順はセットでよく使われるためこれを一つにまとめたコマンドがgit pullです。

$ git pull <リモートリポジトリ名> <リモートリポジトリのブランチ名>

本格的に共同開発を行う場合は共有リポジトリは同じファオルシステム内に置かないで、ネット上で管理します。
オンライン上でリポジトリを管理するサービスがGitHubなのです。

image.png

参考

新しいLinuxの教科書 三宅英明・大角祐介 著

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?