この記事は都度更新します。
[最終更新]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 ポケットリファレンス[改訂新版]