[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#menu(howto/MenuBar)
* howto/git [#wa6b0ec5]
#contents
** 一行メモ [#b3117386]
- git clone コピーしたい作業ディレクトリ [ディレクトリ名]...
-- ブランチは、現在のブランチしか作られないので、必要に応...
-- 例) $ git clone gmx_chignolin gmx_chignolin2 -- &new{...
- git clone ssh://username@hostname/home/username/hogehog...
-- cloneはできるが、pushは通常できない(する方法もあるよ...
- ブランチ名を、hoge/fuge のように /を含めることができる...
- mergeしたときの変更内容の差分をみる -- &new{2023-01-13...
git diff eaad7c8 254b87b d3087fd #changes when mer...
git diff -U10 eaad7c8 254b87b d3087fd #changes when mer...
違いが出るのはなぜか?
- git subtree https://golden-lucky.hatenablog.com/entry/2...
- git fetch -p とは? -- &new{2023-09-14 (木) 10:27:27};
- ディレクトリ毎にgitconfigを変える https://maku77.github...
- gitk master_20220310..master_20230403 -- nameless_psio...
- ファイルの各行を誰がいつ追加したかを調べる -- &new{202...
$ git blame -w make_widget.py
$ gitk --all make_widget.py
ファイルからファイルにコードが移動している場合などはこち...
$ git blame -w -C -C -M make_widget.py #-Cは1個は不十...
#comment
//=======================================================...
* はじめてのGit [#ec3c01dd]
こちらへ [[howto/git/forthefirsttime]]
//=======================================================...
* COLOR(RED){リマインド}・COLOR(RED){注意事項} [#m116a942]
- [[コミットするときの注意点>#anchor1]]
- [[最初設定すると良いこと>#anchor2]]
//=======================================================...
* The entire Pro Git book, written by Scott Chacon and Be...
https://git-scm.com/book/ja/v2
ここからダウンロード(2021/04/15)したPDF版のファイル
(ただしそのままでは不具合があるようだったので、macOSのプ...
2nd Edition (2014) のファイルです。
なお、旧版はDownloadsメニューにあるらしい。
このPDFは Scott Chacon and Ben Straubにより書かれたもので...
ライセンスは [[CC BY-NC-SA 3.0>https://creativecommons.or...
- 表紙と3章のみ
#ref(progit.chap3.pdf)
- 全て
#ref(progit.all.pdf)
以下は古いもの。
- 2016/12/19
#ref("progit-ja.1016.chap1-3,5.pdf")
- 2017/04/08
#ref(progit-ja.898.pdf)
//=======================================================...
* ファイルの追加・名前変更・削除 [#q7d3dc85]
** ファイルを追加(追跡対象にする) [#b2f33658]
例)
git add . # カレント以下のファイル(ディレクトリ...
git add ファイル # ファイルをステージに追加する
git add -u # 追跡対象のファイルで修正があったもの...
- 新規にファイルをステージに追加する(載せる)と、そのフ...
- サブディレクトリに cdしてから addすることも可能。
- 空ディレクトリは addできないので習慣的に .gitkeepを置く。
例) find . -type d -empty -not -path './.git*' -exec t...
- シンボリックリンクも addできる。
- add -f オプションは .gitignoreを無視してファイルを追加...
** ファイル名変更 [#h7dc6c52]
mv 変更前のファイル名 変更後のファイル名
git add 変更前のファイル名 #削除した(無くなった)ことを...
git add 変更後のファイル名
#gitとしては、削除されて、新しい名前で追加する形の操作と...
または
git mv 変更前のファイル名 変更後のファイル名
** ファイルの削除 [#sf470bf1]
rm ファイル名
git add ファイル名
#gitとしては、削除したファイル名、無いファイル、を追加す...
または
git rm ファイル名
削除するファイルが、ステージに載っている場合は --cached...
git rm --cached ファイル名 #ステージから削除し、ファイ...
- 補足
-- ステージから取り除く
git reset HEAD ファイル名 #ステージのファイルが削除され...
-- ファイルの変更を取り消す(元に戻す)
git checkout -- ファイル名 #作業ディレクトリのファイル...
-- git rm を取り消す
git reset HEAD ファイル名 #ステージのファイルが削除さ...
git checkout -- ファイル名 #作業ディレクトリのファイル...
-- あるSHA1のファイルを作業ディレクトリに上書きして入れる
git checkout sha1 -- hoge.c #作業ディレクトリに上書き、...
git reset HEAD hoge.c #ステージのものを作業ディレ...
//=======================================================...
* ファイルの変更維持 [#o73f3ddf]
ファイルを更新したが、その更新を維持したままにする(git ...
git update-index --skip-worktree ファイル名 # 更新...
git update-index --no-skip-worktree ファイル名 # 登録...
git ls-files -v | grep ^S # skip-worktreeしたファイ...
- 補足
git ls-files -o #カレントディレクトリ以下で、追跡され...
git ls-files -o --exclude-standard #git ls-files -o の...
//=======================================================...
* git commit, reset, clean, merge [#o24116ff]
&aname(anchor1);
*** COLOR(RED){コミットするときの注意点} [#z10719ad]
-「5.1 Git での分散作業 - 分散作業の流れ」, Pro Git book ...
-- コミットの単位が論理的に独立した変更となるようにしまし...
修正した問題ごとにコミットを分割し、それぞれに適切なコ...
⇒ むずかしいのでほどほどで対応すればよい。
-- コミットメッセージ:~
最初には変更の概要を一行 (50 文字以内)+空行+詳しい説...
現在形を使うようにしています。つまり “私は○○のテストを追...
“○○のテストを追加します (Adding tests for,)” ではなく “○○...
形式にする。
⇒ COLOR(RED){コミットメッセージは英語}でする。日...
&aname(anchor2);
*** COLOR(RED){最初設定すると良いこと} [#ya10522a]
git config --global user.name "yourname" # 実行する...
git config --global user.email "youremail" # --global...
git config --global core.editor emacs
git config --global push.default simple # simple(...
git config --global credential.helper 'cache --timeout=1...
...
** commit [#ub1f9dca]
git commit -m 注釈 # ステージ済みをコミットする
git commit -a -m 注釈 # 追跡対象(のみ)をステージして、...
- commit -m オプションが無いときは、エディタが立ち上がる...
注釈を「1行目をタイトル+空行+内容」とできる。-mを付け...
- コミットのやり直し
git commit --amend -m 注釈 # 直前のコミットを上書きする...
# ただし、push前であること。...
** reset [#xf3a06e4]
git checkout -- ファイル名 #作業ディレクトリのファイル...
#(ファイルに変更があれば、...
git reset HEAD ファイル名 #ステージのファイルが削除さ...
#(作業ディレクトリのファイ...
git reset --hard #現在のブランチを、チェックアウトの...
#(ファイルに変更があれば、失われる)
- ローカルリポジトリを消して良い場合、再度cloneした方が楽...
** clean [#m0ed97d1]
- 作業ディレクトリ内で、カレントディレクトリにある不要な...
git clean -n で確認して、 git clean -f で追跡対象以外(...
なお、
- カレントディレクトリ以下のディレクトリ内も対象にすると...
- gitignoreで無視しているファイルも消すときは - xを付ける
- 対話的に消したいときは -iを付ける
** merge [#m4be4fdd]
COLOR(RED){dry-run的なことをして確認後、マージをコミット...
現在のブランチに、指定のブランチをマージ
$ git merge --no-commit --no-ff [リモートリポジトリ/]ブ...
#コミットしない、fast forwardでもコミットし...
これで、マージされた結果はステージに載るので、
$ git diff --cached
で結果を確認できる。コンフリクト(競合)していたらその旨が...
そして、
(a) このマージを取り消したければ、git merge --abort をす...
(b) そのままコミットしたければ git commit -m "merge bran...
又は git merge --abort 後に git merge [リモートリポ...
- マージは、ブランチに他のブランチを融合(マージ)する形...
git merge [リモートリポジトリ/]ブランチ # 現在のブラ...
# (コンフリ...
よくある例)
masterブランチを修正して commitした。pushすると、origi...
いたため rejectされた。この場合は次のようにする。
$ git fetch
$ git merge --no-commit --no-ff origin/master
ここでコンフリクトを手動で解消
$ git add 解消したファイル
$ git commit -m "merge branch origin/master into master"
$ git push
-- 補足
--- git merge はオプション無しだと、自動的にコミットされ...
- コンフリクトの解消
-- COLOR(RED){こちらの修正方法が素直で単純}
単純なコンフリクトの場合は、ファイルにコンフリクトの内容...
<<<<<<< HEAD
ほげほげ
=======
ほげほげ
>>>>>>> SHA1
と書き込まれているので、エディタで修正して、保存する。そ...
-- 複雑なとき?
コンフリクトが出たとき
git show :1:ファイル名 > ファイル名.base
git show :2:ファイル名 > ファイル名.ours
git show :3:ファイル名 > ファイル名.theirs
3つのファイルについて手動で修正し、
git merge-file -p ファイル名.{ours,base,theirs} > ファイ...
をして、問題無ければ add, commitする。
3方向のdiff(コンフリクトのマーカー含)のファイルを作...
git checkout --conflict=diff3 ファイル名 #デフォルトで...
--- see [[7.8 Git のさまざまなツール - 高度なマージ手法>h...
-- 補足
--- エディタで修正していたが、コンフリクトマーカーの入っ...
git checkout --conflict=merge ファイル名
- git cherry-pick SHA1 # チェリーピック(つまみぐい)。特...
- stash #変更を一時的に隠してpullしたいときに使う
(実例)作業領域に更新があり、コミットしていなく、したく...
$ git stash
$ git pull
$ git stash pop # popする(applyして、リストからは削除)
で良いらしい。
--skip-worktreeしたファイルがコンフリクトしていた場合は...
--no-skip-worktreeしてから git stashする。
git stash [ save [--include-untracked]or?[--all] ["メッ...
git stash list
git stash apply --index [ stash@{0} ] #auto mergeなどさ...
git stash drop stash@{0} #削除
git stash pop #変更をpopする(リストからは自動で削除さ...
今の作業ブランチにapplyやpopがされるようだ。
logをみると stashしたものの SHA1がわかるので、ブランチ名...
//- - - - - - - - - - - - - - - - - - - - - - - - - - - -...
** 作業ブランチへのマージの仕方(まとめ) [#sf4c03a0]
+------>o fixブランチ
|
------>o masterブランチ
|
+------------->o----> 作業ブランチ
~~~~~
未コミット部分A
o 印はコミット
ブランチの分岐が上図のようにあり、
作業ディレクトリのブランチに fixブランチをマージするには、
次の(1)-(4)のいずれかの方法でできる。
作業ブランチをコミット済みの状態にしておき、(2)の方法で...
するのがいちばん素直だろう。
(fixがmasterの進んだコミットであっても同じ)
(1)
git merge origin/fix
これは自動的にコミットされる。
たぶんA部分があればエラーとなる? もしくは、A部分もコ...
するファイルだけか?
コンフリクトしたら作業ディレクトリのファイルにその内容が...
(2)
git merge --no-commit --no-ff origin/fix
自動的にコミットしない。
コンフリクトしたら作業ディレクトリのファイルにその内容が...
確認後、
git merge --abort
で取り消すか(取り消してから(1)でマージしてもよい)、ま...
コンフリクトがあれば修正して(無ければそのままで)、
git commit -m "hogehoge"
する。
(なお、コミットする前にはコミットするファイルを取捨選択...
(3)
git cherry-pick SHA1
fixのコミットのSHA1をマージする。master--->fixの間に複数...
があれば順に全てに対してこのコマンドでマージする。
たぶんコンフリクトしたら作業ディレクトリにその内容が入る。
(4)
git stash
--skip-worktreeしたファイルは無いことが望ましい。
git merge origin/fix をする(または (1)-(3)のいずれかで...
git stash pop
たしか、コンフリクトしたら作業ディレクトリのファイルにそ...
そして stashは消されずに残る。
//- - - - - - - - - - - - - - - - - - - - - - - - - - - -...
//=======================================================...
* リポジトリの作成・移動 [#xc6654e5]
** ローカルリポジトリ [#b8b1cc71]
・作成方法1(新規作成)
cd 作業ディレクトリ
git init
・作成方法2(リモートリポジトリのクローン)
git clone リモートリポジトリ [作業ディレクトリ]
# リモートリポジトリは [ssh://[user@]host.xz[:port]]/p...
# 自動的に、origin という登録名でurlが登録され、リモー...
# 作業ディレクトリを省略すると、リモートリポジトリのデ...
# 作業ディレクトリを指定する場合は、既存のディレクトリ...
** ベアリポジトリ [#bc35db61]
・作成方法1
cd ディレクトリ.git # 拡張子を慣習的につける
git init --bare
** 空のリモートリポジトリ(ベアリポジトリ)にpushする(新...
git add ファイル
git remote add origin リモートリポジトリ # リモートリポ...
git remote -v ; git branch -vv
git commit -m "注釈"
git push --set-upstream origin master # --set-upstre...
** リモートリポジトリ自体の移動、それを追従しているリポジ...
リモートリポジトリの移動自体は単にまるごとディレクトリを...
これに追従しているリポジトリは
git remote set-url origin 新しいリモートリポジトリのURL
をして、登録名の内容を上書き更新する(originを消してから...
又は、originを作り直す場合は
git remote rm origin # リモートリポジ...
git remote add origin リポジトリのURL # URLでリモートリ...
リモートリポジトリのURLの書式は、git remote -v の結果を...
** リモートリポジトリの登録、変更、削除 [#vf8d3bdf]
git remote add リモートリポジトリの登録名 リモートリポジ...
git remote rename リモートリポジトリの変更前の登録名 リ...
git remote rm 削除するリモートリポジトリの登録名
git remote set-url origin 変更後のリポジトリのURL # URL...
git remote [-v] # リモートリポジトリの一覧表示
//=======================================================...
* 新しいブランチを作り、追いかける手順の例(よく使う) [#...
** ローカルにブランチを作り、リモートリポジトリにpushする...
作業ディレクトリやステージは commit,push済であるとする
$ git branch nwp # 現在の状態で、ブランチnwpを作成
$ git checkout nwp # ブランチnwpに移動
なお、ここの段階でファイルを変更して add,commitをしても...
$ git push --set-upstream origin nwp # リモートリポジト...
# nwpは、origin/nw...
# --set-upstreamに...
** リモートリポジトリで、新たに作成されたブランチnwpを追...
作業ディレクトリやステージは commit,push済であるとする
$ git fetch --all --tags
$ git checkout --track origin/nwp # リモートリポジトリo...
# を作成し、チェック...
# git checkout -b nwp...
- 上の2つを組み合わせると、新しくブランチを作って複数の...
:|(例)同じリモートリポジトリoriginを上流にもつリポジト...
Aで新しいブランチnbを作成し、originにpushした。
このpushされ作成されたブランチnbを、Bで追従するようにBで...
すると、AとBとの間でファイルの同期のようなことが出来る。
すなわち、Bのnbで変更した内容を、Aのnbに取り込んだり、そ...
なお、AとBとで同時に同じファイルの同じ箇所に対して異なる...
この場合はマージ作業を行う。
//=======================================================...
* gitコマンド [#l406d658]
//-------------------------------------------------------...
** status [#p519869b]
git status [-s] # -sは簡潔表示(非追跡対象のファイル...
git status -sb # -sは簡潔表示、-bは現在のブランチを...
.gitignore ファイル
このファイルを使って無視するファイルを指定できる(非追...
再帰的にディレクトリ階層に適用される。
利用できる正規表現は git help gitignore や man gitigno...
(例)作業ディレクトリに以下の内容で .gitignoreを置く
*.x
*.o
*.a
*~
//-------------------------------------------------------...
** diff [#j1b1d251]
git diff [--] [ファイル] # 作業ディレクトリと...
git diff --cached [--] [ファイル] # ステージとコミット...
# 引数の曖昧さを避け...
# ファイルには、ディ...
git diff A B [ファイル] # 差分をみる。AやBは SHA1や...
git diff A..B [ファイル] # 〃
git diff A...B [ファイル] # AとBとの共通の親と, Bの差分
(例)
git diff master..origin/master # リモートリポジトリの...
# origin/masterの位置は...
# しばらく fetchやpull...
git diff A:file1 B:file2 # Aのfile1とBのfile2の比較
git diff -U20 # 違いがあった所の前後20行を含めて差分を出...
git diff -w # ファイル内のスペースの違いを無視、改行コ...
git diff -b # ファイル内のスペースの数の違いを無視、改...
git diff --name-only # 差分のあったファイルのファイル...
git diff --name-status # 差分のあったファイルのファイル...
# git status -s と同じ?
COLOR(RED){空白に関する警告を表示する(コミット前に予め確...
$ git diff --check
作業ディレクトリの変更について、空白に関する警告を表示す...
デフォルトでは以下の場合に警告する(core.whitespaceの設...
o 行末に空白がある
o 空白を含む空行がある
o ファイルの末尾に空行がある
o タブの次に空白がある
//-------------------------------------------------------...
** show [#baf2d096]
git show オブジェクト[:ファイル] # コミットやその内容(...
# オブジェクトは SHA1...
# :ファイル 特定のファ...
//-------------------------------------------------------...
** log [#x099c249]
コミットログを表示する
git log -5 --oneline --decorate --graph --all [--stat] [...
...
...
...
...
...
...
git log --grep hogehoge #ログ内容を検索
git log -p -S'hogehoge' file # コミットの中で、fileのho...
# コミットを検索する。
# -pオプションがあるのでそ...
(その他のオプション)
git log --since="50 minutes ago" # 50分前からのログの...
git log --all --since="2023-03-17" #2023-03-17以降のロ...
gitk --all --since="2023-03-17" #同様のことはgitkで...
git log --no-merges issue54..origin/master #ログのフ...
#origin/masterには含まれるが、issue54には含まれないコミ...
git log contrib --not master # masterに無くcontribブラ...
- git log でページャが動いたとき、hでヘルプが出る。いろい...
- ファイルを削除したコミットから、削除されたファイルのフ...
出来る(たぶん自動的に前のコミットとの差分が取られるため)
//-------------------------------------------------------...
** git log のフォーマット指定(log) [#oa806511]
git log --oneline --decorate --graph --all --pretty=form...
%C(色名) 文字の色を指定。autoだと項目により自動で色付...
%x09 タブ
%h sha1(ハッシュ値)
%d 注釈
%cd 日付。日付のフォーマットは別途 --date=shortで与...
%an コミットした人
--date=iso だと "2015-03-21 16:24:43 +0900" となる。他...
~/.gitconfig に次のものを入れておくと、git mylog --all ...
[alias]
mylog = log --oneline --decorate --graph --pretty=fo...
- git log のオプション等
-- 引数にファイル名(複数可)を与えると、そのファイルに関す...
-- --follow でファイル名が変更されても追跡する(ただし引...
-- --summary でリネームなどの追加情報を表示(リネームでは...
-- -M50% でリネームの判断の類似度の閾値を指定(デフォルト...
- ファイルの更新内容をさかのぼる例(ファイル名変更も追跡)
git mylog --all --follow --date=iso --summary -p -- sam...
#-pで差分を表示、--followでリネームに対応、--summaryで...
#もし -pを付けないと1行のログだけで表示
//-------------------------------------------------------...
** 行が追加・削除されたコミットを調べる(log) [#n3efc0b4]
git log --cc --all -S"h5py.get_config().default_file_mod...
--ccで各コミットのdiff(実際はパッチ)をとる(マージコミ...
-Sで検索にヒットしたコミットだけ表示する
コミットのSHA1やコミットメッセージがわかるので、
git show 287658 や、git log 287658 、
gitkの Find欄にそのメッセージを入れて、コミットを検索表...
- log -p や --cc の挙動を調べる例
/bin/rm -rf .git a b
git init
echo foo > a; git add a; git commit -m "add a"
git branch other; git checkout other
echo bar > b; git add b; git commit -m "add b"
git checkout master
git merge --no-commit --no-ff other
echo bart > a; git add a
git commit -m "merge branch other"
echo "*** log"; git log -25 --oneline --decorate --grap...
echo "*** log -p"; git log -p
echo "*** log --cc"; git log --cc
-- --cc は -p に加え、マージコミット(fast-forwardでないも...
表示する。(--cc は -c より圧縮されたパッチを表示している)
-- -p はマージコミットを除き(fast-forwardは除かない)、各...
-- c.f. マージしたコミットのsha1があったとする(fast-forwa...
下記の showと log --ccではともにマージコミットの差分を表...
git show sha1 #コミットを表示(差分も表示される)
git log --cc sha1 sha1^..sha1 #親1からのログを表示(--...
git log --cc sha1 sha1^1..sha1 #親1からのログを表示
git log --cc sha1 sha1^2..sha1 #親2からのログを表示
なお、sha1^1か sha1^2かのどちらか一方だけが、マージコミ...
//-------------------------------------------------------...
** blame [#pdb0922b]
git blame [-C] -L n,m file # fileに対して、n~m行目の...
# -Cがあるとfile名の変更も...
# 行は1から数える。
(例、どのコミットで追加されたものかを調べてる)
$ git blame -C -L 22,24 makefile
dfa94f47 (okazaki,i 2022-09-10 17:07:28 +0900 22) #DOPT ...
1e84d5f5 (okazaki,i 2018-03-19 20:13:09 +0900 23) DOPT =...
059d6a13 (okazaki,i 2023-03-17 22:14:06 +0900 24) #DOPT ...
$ git show 1e84d5f5 makefile #さらに 1e84d5f5のコミット...
#表示したいとき
$ git diff -U 201e84d5f5..HEAD makefile #さらに HEADど...
#リダイレクシ...
(他)
gitに bisectというものもあり(二分探索によるデバッグ支援...
git log -p -S も見よ。
問題がどのコミットで生じ始めたかを見つけるために、checko...
二分探索するのが簡単だろう。
//-------------------------------------------------------...
** grep [#t0001967]
git grep --heading --line-number -3 '検索文字列' [sha1な...
ファイル名を先頭に、行番号を行頭に表示して、検索文字列...
とき、その行の前後各3行を表示する。
作業ディレクトリ内で、カレントディレクトリ以下の追跡対...
sha1などを指定するとそこで文字列検索する。
他のオプション
-w 単語境界での検索
-F 正規表現を利用しない
-l マッチしたファイル名だけ表示
git rev-list sha1など [-- パス] | cut -c -7 | xargs git ...
コミットのsha1やブランチ名などを指定(--allも可)し、そ...
文字列を検索する? パスを指定すると限定できる?
なお、git grep の結果で、40桁のsha1の代わりに 7桁で出...
(例)
git rev-list --all | cut -c -7 | xargs git grep --headin...
git grep -l 文字列 | xargs sed -i'' -e 's/文字列/置換文...
カレントディレクトリ以下のファイルで、文字列、を含むフ...
に置き換える。
なお、sedのオプション -i'' で検索されたファイルを直接...
-i'.old' とすると、置換前のファイルは、ファイル名.old ...
//-------------------------------------------------------...
** branch [#cbfec91a]
git branch -vv #ブランチを表示
git branch -a #リポジトリにある全てのブランチを表...
git branch ブランチ #ブランチ...
git branch -m 古いブランチ名 新しいブランチ名 #ブランチ...
git branch -m 新しいブランチ名 #現在のブ...
git branch --merged # 現在のブランチにマージされた...
git branch --no-merged # 現在のブランチにマージされて...
(使い終わったブランチはだいたい削除されるので、あまり意...
git branch -d hoge #ローカルリポジトリのブラ...
#(予めhoge以外をカレント...
git branch -d -r origin/hoge #ローカルリポジトリのブラ...
#(リモートリポジトリでも...
git push origin --delete hoge #リモートリポジトリorigin...
または git push origin :hoge
または git push origin :refs/heads/hoge
(git fetch するとローカルリポジトリのリモートブランチは...
- ブランチ削除
:|
自分がブランチを消したとしても、他の人が同じくcloneして使...
その人が消さない限りその人のリポジトリには残る。
自分がリモートリポジトリのブランチを消したとしても、他の...
リモートリポジトリに再度、自分が消したブランチが作成され...
自分のリポジトリにも再度、消したブランチが作成される。
(cloneした全員のリポジトリでブランチを消さないと、実質消...
- detached branchを作って、コミットし、通常のブランチにch...
そのコミットした情報にはアクセスできなくなる?
リポジトリには残っていると思うが、.gitディレクトリを操作...
- 未マージのブランチ削除
git branch -d でブランチを削除しようとしても、そのブラン...
エラーになる。この場合は -d の代わりに -D を使ってブラン...
//-------------------------------------------------------...
** リモートリポジトリのブランチを作成や追跡(branch) [#g82...
リモートリポジトリにブランチが無い場合
ローカルリポジトリのローカルブランチを、リモートリポジト...
git push -u origin hogeB:hogeA #hogeBブランチを、origin...
#-u により hogeBはorigin...
#(-uは--set-upstreamの...
git push -u origin hogeA:hogeA #同じブランチ名のときは...
git push -u origin hogeA #このようにも書ける(・...
リモートリポジトリにブランチが有る場合
git branch hogeB origin/hogeA #リモートリポジトリのブ...
git branch --set-upstream=origin/hogeA hogeB #リモート...
#既存のブ...
#(hogeBを...
//-------------------------------------------------------...
** fetch [#ld059d0d]
git fetch --all # 登録されている全てのリモートリ...
git fetch --all --tags # 上記に加え、リモートリポジトリ...
git fetch [リモートリポジトリ] [ブランチ]
//-------------------------------------------------------...
** pull [#v5544ac2]
git pull [リモートリポジトリ] # fetchし、mergeするこ...
//-------------------------------------------------------...
** push [#l21306b2]
git push [リモートリポジトリ] [ブランチ] [--tags]
# 競合が発生した場合は pushはできない(fetch, merge...
# --tagsはタグもプッシュする
//-------------------------------------------------------...
** tag [#nf4eb8ef]
git tag タグ #タグを付ける
git tag [-a] タグ [SHA1など] [-m 注釈] # タグを付ける
# -aと-mで1行の注釈を入れれる。-aのみは注釈を入れるた...
# -sオプションで署名もできるらしい(詳しくは https://gi...
git tag # すべてのタグを表示
git tag -d タグ名 #タグ名を削除する
git fetch --tags #リモートリポジトリのタグを取得する
git push --tags #リモートリポジトリ...
git push --delete リポジトリ タグ名 #リポジトリ(origin...
- タグはsha1に紐づいている(タグが付いているところでコミ...
//-------------------------------------------------------...
** checkout [#b792a466]
git checkout {ブランチ|タグ|sha1など} #指定のものをチェ...
#非追跡対象のファイルなどは、そのまま残される。
#sha1でチェックアウトした時、detached HEADになるが、普...
#できる(ブランチ名を新たにつける方が取り扱いやすい)。
git checkout -b ブランチ {リモートリポジトリ/ブランチ|タ...
...
#リモートリポジトリ/ブランチを指定した場合、
#作成したブランチはリモートブランチ(リモートリポジト...
#ステージにファイルがあってもよい。ステージにあるファ...
#もとのブランチのステージからは取り除かれる。
git checkout --track リモートリポジトリ/ブランチ #git c...
#と同じ
#作成したブランチはリモートブランチ(リモートリポジト...
- リモートリポジトリのブランチ(◯/◯)やブランチ(◯)はマ...
- チェックアウト(ブランチへの切り替え)ができない場合も...
- gitではファイルのタイムスタンプは管理されない。checkout...
- detached HEAD の利用例
detachして、追加修正した記録を残したいときの例
$ git commit -m "a commit for debug tests" #とりあえず...
$ git branch debug_hoge #ブラン...
$ git tag debug_hoge_20230322 #タグを...
$ git push --set-upstream origin debug_hoge #リモー...
$ git push --tags #タグも...
$ git push origin --delete debug_hoge #リモートブラン...
$ git checkout master
$ git branch -D debug_sotu_ngrid #ローカルブラン...
最後の三行は
$ git checkout master
$ git branch -D -r debug_sotu_ngrid
か。
//=======================================================...
* その他のコマンド等 [#e07d8302]
//-------------------------------------------------------...
** gitk [#n2f45180]
gitk [--date-order] [--all] [ファイル] # git log など...
# --date-orderは日付...
gitk --date-order master_20230403 #などある時点から過去...
//-------------------------------------------------------...
** git help [#k13d01b7]
git help コマンド名 #gitのオンラインマニュアル
//-------------------------------------------------------...
** パッチ [#z0a72181]
git diff差分はそのままでパッチファイルになっている。
パッチの当て方
patch [--dry-run] -p1 < パッチファイル #--dry-runは何...
//-------------------------------------------------------...
** git config [#f5a49bb9]
git config [--global] -l # .git/configを表示
git config [--global] -e # .git/configを編集
//-------------------------------------------------------...
** 表示の色変更(git config) [#kc89f85c]
- git log 出力のタグの色を変える
git config --global color.decorate.tag "blue" #青色に...
//-------------------------------------------------------...
** HEADなど(sha1の別名) [#d8daf63f]
HEAD #現在checkoutしているコミット(ブランチ等)のsha1...
HEAD^ #HEADのひとつ前のコミットを表す
HEAD^^ #HEADの前の前のコミットを表す
(sha1の数字を使っても同じことを表せる。なお gitkでは利...
例)S=91dc63f git diff ${S}^..${S} sample_H2mb64g64.inp
//-------------------------------------------------------...
** アーカイブを作る [#vad53986]
git archive master --prefix='project/' --format=tar > gi...
git shortlog --no-merges master --not master_20220310 #...
#...
#...
//-------------------------------------------------------...
** GitHub [#h01740d0]
- githubのリポジトリの作り方
まず、ブラウザで名前を付けてリポジトリを作る。
ここへのpushの仕方が表示されるので、ローカルに作っておい...
//-------------------------------------------------------...
** 不具合対応 [#fa9b8e8e]
- ファイル名に日本語を使わない方が無難である。commitメッ...
- ブランチ名とタグ名が同じ場合に、どちらかを削除する方法...
tagを消すとき git push origin :refs/tags/タグ名
branchを消すとき git push origin :refs/heads/ブランチ名
- unable to read askpass のエラー対応
$ git push
(gnome-ssh-askpass:hogehoge): Gtk-WARNING **: cannot ope...
error: unable to read askpass response from '/usr/libexe...
Username for 'https://github.com':
などと、表示される場合の対応。
無視して、つづけて問題無い(GUI環境で無いために、パスワ...
unset SSH_ASKPASS をすると表示されなくなる
- git status で日本語のファイル名が化けているのを表示させる
localな設定
git config --local core.quotepath false #.git/confi...
git config --local --unset core.quotepath #設定を元に...
globalな設定
git config --global core.quotepath false #~/.gitconf...
git config --global --unset core.quotepath
//=======================================================...
* tips [#va6b12fc]
** 変更のあったファイルを emacsでいっきに開く [#x2ac1d78]
emacs `git diff --name-only`
** 変更があったファイルで、行末に空白があるものを調べる [...
#タグmaster_20200619から変更があったファイルのうち、拡張...
#行末にひとつ以上の空白があるもののファイル名を表示する
for f in ` git diff --name-only master_20200619 | grep...
echo ==== $f ====; grep ' \+$' $f > /dev/null; [ $? ==...
** 変更があったファイルで、タブを含むものを調べる [#qca5e...
#タグmaster_20200619から変更があったファイルのうち、拡張...
#タブを含むファイルのファイル名を表示する
for f in ` git diff --name-only master_20200619 | grep...
echo ==== $f ====; grep $'\t' $f > /dev/null; [ $? == ...
#(注釈: ここで $'文字' はbashの機能。$...
(補足)
$ grep $'\t' makefile
と同じことは
$ grep -P '\t' makefile #perl互換の正規表現
でできるが、
デフォルトでは grepは \t をタブ文字コードと理解しない(...
そのため bashで $'\t' によりタブ文字コードを grepに渡し...
さらに、bashではタブ文字コードを入力することが出来るの...
タブ文字コードをシングルクォーテーションで括って grepに...
c.f.
$ grep \\t makefile #これは'\t'の検索と同じ
$ grep '\t' makefile #ただの tの検索になる
$ grep '\\t' makefile #これは \tの2文字の検索
$ grep '\\\t' makefile #これも \tの2文字の検索
$ grep '※ここでCtrl-v Tab' makefile #これは$'\t'の検...
** HEADのsha1値と注釈を表示する [#k53e99a6]
temp=`git rev-parse --short HEAD; git log -1 --pretty=%B...
** 作業ディレクトリの変更の有無を表示する [#t122e849]
if git diff --quiet >/dev/null 2>&1; then echo "--"; els...
** コミットの注釈が英語以外の場合にエラーにするフックの設...
次の 1)または 2)のフックを作り、英語以外のコミット注釈を...
1) ベアリポジトリに pushされるときのフック、~
2) ローカルリポジトリで commitするときのフック。~
なお、リポジトリを cloneしたときに、自動的に 2)のフックを...
そのため 2)は各ユーザが自分で手動でフックを設置しなければ...
一方、1)は push時にエラーになるが、エラーとなったユーザは...
(注) 2023/09/30に以下のフックを作ったが、バグが無いとも言...
フック:ソフトウェアに予め用意されている、特定のタイミン...
*** 1) ベアリポジトリに pushされるときにエラーにするフッ...
hooksディレクトリに以下の内容を updateというファイル名で...
#!/bin/sh
# 2023/09/30 okazaki,i
MYDEBUG=0 #1 or 0
#get the commit range to be push
refname="$1"
oldrev="$2"
newrev="$3"
#rearrange the commit range
zero="0000000000000000000000000000000000000000"
if [ $oldrev != $zero ]; then
range="$oldrev..$newrev"
else
range="$newrev"
fi
#check charaset, then reject or continue to the commit.
[ $MYDEBUG -ne 0 ] && echo "MY update: git rev-list" 2>&1
[ $MYDEBUG -ne 0 ] && git rev-list $range 2>&1
for c in `git rev-list $range`; do
[ $MYDEBUG -ne 0 ] && echo "MY update: git cat-file,...
git cat-file commit $c | sed '1,/^$/d' > /tmp/hook.$$
chara=`file -i /tmp/hook.$$ | sed 's/^.*charset=\([^...
rm -f /tmp/hook.$$
[ $MYDEBUG -ne 0 ] && echo "chara=$chara" 2>&1
[ $MYDEBUG -ne 0 ] && echo "using /tmp/hook.$$" 2>&1
#check charaset
if [ x"$chara" != x"us-ascii" ]; then
echo "REJECT your message which is not us-ascii....
exit 1
fi
done
[ $MYDEBUG -ne 0 ] && echo "CONTINUE to commit." 2>&1
exit 0
*** 2) ローカルリポジトリで commitするときにエラーにする...
.git/hooksディレクトリに以下の内容を commit-msgというファ...
#!/bin/sh
# 2023/09/30 okazaki,i
MYDEBUG=0 #1 or 0
#get commit the message
msg=`cat "$1"`
[ $MYDEBUG -ne 0 ] && echo "MY commit-msg: $msg"
#determine charaset
echo "$msg" > /tmp/hook.$$
chara=`file -i /tmp/hook.$$ | sed 's/^.*charset=\([^;]*\...
rm -f /tmp/hook.$$
[ $MYDEBUG -ne 0 ] && echo "MY commit-msg: chara=$chara"...
[ $MYDEBUG -ne 0 ] && echo "using /tmp/hook.$$" 2>&1
#check charaset, then reject or continue to the commit.
if [ x"$chara" != x"us-ascii" ]; then
echo "REJECT your message which is not us-ascii." 2>&1
exit 1
fi
[ $MYDEBUG -ne 0 ] && echo "CONTINUE to commit." 2>&1
exit 0
** マシン毎に user.name, user.emailの値を自動的に変更する...
.gitconfigに環境変数を利用することはできない。
しかし、user.name, user.emailに与えた値よりも、
環境変数 GIT_AUTHOR_NAME, GIT_AUTHOR_EMAILの値が優先され...
従って、.bashrcなどを利用してこの環境変数をマシン事に変え...
user.name, user.emailの値を自動的に変更できる。
//=======================================================...
終了行:
#menu(howto/MenuBar)
* howto/git [#wa6b0ec5]
#contents
** 一行メモ [#b3117386]
- git clone コピーしたい作業ディレクトリ [ディレクトリ名]...
-- ブランチは、現在のブランチしか作られないので、必要に応...
-- 例) $ git clone gmx_chignolin gmx_chignolin2 -- &new{...
- git clone ssh://username@hostname/home/username/hogehog...
-- cloneはできるが、pushは通常できない(する方法もあるよ...
- ブランチ名を、hoge/fuge のように /を含めることができる...
- mergeしたときの変更内容の差分をみる -- &new{2023-01-13...
git diff eaad7c8 254b87b d3087fd #changes when mer...
git diff -U10 eaad7c8 254b87b d3087fd #changes when mer...
違いが出るのはなぜか?
- git subtree https://golden-lucky.hatenablog.com/entry/2...
- git fetch -p とは? -- &new{2023-09-14 (木) 10:27:27};
- ディレクトリ毎にgitconfigを変える https://maku77.github...
- gitk master_20220310..master_20230403 -- nameless_psio...
- ファイルの各行を誰がいつ追加したかを調べる -- &new{202...
$ git blame -w make_widget.py
$ gitk --all make_widget.py
ファイルからファイルにコードが移動している場合などはこち...
$ git blame -w -C -C -M make_widget.py #-Cは1個は不十...
#comment
//=======================================================...
* はじめてのGit [#ec3c01dd]
こちらへ [[howto/git/forthefirsttime]]
//=======================================================...
* COLOR(RED){リマインド}・COLOR(RED){注意事項} [#m116a942]
- [[コミットするときの注意点>#anchor1]]
- [[最初設定すると良いこと>#anchor2]]
//=======================================================...
* The entire Pro Git book, written by Scott Chacon and Be...
https://git-scm.com/book/ja/v2
ここからダウンロード(2021/04/15)したPDF版のファイル
(ただしそのままでは不具合があるようだったので、macOSのプ...
2nd Edition (2014) のファイルです。
なお、旧版はDownloadsメニューにあるらしい。
このPDFは Scott Chacon and Ben Straubにより書かれたもので...
ライセンスは [[CC BY-NC-SA 3.0>https://creativecommons.or...
- 表紙と3章のみ
#ref(progit.chap3.pdf)
- 全て
#ref(progit.all.pdf)
以下は古いもの。
- 2016/12/19
#ref("progit-ja.1016.chap1-3,5.pdf")
- 2017/04/08
#ref(progit-ja.898.pdf)
//=======================================================...
* ファイルの追加・名前変更・削除 [#q7d3dc85]
** ファイルを追加(追跡対象にする) [#b2f33658]
例)
git add . # カレント以下のファイル(ディレクトリ...
git add ファイル # ファイルをステージに追加する
git add -u # 追跡対象のファイルで修正があったもの...
- 新規にファイルをステージに追加する(載せる)と、そのフ...
- サブディレクトリに cdしてから addすることも可能。
- 空ディレクトリは addできないので習慣的に .gitkeepを置く。
例) find . -type d -empty -not -path './.git*' -exec t...
- シンボリックリンクも addできる。
- add -f オプションは .gitignoreを無視してファイルを追加...
** ファイル名変更 [#h7dc6c52]
mv 変更前のファイル名 変更後のファイル名
git add 変更前のファイル名 #削除した(無くなった)ことを...
git add 変更後のファイル名
#gitとしては、削除されて、新しい名前で追加する形の操作と...
または
git mv 変更前のファイル名 変更後のファイル名
** ファイルの削除 [#sf470bf1]
rm ファイル名
git add ファイル名
#gitとしては、削除したファイル名、無いファイル、を追加す...
または
git rm ファイル名
削除するファイルが、ステージに載っている場合は --cached...
git rm --cached ファイル名 #ステージから削除し、ファイ...
- 補足
-- ステージから取り除く
git reset HEAD ファイル名 #ステージのファイルが削除され...
-- ファイルの変更を取り消す(元に戻す)
git checkout -- ファイル名 #作業ディレクトリのファイル...
-- git rm を取り消す
git reset HEAD ファイル名 #ステージのファイルが削除さ...
git checkout -- ファイル名 #作業ディレクトリのファイル...
-- あるSHA1のファイルを作業ディレクトリに上書きして入れる
git checkout sha1 -- hoge.c #作業ディレクトリに上書き、...
git reset HEAD hoge.c #ステージのものを作業ディレ...
//=======================================================...
* ファイルの変更維持 [#o73f3ddf]
ファイルを更新したが、その更新を維持したままにする(git ...
git update-index --skip-worktree ファイル名 # 更新...
git update-index --no-skip-worktree ファイル名 # 登録...
git ls-files -v | grep ^S # skip-worktreeしたファイ...
- 補足
git ls-files -o #カレントディレクトリ以下で、追跡され...
git ls-files -o --exclude-standard #git ls-files -o の...
//=======================================================...
* git commit, reset, clean, merge [#o24116ff]
&aname(anchor1);
*** COLOR(RED){コミットするときの注意点} [#z10719ad]
-「5.1 Git での分散作業 - 分散作業の流れ」, Pro Git book ...
-- コミットの単位が論理的に独立した変更となるようにしまし...
修正した問題ごとにコミットを分割し、それぞれに適切なコ...
⇒ むずかしいのでほどほどで対応すればよい。
-- コミットメッセージ:~
最初には変更の概要を一行 (50 文字以内)+空行+詳しい説...
現在形を使うようにしています。つまり “私は○○のテストを追...
“○○のテストを追加します (Adding tests for,)” ではなく “○○...
形式にする。
⇒ COLOR(RED){コミットメッセージは英語}でする。日...
&aname(anchor2);
*** COLOR(RED){最初設定すると良いこと} [#ya10522a]
git config --global user.name "yourname" # 実行する...
git config --global user.email "youremail" # --global...
git config --global core.editor emacs
git config --global push.default simple # simple(...
git config --global credential.helper 'cache --timeout=1...
...
** commit [#ub1f9dca]
git commit -m 注釈 # ステージ済みをコミットする
git commit -a -m 注釈 # 追跡対象(のみ)をステージして、...
- commit -m オプションが無いときは、エディタが立ち上がる...
注釈を「1行目をタイトル+空行+内容」とできる。-mを付け...
- コミットのやり直し
git commit --amend -m 注釈 # 直前のコミットを上書きする...
# ただし、push前であること。...
** reset [#xf3a06e4]
git checkout -- ファイル名 #作業ディレクトリのファイル...
#(ファイルに変更があれば、...
git reset HEAD ファイル名 #ステージのファイルが削除さ...
#(作業ディレクトリのファイ...
git reset --hard #現在のブランチを、チェックアウトの...
#(ファイルに変更があれば、失われる)
- ローカルリポジトリを消して良い場合、再度cloneした方が楽...
** clean [#m0ed97d1]
- 作業ディレクトリ内で、カレントディレクトリにある不要な...
git clean -n で確認して、 git clean -f で追跡対象以外(...
なお、
- カレントディレクトリ以下のディレクトリ内も対象にすると...
- gitignoreで無視しているファイルも消すときは - xを付ける
- 対話的に消したいときは -iを付ける
** merge [#m4be4fdd]
COLOR(RED){dry-run的なことをして確認後、マージをコミット...
現在のブランチに、指定のブランチをマージ
$ git merge --no-commit --no-ff [リモートリポジトリ/]ブ...
#コミットしない、fast forwardでもコミットし...
これで、マージされた結果はステージに載るので、
$ git diff --cached
で結果を確認できる。コンフリクト(競合)していたらその旨が...
そして、
(a) このマージを取り消したければ、git merge --abort をす...
(b) そのままコミットしたければ git commit -m "merge bran...
又は git merge --abort 後に git merge [リモートリポ...
- マージは、ブランチに他のブランチを融合(マージ)する形...
git merge [リモートリポジトリ/]ブランチ # 現在のブラ...
# (コンフリ...
よくある例)
masterブランチを修正して commitした。pushすると、origi...
いたため rejectされた。この場合は次のようにする。
$ git fetch
$ git merge --no-commit --no-ff origin/master
ここでコンフリクトを手動で解消
$ git add 解消したファイル
$ git commit -m "merge branch origin/master into master"
$ git push
-- 補足
--- git merge はオプション無しだと、自動的にコミットされ...
- コンフリクトの解消
-- COLOR(RED){こちらの修正方法が素直で単純}
単純なコンフリクトの場合は、ファイルにコンフリクトの内容...
<<<<<<< HEAD
ほげほげ
=======
ほげほげ
>>>>>>> SHA1
と書き込まれているので、エディタで修正して、保存する。そ...
-- 複雑なとき?
コンフリクトが出たとき
git show :1:ファイル名 > ファイル名.base
git show :2:ファイル名 > ファイル名.ours
git show :3:ファイル名 > ファイル名.theirs
3つのファイルについて手動で修正し、
git merge-file -p ファイル名.{ours,base,theirs} > ファイ...
をして、問題無ければ add, commitする。
3方向のdiff(コンフリクトのマーカー含)のファイルを作...
git checkout --conflict=diff3 ファイル名 #デフォルトで...
--- see [[7.8 Git のさまざまなツール - 高度なマージ手法>h...
-- 補足
--- エディタで修正していたが、コンフリクトマーカーの入っ...
git checkout --conflict=merge ファイル名
- git cherry-pick SHA1 # チェリーピック(つまみぐい)。特...
- stash #変更を一時的に隠してpullしたいときに使う
(実例)作業領域に更新があり、コミットしていなく、したく...
$ git stash
$ git pull
$ git stash pop # popする(applyして、リストからは削除)
で良いらしい。
--skip-worktreeしたファイルがコンフリクトしていた場合は...
--no-skip-worktreeしてから git stashする。
git stash [ save [--include-untracked]or?[--all] ["メッ...
git stash list
git stash apply --index [ stash@{0} ] #auto mergeなどさ...
git stash drop stash@{0} #削除
git stash pop #変更をpopする(リストからは自動で削除さ...
今の作業ブランチにapplyやpopがされるようだ。
logをみると stashしたものの SHA1がわかるので、ブランチ名...
//- - - - - - - - - - - - - - - - - - - - - - - - - - - -...
** 作業ブランチへのマージの仕方(まとめ) [#sf4c03a0]
+------>o fixブランチ
|
------>o masterブランチ
|
+------------->o----> 作業ブランチ
~~~~~
未コミット部分A
o 印はコミット
ブランチの分岐が上図のようにあり、
作業ディレクトリのブランチに fixブランチをマージするには、
次の(1)-(4)のいずれかの方法でできる。
作業ブランチをコミット済みの状態にしておき、(2)の方法で...
するのがいちばん素直だろう。
(fixがmasterの進んだコミットであっても同じ)
(1)
git merge origin/fix
これは自動的にコミットされる。
たぶんA部分があればエラーとなる? もしくは、A部分もコ...
するファイルだけか?
コンフリクトしたら作業ディレクトリのファイルにその内容が...
(2)
git merge --no-commit --no-ff origin/fix
自動的にコミットしない。
コンフリクトしたら作業ディレクトリのファイルにその内容が...
確認後、
git merge --abort
で取り消すか(取り消してから(1)でマージしてもよい)、ま...
コンフリクトがあれば修正して(無ければそのままで)、
git commit -m "hogehoge"
する。
(なお、コミットする前にはコミットするファイルを取捨選択...
(3)
git cherry-pick SHA1
fixのコミットのSHA1をマージする。master--->fixの間に複数...
があれば順に全てに対してこのコマンドでマージする。
たぶんコンフリクトしたら作業ディレクトリにその内容が入る。
(4)
git stash
--skip-worktreeしたファイルは無いことが望ましい。
git merge origin/fix をする(または (1)-(3)のいずれかで...
git stash pop
たしか、コンフリクトしたら作業ディレクトリのファイルにそ...
そして stashは消されずに残る。
//- - - - - - - - - - - - - - - - - - - - - - - - - - - -...
//=======================================================...
* リポジトリの作成・移動 [#xc6654e5]
** ローカルリポジトリ [#b8b1cc71]
・作成方法1(新規作成)
cd 作業ディレクトリ
git init
・作成方法2(リモートリポジトリのクローン)
git clone リモートリポジトリ [作業ディレクトリ]
# リモートリポジトリは [ssh://[user@]host.xz[:port]]/p...
# 自動的に、origin という登録名でurlが登録され、リモー...
# 作業ディレクトリを省略すると、リモートリポジトリのデ...
# 作業ディレクトリを指定する場合は、既存のディレクトリ...
** ベアリポジトリ [#bc35db61]
・作成方法1
cd ディレクトリ.git # 拡張子を慣習的につける
git init --bare
** 空のリモートリポジトリ(ベアリポジトリ)にpushする(新...
git add ファイル
git remote add origin リモートリポジトリ # リモートリポ...
git remote -v ; git branch -vv
git commit -m "注釈"
git push --set-upstream origin master # --set-upstre...
** リモートリポジトリ自体の移動、それを追従しているリポジ...
リモートリポジトリの移動自体は単にまるごとディレクトリを...
これに追従しているリポジトリは
git remote set-url origin 新しいリモートリポジトリのURL
をして、登録名の内容を上書き更新する(originを消してから...
又は、originを作り直す場合は
git remote rm origin # リモートリポジ...
git remote add origin リポジトリのURL # URLでリモートリ...
リモートリポジトリのURLの書式は、git remote -v の結果を...
** リモートリポジトリの登録、変更、削除 [#vf8d3bdf]
git remote add リモートリポジトリの登録名 リモートリポジ...
git remote rename リモートリポジトリの変更前の登録名 リ...
git remote rm 削除するリモートリポジトリの登録名
git remote set-url origin 変更後のリポジトリのURL # URL...
git remote [-v] # リモートリポジトリの一覧表示
//=======================================================...
* 新しいブランチを作り、追いかける手順の例(よく使う) [#...
** ローカルにブランチを作り、リモートリポジトリにpushする...
作業ディレクトリやステージは commit,push済であるとする
$ git branch nwp # 現在の状態で、ブランチnwpを作成
$ git checkout nwp # ブランチnwpに移動
なお、ここの段階でファイルを変更して add,commitをしても...
$ git push --set-upstream origin nwp # リモートリポジト...
# nwpは、origin/nw...
# --set-upstreamに...
** リモートリポジトリで、新たに作成されたブランチnwpを追...
作業ディレクトリやステージは commit,push済であるとする
$ git fetch --all --tags
$ git checkout --track origin/nwp # リモートリポジトリo...
# を作成し、チェック...
# git checkout -b nwp...
- 上の2つを組み合わせると、新しくブランチを作って複数の...
:|(例)同じリモートリポジトリoriginを上流にもつリポジト...
Aで新しいブランチnbを作成し、originにpushした。
このpushされ作成されたブランチnbを、Bで追従するようにBで...
すると、AとBとの間でファイルの同期のようなことが出来る。
すなわち、Bのnbで変更した内容を、Aのnbに取り込んだり、そ...
なお、AとBとで同時に同じファイルの同じ箇所に対して異なる...
この場合はマージ作業を行う。
//=======================================================...
* gitコマンド [#l406d658]
//-------------------------------------------------------...
** status [#p519869b]
git status [-s] # -sは簡潔表示(非追跡対象のファイル...
git status -sb # -sは簡潔表示、-bは現在のブランチを...
.gitignore ファイル
このファイルを使って無視するファイルを指定できる(非追...
再帰的にディレクトリ階層に適用される。
利用できる正規表現は git help gitignore や man gitigno...
(例)作業ディレクトリに以下の内容で .gitignoreを置く
*.x
*.o
*.a
*~
//-------------------------------------------------------...
** diff [#j1b1d251]
git diff [--] [ファイル] # 作業ディレクトリと...
git diff --cached [--] [ファイル] # ステージとコミット...
# 引数の曖昧さを避け...
# ファイルには、ディ...
git diff A B [ファイル] # 差分をみる。AやBは SHA1や...
git diff A..B [ファイル] # 〃
git diff A...B [ファイル] # AとBとの共通の親と, Bの差分
(例)
git diff master..origin/master # リモートリポジトリの...
# origin/masterの位置は...
# しばらく fetchやpull...
git diff A:file1 B:file2 # Aのfile1とBのfile2の比較
git diff -U20 # 違いがあった所の前後20行を含めて差分を出...
git diff -w # ファイル内のスペースの違いを無視、改行コ...
git diff -b # ファイル内のスペースの数の違いを無視、改...
git diff --name-only # 差分のあったファイルのファイル...
git diff --name-status # 差分のあったファイルのファイル...
# git status -s と同じ?
COLOR(RED){空白に関する警告を表示する(コミット前に予め確...
$ git diff --check
作業ディレクトリの変更について、空白に関する警告を表示す...
デフォルトでは以下の場合に警告する(core.whitespaceの設...
o 行末に空白がある
o 空白を含む空行がある
o ファイルの末尾に空行がある
o タブの次に空白がある
//-------------------------------------------------------...
** show [#baf2d096]
git show オブジェクト[:ファイル] # コミットやその内容(...
# オブジェクトは SHA1...
# :ファイル 特定のファ...
//-------------------------------------------------------...
** log [#x099c249]
コミットログを表示する
git log -5 --oneline --decorate --graph --all [--stat] [...
...
...
...
...
...
...
git log --grep hogehoge #ログ内容を検索
git log -p -S'hogehoge' file # コミットの中で、fileのho...
# コミットを検索する。
# -pオプションがあるのでそ...
(その他のオプション)
git log --since="50 minutes ago" # 50分前からのログの...
git log --all --since="2023-03-17" #2023-03-17以降のロ...
gitk --all --since="2023-03-17" #同様のことはgitkで...
git log --no-merges issue54..origin/master #ログのフ...
#origin/masterには含まれるが、issue54には含まれないコミ...
git log contrib --not master # masterに無くcontribブラ...
- git log でページャが動いたとき、hでヘルプが出る。いろい...
- ファイルを削除したコミットから、削除されたファイルのフ...
出来る(たぶん自動的に前のコミットとの差分が取られるため)
//-------------------------------------------------------...
** git log のフォーマット指定(log) [#oa806511]
git log --oneline --decorate --graph --all --pretty=form...
%C(色名) 文字の色を指定。autoだと項目により自動で色付...
%x09 タブ
%h sha1(ハッシュ値)
%d 注釈
%cd 日付。日付のフォーマットは別途 --date=shortで与...
%an コミットした人
--date=iso だと "2015-03-21 16:24:43 +0900" となる。他...
~/.gitconfig に次のものを入れておくと、git mylog --all ...
[alias]
mylog = log --oneline --decorate --graph --pretty=fo...
- git log のオプション等
-- 引数にファイル名(複数可)を与えると、そのファイルに関す...
-- --follow でファイル名が変更されても追跡する(ただし引...
-- --summary でリネームなどの追加情報を表示(リネームでは...
-- -M50% でリネームの判断の類似度の閾値を指定(デフォルト...
- ファイルの更新内容をさかのぼる例(ファイル名変更も追跡)
git mylog --all --follow --date=iso --summary -p -- sam...
#-pで差分を表示、--followでリネームに対応、--summaryで...
#もし -pを付けないと1行のログだけで表示
//-------------------------------------------------------...
** 行が追加・削除されたコミットを調べる(log) [#n3efc0b4]
git log --cc --all -S"h5py.get_config().default_file_mod...
--ccで各コミットのdiff(実際はパッチ)をとる(マージコミ...
-Sで検索にヒットしたコミットだけ表示する
コミットのSHA1やコミットメッセージがわかるので、
git show 287658 や、git log 287658 、
gitkの Find欄にそのメッセージを入れて、コミットを検索表...
- log -p や --cc の挙動を調べる例
/bin/rm -rf .git a b
git init
echo foo > a; git add a; git commit -m "add a"
git branch other; git checkout other
echo bar > b; git add b; git commit -m "add b"
git checkout master
git merge --no-commit --no-ff other
echo bart > a; git add a
git commit -m "merge branch other"
echo "*** log"; git log -25 --oneline --decorate --grap...
echo "*** log -p"; git log -p
echo "*** log --cc"; git log --cc
-- --cc は -p に加え、マージコミット(fast-forwardでないも...
表示する。(--cc は -c より圧縮されたパッチを表示している)
-- -p はマージコミットを除き(fast-forwardは除かない)、各...
-- c.f. マージしたコミットのsha1があったとする(fast-forwa...
下記の showと log --ccではともにマージコミットの差分を表...
git show sha1 #コミットを表示(差分も表示される)
git log --cc sha1 sha1^..sha1 #親1からのログを表示(--...
git log --cc sha1 sha1^1..sha1 #親1からのログを表示
git log --cc sha1 sha1^2..sha1 #親2からのログを表示
なお、sha1^1か sha1^2かのどちらか一方だけが、マージコミ...
//-------------------------------------------------------...
** blame [#pdb0922b]
git blame [-C] -L n,m file # fileに対して、n~m行目の...
# -Cがあるとfile名の変更も...
# 行は1から数える。
(例、どのコミットで追加されたものかを調べてる)
$ git blame -C -L 22,24 makefile
dfa94f47 (okazaki,i 2022-09-10 17:07:28 +0900 22) #DOPT ...
1e84d5f5 (okazaki,i 2018-03-19 20:13:09 +0900 23) DOPT =...
059d6a13 (okazaki,i 2023-03-17 22:14:06 +0900 24) #DOPT ...
$ git show 1e84d5f5 makefile #さらに 1e84d5f5のコミット...
#表示したいとき
$ git diff -U 201e84d5f5..HEAD makefile #さらに HEADど...
#リダイレクシ...
(他)
gitに bisectというものもあり(二分探索によるデバッグ支援...
git log -p -S も見よ。
問題がどのコミットで生じ始めたかを見つけるために、checko...
二分探索するのが簡単だろう。
//-------------------------------------------------------...
** grep [#t0001967]
git grep --heading --line-number -3 '検索文字列' [sha1な...
ファイル名を先頭に、行番号を行頭に表示して、検索文字列...
とき、その行の前後各3行を表示する。
作業ディレクトリ内で、カレントディレクトリ以下の追跡対...
sha1などを指定するとそこで文字列検索する。
他のオプション
-w 単語境界での検索
-F 正規表現を利用しない
-l マッチしたファイル名だけ表示
git rev-list sha1など [-- パス] | cut -c -7 | xargs git ...
コミットのsha1やブランチ名などを指定(--allも可)し、そ...
文字列を検索する? パスを指定すると限定できる?
なお、git grep の結果で、40桁のsha1の代わりに 7桁で出...
(例)
git rev-list --all | cut -c -7 | xargs git grep --headin...
git grep -l 文字列 | xargs sed -i'' -e 's/文字列/置換文...
カレントディレクトリ以下のファイルで、文字列、を含むフ...
に置き換える。
なお、sedのオプション -i'' で検索されたファイルを直接...
-i'.old' とすると、置換前のファイルは、ファイル名.old ...
//-------------------------------------------------------...
** branch [#cbfec91a]
git branch -vv #ブランチを表示
git branch -a #リポジトリにある全てのブランチを表...
git branch ブランチ #ブランチ...
git branch -m 古いブランチ名 新しいブランチ名 #ブランチ...
git branch -m 新しいブランチ名 #現在のブ...
git branch --merged # 現在のブランチにマージされた...
git branch --no-merged # 現在のブランチにマージされて...
(使い終わったブランチはだいたい削除されるので、あまり意...
git branch -d hoge #ローカルリポジトリのブラ...
#(予めhoge以外をカレント...
git branch -d -r origin/hoge #ローカルリポジトリのブラ...
#(リモートリポジトリでも...
git push origin --delete hoge #リモートリポジトリorigin...
または git push origin :hoge
または git push origin :refs/heads/hoge
(git fetch するとローカルリポジトリのリモートブランチは...
- ブランチ削除
:|
自分がブランチを消したとしても、他の人が同じくcloneして使...
その人が消さない限りその人のリポジトリには残る。
自分がリモートリポジトリのブランチを消したとしても、他の...
リモートリポジトリに再度、自分が消したブランチが作成され...
自分のリポジトリにも再度、消したブランチが作成される。
(cloneした全員のリポジトリでブランチを消さないと、実質消...
- detached branchを作って、コミットし、通常のブランチにch...
そのコミットした情報にはアクセスできなくなる?
リポジトリには残っていると思うが、.gitディレクトリを操作...
- 未マージのブランチ削除
git branch -d でブランチを削除しようとしても、そのブラン...
エラーになる。この場合は -d の代わりに -D を使ってブラン...
//-------------------------------------------------------...
** リモートリポジトリのブランチを作成や追跡(branch) [#g82...
リモートリポジトリにブランチが無い場合
ローカルリポジトリのローカルブランチを、リモートリポジト...
git push -u origin hogeB:hogeA #hogeBブランチを、origin...
#-u により hogeBはorigin...
#(-uは--set-upstreamの...
git push -u origin hogeA:hogeA #同じブランチ名のときは...
git push -u origin hogeA #このようにも書ける(・...
リモートリポジトリにブランチが有る場合
git branch hogeB origin/hogeA #リモートリポジトリのブ...
git branch --set-upstream=origin/hogeA hogeB #リモート...
#既存のブ...
#(hogeBを...
//-------------------------------------------------------...
** fetch [#ld059d0d]
git fetch --all # 登録されている全てのリモートリ...
git fetch --all --tags # 上記に加え、リモートリポジトリ...
git fetch [リモートリポジトリ] [ブランチ]
//-------------------------------------------------------...
** pull [#v5544ac2]
git pull [リモートリポジトリ] # fetchし、mergeするこ...
//-------------------------------------------------------...
** push [#l21306b2]
git push [リモートリポジトリ] [ブランチ] [--tags]
# 競合が発生した場合は pushはできない(fetch, merge...
# --tagsはタグもプッシュする
//-------------------------------------------------------...
** tag [#nf4eb8ef]
git tag タグ #タグを付ける
git tag [-a] タグ [SHA1など] [-m 注釈] # タグを付ける
# -aと-mで1行の注釈を入れれる。-aのみは注釈を入れるた...
# -sオプションで署名もできるらしい(詳しくは https://gi...
git tag # すべてのタグを表示
git tag -d タグ名 #タグ名を削除する
git fetch --tags #リモートリポジトリのタグを取得する
git push --tags #リモートリポジトリ...
git push --delete リポジトリ タグ名 #リポジトリ(origin...
- タグはsha1に紐づいている(タグが付いているところでコミ...
//-------------------------------------------------------...
** checkout [#b792a466]
git checkout {ブランチ|タグ|sha1など} #指定のものをチェ...
#非追跡対象のファイルなどは、そのまま残される。
#sha1でチェックアウトした時、detached HEADになるが、普...
#できる(ブランチ名を新たにつける方が取り扱いやすい)。
git checkout -b ブランチ {リモートリポジトリ/ブランチ|タ...
...
#リモートリポジトリ/ブランチを指定した場合、
#作成したブランチはリモートブランチ(リモートリポジト...
#ステージにファイルがあってもよい。ステージにあるファ...
#もとのブランチのステージからは取り除かれる。
git checkout --track リモートリポジトリ/ブランチ #git c...
#と同じ
#作成したブランチはリモートブランチ(リモートリポジト...
- リモートリポジトリのブランチ(◯/◯)やブランチ(◯)はマ...
- チェックアウト(ブランチへの切り替え)ができない場合も...
- gitではファイルのタイムスタンプは管理されない。checkout...
- detached HEAD の利用例
detachして、追加修正した記録を残したいときの例
$ git commit -m "a commit for debug tests" #とりあえず...
$ git branch debug_hoge #ブラン...
$ git tag debug_hoge_20230322 #タグを...
$ git push --set-upstream origin debug_hoge #リモー...
$ git push --tags #タグも...
$ git push origin --delete debug_hoge #リモートブラン...
$ git checkout master
$ git branch -D debug_sotu_ngrid #ローカルブラン...
最後の三行は
$ git checkout master
$ git branch -D -r debug_sotu_ngrid
か。
//=======================================================...
* その他のコマンド等 [#e07d8302]
//-------------------------------------------------------...
** gitk [#n2f45180]
gitk [--date-order] [--all] [ファイル] # git log など...
# --date-orderは日付...
gitk --date-order master_20230403 #などある時点から過去...
//-------------------------------------------------------...
** git help [#k13d01b7]
git help コマンド名 #gitのオンラインマニュアル
//-------------------------------------------------------...
** パッチ [#z0a72181]
git diff差分はそのままでパッチファイルになっている。
パッチの当て方
patch [--dry-run] -p1 < パッチファイル #--dry-runは何...
//-------------------------------------------------------...
** git config [#f5a49bb9]
git config [--global] -l # .git/configを表示
git config [--global] -e # .git/configを編集
//-------------------------------------------------------...
** 表示の色変更(git config) [#kc89f85c]
- git log 出力のタグの色を変える
git config --global color.decorate.tag "blue" #青色に...
//-------------------------------------------------------...
** HEADなど(sha1の別名) [#d8daf63f]
HEAD #現在checkoutしているコミット(ブランチ等)のsha1...
HEAD^ #HEADのひとつ前のコミットを表す
HEAD^^ #HEADの前の前のコミットを表す
(sha1の数字を使っても同じことを表せる。なお gitkでは利...
例)S=91dc63f git diff ${S}^..${S} sample_H2mb64g64.inp
//-------------------------------------------------------...
** アーカイブを作る [#vad53986]
git archive master --prefix='project/' --format=tar > gi...
git shortlog --no-merges master --not master_20220310 #...
#...
#...
//-------------------------------------------------------...
** GitHub [#h01740d0]
- githubのリポジトリの作り方
まず、ブラウザで名前を付けてリポジトリを作る。
ここへのpushの仕方が表示されるので、ローカルに作っておい...
//-------------------------------------------------------...
** 不具合対応 [#fa9b8e8e]
- ファイル名に日本語を使わない方が無難である。commitメッ...
- ブランチ名とタグ名が同じ場合に、どちらかを削除する方法...
tagを消すとき git push origin :refs/tags/タグ名
branchを消すとき git push origin :refs/heads/ブランチ名
- unable to read askpass のエラー対応
$ git push
(gnome-ssh-askpass:hogehoge): Gtk-WARNING **: cannot ope...
error: unable to read askpass response from '/usr/libexe...
Username for 'https://github.com':
などと、表示される場合の対応。
無視して、つづけて問題無い(GUI環境で無いために、パスワ...
unset SSH_ASKPASS をすると表示されなくなる
- git status で日本語のファイル名が化けているのを表示させる
localな設定
git config --local core.quotepath false #.git/confi...
git config --local --unset core.quotepath #設定を元に...
globalな設定
git config --global core.quotepath false #~/.gitconf...
git config --global --unset core.quotepath
//=======================================================...
* tips [#va6b12fc]
** 変更のあったファイルを emacsでいっきに開く [#x2ac1d78]
emacs `git diff --name-only`
** 変更があったファイルで、行末に空白があるものを調べる [...
#タグmaster_20200619から変更があったファイルのうち、拡張...
#行末にひとつ以上の空白があるもののファイル名を表示する
for f in ` git diff --name-only master_20200619 | grep...
echo ==== $f ====; grep ' \+$' $f > /dev/null; [ $? ==...
** 変更があったファイルで、タブを含むものを調べる [#qca5e...
#タグmaster_20200619から変更があったファイルのうち、拡張...
#タブを含むファイルのファイル名を表示する
for f in ` git diff --name-only master_20200619 | grep...
echo ==== $f ====; grep $'\t' $f > /dev/null; [ $? == ...
#(注釈: ここで $'文字' はbashの機能。$...
(補足)
$ grep $'\t' makefile
と同じことは
$ grep -P '\t' makefile #perl互換の正規表現
でできるが、
デフォルトでは grepは \t をタブ文字コードと理解しない(...
そのため bashで $'\t' によりタブ文字コードを grepに渡し...
さらに、bashではタブ文字コードを入力することが出来るの...
タブ文字コードをシングルクォーテーションで括って grepに...
c.f.
$ grep \\t makefile #これは'\t'の検索と同じ
$ grep '\t' makefile #ただの tの検索になる
$ grep '\\t' makefile #これは \tの2文字の検索
$ grep '\\\t' makefile #これも \tの2文字の検索
$ grep '※ここでCtrl-v Tab' makefile #これは$'\t'の検...
** HEADのsha1値と注釈を表示する [#k53e99a6]
temp=`git rev-parse --short HEAD; git log -1 --pretty=%B...
** 作業ディレクトリの変更の有無を表示する [#t122e849]
if git diff --quiet >/dev/null 2>&1; then echo "--"; els...
** コミットの注釈が英語以外の場合にエラーにするフックの設...
次の 1)または 2)のフックを作り、英語以外のコミット注釈を...
1) ベアリポジトリに pushされるときのフック、~
2) ローカルリポジトリで commitするときのフック。~
なお、リポジトリを cloneしたときに、自動的に 2)のフックを...
そのため 2)は各ユーザが自分で手動でフックを設置しなければ...
一方、1)は push時にエラーになるが、エラーとなったユーザは...
(注) 2023/09/30に以下のフックを作ったが、バグが無いとも言...
フック:ソフトウェアに予め用意されている、特定のタイミン...
*** 1) ベアリポジトリに pushされるときにエラーにするフッ...
hooksディレクトリに以下の内容を updateというファイル名で...
#!/bin/sh
# 2023/09/30 okazaki,i
MYDEBUG=0 #1 or 0
#get the commit range to be push
refname="$1"
oldrev="$2"
newrev="$3"
#rearrange the commit range
zero="0000000000000000000000000000000000000000"
if [ $oldrev != $zero ]; then
range="$oldrev..$newrev"
else
range="$newrev"
fi
#check charaset, then reject or continue to the commit.
[ $MYDEBUG -ne 0 ] && echo "MY update: git rev-list" 2>&1
[ $MYDEBUG -ne 0 ] && git rev-list $range 2>&1
for c in `git rev-list $range`; do
[ $MYDEBUG -ne 0 ] && echo "MY update: git cat-file,...
git cat-file commit $c | sed '1,/^$/d' > /tmp/hook.$$
chara=`file -i /tmp/hook.$$ | sed 's/^.*charset=\([^...
rm -f /tmp/hook.$$
[ $MYDEBUG -ne 0 ] && echo "chara=$chara" 2>&1
[ $MYDEBUG -ne 0 ] && echo "using /tmp/hook.$$" 2>&1
#check charaset
if [ x"$chara" != x"us-ascii" ]; then
echo "REJECT your message which is not us-ascii....
exit 1
fi
done
[ $MYDEBUG -ne 0 ] && echo "CONTINUE to commit." 2>&1
exit 0
*** 2) ローカルリポジトリで commitするときにエラーにする...
.git/hooksディレクトリに以下の内容を commit-msgというファ...
#!/bin/sh
# 2023/09/30 okazaki,i
MYDEBUG=0 #1 or 0
#get commit the message
msg=`cat "$1"`
[ $MYDEBUG -ne 0 ] && echo "MY commit-msg: $msg"
#determine charaset
echo "$msg" > /tmp/hook.$$
chara=`file -i /tmp/hook.$$ | sed 's/^.*charset=\([^;]*\...
rm -f /tmp/hook.$$
[ $MYDEBUG -ne 0 ] && echo "MY commit-msg: chara=$chara"...
[ $MYDEBUG -ne 0 ] && echo "using /tmp/hook.$$" 2>&1
#check charaset, then reject or continue to the commit.
if [ x"$chara" != x"us-ascii" ]; then
echo "REJECT your message which is not us-ascii." 2>&1
exit 1
fi
[ $MYDEBUG -ne 0 ] && echo "CONTINUE to commit." 2>&1
exit 0
** マシン毎に user.name, user.emailの値を自動的に変更する...
.gitconfigに環境変数を利用することはできない。
しかし、user.name, user.emailに与えた値よりも、
環境変数 GIT_AUTHOR_NAME, GIT_AUTHOR_EMAILの値が優先され...
従って、.bashrcなどを利用してこの環境変数をマシン事に変え...
user.name, user.emailの値を自動的に変更できる。
//=======================================================...
ページ名: