はとのーと

エジソンノート(アイデア、思い付き、メモ)として使っています。誰かの役に立つかもしれないので公開しています。

Gitの使い方メモ

(2024-01-05更新)

Gitの使い方がわからなくなるのでよく使うコマンドを自分用にメモしています。

目次:

最初にやっておくこと: ユーザ名とメールアドレスの設定

  • 全体設定 - git config --global user.name "ユーザ名" git config --global user.email メールアドレス
  • ローカル設定 - git config --local user.name "ユーザ名" git config --local user.email メールアドレス

コミットしてしまったユーザー名、メールアドレスを変更する

Git の Commit Author と Commiter を変更する - Qiita

リポジトリの設定

改行コードの設定

git addgit commit 時に以下のようなメッセージが表示された場合、改行コードが変換されている。

warning: LF will be replaced by CRLF in myfile.
The file will have its original line endings in your working directory.

warning: CRLF will be replaced by LF in myfile.
The file will have its original line endings in your working directory.
改行設定を全体に設定する
git config --global core.autocrlf true/false/input
改行設定をリポジトリに設定する
git config --local core.autocrlf true/false/input
改行設定
  • true: コミット時に CRLF→LF, チェックアウト時に LF→CRLF
  • input: コミット時に CRLF→LF, チェックアウト時は何もしない
  • false: 何もしない

上記より、Linuxの場合は input, Windowsの場合は true がよい。

テキストとバイナリのタイプを設定する

バイナリファイルが書き換えられてしまう場合には ~/.gitattribute に書き込むことで回避できる。

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
日本語ファイル名のエスケープ(\nnn)表示を避ける

日本語ファイル名が\nnnエスケープされる場合には次のようにすると回避できる。

git config --global core.quotepath false  # 全体に設定
git config --local core.quotepath false   # リポジトリに設定

ログを表示する

ログメッセージとともに追加・変更・削除したファイル名を表示する
git log --name-status
現在のリポジトリに対して行った操作のログを表示する
git reflog
リビジョンの指定方法
  • SHA-1ハッシュ - ハッシュが表すコミット
  • HEAD - 現在のブランチの最新のコミット
  • HEAD~, HEAD~1 - HEADの1つ前のコミット
  • HEAD~n - HEADのn個前のコミット
  • リビジョン1..リビジョン2 - リビジョン1からリビジョン2の範囲

SHA-1ハッシュは他のハッシュと区別できる場合には後ろを切って短くしてよい。

HEAD^も1つ前のコミットを表すが、HEAD^2は複数の親がある場合に2番目の親を表す。 詳しくは次の記事を参照: 【やっとわかった!】gitのHEAD^とHEAD~の違い - Qiita

戻す

ローカルで変更したファイルを元に戻す
git checkout ファイル名    # 特定のファイルを戻す
git checkout .           # すべてのファイルを戻す

変更を退避する(棚上げにする)

  • git stashは変更を退避し後から戻せるようにする。
  • ステージングされたファイルが退避の対象となる。
  • 退避後、ワーキングディレクトリの内容はHEADの状態に戻る。
変更を退避する
git stash save
git stash save "コメント"
退避した変更の一覧を見る
git stash list
退避した変更内容を見る
git stash show stash@{n}
退避した内容に戻す
git stash apply stash@{n}
指定したファイルのみ退避した内容に戻す
git checkout stash@{n} ファイル名

stash は入らないので注意。

退避した変更を削除する
git stash drop stash@{n}

ステージング

git addしたものを戻す (ステージから外す)
git reset foo.txt
git addしたものの差分を表示する
git diff --staged
git diff --cached

コミット

コミットしたものを元に戻す
git reset --soft HEAD^

--soft でローカルファイルが現在のままになる。 --hard にするとローカルファイルが前コミットの状態に戻る。 HEAD^ はHEADの1つ前という指定。

直前のコミットを変更する
git add foo.txt                   # ファイルを修正した場合
git commit --amend                # エディタでコメントを修正する
git commit --amend -m "コメント"  # コマンドラインでコメントを指定する
git commit --amend --no-edit      # コメントを変更しない
2つ以上前のコミットメッセージを変更する
  1. git rebase -i HEAD~3(3つ前のコミットの場合)
  2. エディタで表示されたコミットのうちメッセージを変えたいもののpickeditに変え、保存して閉じる
  3. git commit --amend
  4. 表示されたエディタでメッセージを変更し、保存して閉じる
  5. git rebase --continue

参照: Gitのコミットメッセージを後から変更する方法をわかりやすく書いてみた | 株式会社グランフェアズ

ファイルを削除する

普通にファイルを削除する
git rm foo.txt
ファイルを残してリポジトリからのみ削除する(gitの管理下から外す)

--cached をつける。

git rm --cached foo.txt    # ファイル foo.txt は削除されずに残る

ブランチ操作

存在するブランチを確認する
git branch
過去に存在したブランチを確認する
git reflog | grep checkout    # チェックアウト履歴を表示する
git reflog | grep merge    # マージ履歴を表示する
ブランチを作成する
git branch ブランチ名

※ブランチを作成しても新しいブランチに自動的に切り替わらないので注意。

過去のコミットからブランチを作成する
git checkout -b ブランチ名 ハッシュ
ブランチを切り替える
git checkout ブランチ名
ブランチでの変更を1コミットにまとめてマージする
git merge --squash ブランチ名
ブランチを削除する
git branch --delete ブランチ名

--squash つきでマージしたブランチを削除しようとすると次のようなエラーが表示される。 (ここではブランチ名は develop)

git branch --delete develop
error: The branch 'develop' is not fully merged.
If you are sure you want to delete it, run 'git branch -D develop'.

この場合は --delete --force (両方を合わせて -D) で削除する。

git branch -D develop
Deleted branch develop (was 805fa27).
親のないブランチを作成する

ワークディレクトリで実行する。前のファイルがaddされた状態で残っているのでgit rmで削除する。

git checkout --orphan ブランチ名
git rm -rf .
rm -rf *

コミット後にpushする場合は次のようにする。

git push --set-upstream origin ブランチ名

タグ操作

存在するタグを確認する
git tag
タグの内容を確認する
git tag タグ名
タグを作成する

タグは特定のコミットに対して付けられる。 コミットを指定しなかった場合は現在のブランチの最新のコミットに対して付けられる。

タグには軽量タグと注釈つきタグがある。

  • 軽量タグ
    • 名前を付けられる
  • 注釈つきタグ
    • 名前を付けられる
    • コメントを付けられる
    • 署名を付けられる

一般的には軽量タグはローカルで一時的に使う。 リリースタグとしては注釈つきタグを使う。

# 軽量タグを作成する
git tag -a タグ名

# 注釈つきタグを作成する
git tag -a タグ名 -m "タグのコメント"
タグを削除する
git tag -d タグ名
タグをリモートに送る

git push origin master してもタグは送られない。

# 特定のタグを送る
git push origin タグ名

# すべてのタグを送る
git push origin --tags
タグをリモートから削除する
git push --delete origin タグ名

リモート操作

上流の変更点を取り込む
git pull
上流に変更点を送る

ローカルブランチmasterの内容をリモートリポジトリoriginの同名ブランチに反映する。

git push origin master
共有リポジトリを作成して上流として登録する

以下では共有リポジトリの場所を URL.git と表示。 (慣習として共有リポジトリには拡張子 .git を付ける)

#共有リポジトリを作成
git init --bare --shared URL.git

#originとして登録
git remote add origin URL.git

#確認
git remote -v
origin  URL.git (fetch)
origin  URL.git (push)

#push (初回のみ --set-upstream が必要)
git push --set-upstream origin master

コマンドラインツール

CUIクライアントtig

tigはGitのCUIクライアントで、Git for Windowsにも含まれている。

基本的なコマンド:

  • h … ヘルプを表示する
  • q … 現在のビューを閉じて以前のビューに戻る
  • l … ログビューに切り替える
  • s … ステータスビューに切り替える
  • R … 現在のビューを最新状態に更新する

コミット時の操作:

  1. コードを修正する
  2. tigを起動する
  3. sでステータスビューに切り替える
  4. カーソル上下(矢印またはj, kキー)でステージングに入れたいファイルにカーソルを合わせる
  5. uでステージングに入れる(もう一度押すと解除される)
  6. Cでコミット
  7. エディタが立ち上がるのでコミットメッセージを書く
  8. qキーを何度か押すと終了する

参考資料:

BashでGitのコマンドが補完できるようにする
  1. git-completion.bash を取得する
  2. git-completion.bash~/.bashrc で読み込むようにする
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash
echo "source ~/.git-completion.bash" >> ~/.bashrc
source ~/.bashrc

Windowsで使う

Windows上でも基本的には問題なく使える。

Git Bashでファイル名が \xxx の羅列になる場合には次の設定をする。 (全環境で有効にするには --local

#現在のローカルリポジトリのみ有効にする
git config --local core.quotepath false

#全環境で有効にする
git config --global core.quotepath false

なお、使用する外部エディタによっては文字コードUTF-8 にする設定が必要になる場合がある。

参考資料: Git for Windows で日本語を使いたい - Qiita

SHA1 値とオブジェクト

Gitのリポジトリの中身をなるべく正確に理解する | To Be Decided

  • HEAD はコミットを指し示す
  • コミットはファイルツリーと前コミットの情報を持つ
  • ファイルツリーはサブディレクトリを表すファイルツリーか、ファイル内容が格納されているオブジェクトの SHA1 ハッシュ値の情報を持つ
  • git remote で登録し git fetch するとリモートリポジトリのすべてのコミットがローカルに入る
  • HEAD は .git/refs/heads/ 以下に格納されている
  • オブジェクトは .git/objects 以下に格納されている
  • コミット、ファイルツリー、オブジェクトの内容を表示するには git cat-file -p {SHA1 ハッシュ値} とする
  • 到達できなくなったコミットは git gc で消える