ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

Gitコマンド備忘録

この記事は都度更新します。
[最終更新]2019/12/09

Gitの基本知識

fetch, pull, pushの挙動

【Git】リモートからの取得とリモートへの反映で行っていること(fetch,pull,push) - Qiita

fetch, mergeの挙動とかを忘れたらコーヒー飲みながら上の記事を読む。

blame

ファイルの各行がいつ変更されたかを知ることができる

git blame [ファイル名]

・例

$ git blame hoge.py
c885c163 (committerName 2017-11-16 11:14:59 +0900  1) # -*- coding: utf-8 -*-
c885c163 (committerName  2017-11-16 11:14:59 +0900  2) def task1():
c885c163 (committerName 2017-11-16 11:14:59 +0900  3)     print("task1")
d9340aa0 (committerName 2017-11-17 12:33:44 +0900  4) def task2():
d9340aa0 (committerName 2017-11-17 12:33:44 +0900  5)     print("task2")

各行のコミット番号、コミッタ、日付時刻、行番号が確認できる。

コミット番号がどういうコミット内容だったかを知るには、showコマンドを使う。

branch

ブランチを確認する
*が付いているものが現在のブランチ

ブランチの確認

git branch
* master
  branchA
  branchB

clone

git clone [リポジトリのURL]

で、リポジトリのフォルダをダウンロードできる。
cloneとダウンロードって何が違うの?というと、cloneはそのプロジェクトのすべてのファイルのすべての歴史が含まれている。つまりコミット履歴などが含まれている。リポジトリからダウンロードするとそれらの歴史が含まれていないので、大抵はcloneする。

conflicts

競合ファイル一覧を表示する。本来の git コマンドには存在しない。

以下のコマンドを実行し、設定ファイルにconflictsコマンドのエイリアスを作成する。

$ git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'

するとconflictsコマンドが使えるようになるので、実行したら競合ファイルの一覧が表示される。

$ git conflicts
src/mods/a.py
src/mods/b.py
web/main.py

checkout

checkoutでできることは大きく2つ。
・ブランチの切り替え
・ファイルを特定の状態に戻す
上2つがなんで同じコマンドなのかは不明。Gitのむかつきどころ。

ブランチの切り替え系

ブランチを切り替える
git checkout [ブランチ名]

ブランチ名の確認の仕方は、branchコマンドの項目を参照。

・例1

git checkout branchA

ブランチをbranchAに切り替える

・例2

git checkout -f branchA

ブランチを強制的にbranchAに切り替える
作業ツリーとインデックスの変更は破棄される

ブランチ作成と切り替えを同時に行う
git checkout -b branchC

あんまり使ったことない

ファイルを特定の状態に戻す系

ファイルを特定のcommitの状態に戻す

https://qiita.com/ritukiii/items/5bc8f74dbf4dc5d1384c

git checkout [コミット番号] [ファイルパス]

この操作は非常に使える。
例えばバグが発生したとき、どこのコミットからバグが発生したか調べるときに、ひとつひとつコミット番号を戻しながら使ったりする。

・コミット番号の調べ方
GitHubのページでファイルを開けばコミット番号が書いてある。
あるいはlogコマンドの項目を参照。

・例1

git checkout [コミット番号] hoge.txt

hoge.txtが[コミット番号]のときの状態に戻る

・例2

git checkout [コミット番号] .

全てのファイルが[コミット番号]のときの状態に戻る

・ 例3

git checkout HEAD -- hoge.txt

hoge.txtの現在の変更を破棄して、最新状態(HEAD)に戻す。

--の意味は「--以降の文字列をオプションとして扱わない」で、これにより-が混ざったファイル名を扱えるようになる。

・例4

git checkout HEAD^ -- hoge.txt

hoge.txtを1つ前のコミット(HEAD^)の状態に戻す。

log

コミット履歴を確認する

> git log
commit c4adc034f65a53d85b3fa8270e0e8239e4d45518
...

commit 8601edcfa95c72bf10c3b4479b59f1ffe488c5a0
...

ファイルのコミット履歴を確認する

$ git log --oneline hoge.txt
13aed9b (HEAD -> master, origin/master) updated
c4adc03 fix: 
8601edc fix: coding: utf-8

checkoutでファイルを特定のコミット状態に戻すときに便利

全体のコミット履歴を確認する

$ git log --oneline
13aed9b (HEAD -> master, origin/master) updated
c4adc03 fix:
ce5dd9d Update

reset

ステージを取り消す(addしたものを取り消す)

$ git reset HEAD [ファイル名]
$ git reset HEAD hoge.py

特定コミット状態に戻す

動作確認のためなど、過去のコミット状態を再現したいときは以下のようにする

git log  # コミットのハッシュ値を確認
git reset --hard 昔のコミットのハッシュ値

特定コミット状態から最新の状態に戻るには、

git reset --hard ORIG_HEAD

show

・ファイルの内容を見る
・コミットの差分を見る
上の2つの操作が同時にできる

そのコミット番号のときの変更を表示する

git show [コミット番号]

バグが発生したコミットを指定することで、ソースのどこが原因か追跡するのに便利。

$ git show c885c163
commit c885c1630f1a9f68ddf20c2583691eb999999999
Author: committerName <committer@mail.com>
Date:   Thu Nov 16 11:14:59 2017 +0900

    2017/11/16
    * Fix: センサ変更によるInput Errorを修正.

diff --git a/project/src/mymod/hoge/hoge.py b/project/src/mymod/hoge/hoge.py
index eeea885..71daae6 100755
--- a/src/updater.py
+++ b/src/updater.py
@@ -8,7 +8,6 @@ from mymod.sensor.am2320    import AM2320
-import time
 import datetime

最初にコミットメッセージが表示され、次にそのコミットによる変更のdiffがファイル毎に表示される。

ここでコミットメッセージに変更理由をきちんと書いていれば何を意図して変更したのかよくわかり、バグフィックスが容易になる。(コミットメッセージはちゃんと書こう)

特定のファイルのみshowしたいとき

$ git show [コミット番号]:[ファイル名]

・例

$ git show c8a5c163:src/mymod/sensor/am2320.py
import sys
sys.path.append("/project/src")
from mymod.const                import const
from mymod.helper               import helper
import datetime

class AM2320():
    """ センサAM2320のクラス """

そのコミット番号のときのファイルの内容が表示される。

stash

作業ツリー(とインデックス)の変更を、コミットせずに一時的に保存する。
スタッシュと呼ばれる領域に一時的に保存する。

作業ツリーとインデックスを一時的に保存する

$ git stash

作業ツリーを一時的に保存する(インデックスは保存しない)

$ git stash --no-keep-index

メッセージ付きで一時的に保存する

$ git stash save "message"

$ git stash save "fix: Change version"

スタッシュに保存したものの一覧

$ git stash list
stash@{0}: On master: fix: Change version
stash@{1}: WIP on master: 37c38ad fix: バグを修正

上に行くほど直近のスタッシュ。

スタッシュに保存した内容を作業ツリーに戻す

$ git stash apply <stash>
()
$ git stash apply stash@{0} 

スタッシュを指定しない場合、直近のスタッシュに戻る
技術評論社の ポケットリファレンス には「スタッシュを指定しない場合、直近のスタッシュが削除される」と書いてあるが、実際にはそのような動作はしなかった)

スタッシュに保存した内容を作業ツリーに戻した後、そのスタッシュを削除する

$ git stash pop <stash>
()
$ git stash pop stash@{0} 

使い方はapplyと同様。どちらか覚えれば良い。

スタッシュの削除

$ git stash drop <stash>
()
$ git stash drop stash@{0}

スタッシュを指定しない場合、直近のものが削除される

スタッシュの全削除

$ git stash clear

参考

  • Git ポケットリファレンス[改訂新版]