(2024-01-05更新)
Gitの使い方がわからなくなるのでよく使うコマンドを自分用にメモしています。
目次:
- 最初にやっておくこと: ユーザ名とメールアドレスの設定
- コミットしてしまったユーザー名、メールアドレスを変更する
- リポジトリの設定
- ログを表示する
- 戻す
- 変更を退避する(棚上げにする)
- ステージング
- コミット
- ファイルを削除する
- ブランチ操作
- タグ操作
- リモート操作
- コマンドラインツール
- Windowsで使う
- SHA1 値とオブジェクト
最初にやっておくこと: ユーザ名とメールアドレスの設定
- 全体設定 -
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 add
や git 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つ以上前のコミットメッセージを変更する
git rebase -i HEAD~3
(3つ前のコミットの場合)- エディタで表示されたコミットのうちメッセージを変えたいものの
pick
をedit
に変え、保存して閉じる git commit --amend
- 表示されたエディタでメッセージを変更し、保存して閉じる
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 … 現在のビューを最新状態に更新する
コミット時の操作:
- コードを修正する
- tigを起動する
- sでステータスビューに切り替える
- カーソル上下(矢印またはj, kキー)でステージングに入れたいファイルにカーソルを合わせる
- uでステージングに入れる(もう一度押すと解除される)
- Cでコミット
- エディタが立ち上がるのでコミットメッセージを書く
- qキーを何度か押すと終了する
参考資料:
BashでGitのコマンドが補完できるようにする
git-completion.bash
を取得する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
で消える