PIB - git
バージョン管理ツール。
Linux のバージョン管理のために作成された。

ライセンス

GPL.

公式ページ等

参考になるページ

作って学ぶ

ネタ元:

tool

Tips

リポジトリの書き換え

git filter-branch 使うと commit 時の email とか時刻の書き換えが出来る(ただしリビジョン値が変わってしまう)。
参考:

オブジェクトのSHA1値

「blob ファイルサイズ\0ファイルの内容」の sha1sum を取れば良いらしい。
例えば hoge と言うファイルが git に登録された際の SHA1 値は以下のようにして求めることが出来る。
@(){ unset -f $FUNCNAME;(echo -en "blob $(stat -c%s "$1")\0";cat "$1")|sha1sum|cut -d" " -f1;};@ hoge
参考:
基本的に .git 以下を公開すれば良いらしく、通常は --bare 付けて作業ファイルなしで .git のみの状態にしておくらしい。
ただし HTTP 経由での取得に必要なファイルを更新しとく必要があるらしいので、以下のサブコマンドを実行しておく必要があるらしい。
git update-server-info
手動でやるのは面倒なので、通常は hooks/post-update 使って自動で上記のサブコマンドを実行するようにしておくと良いらしい。

参考:
commit 時に --date オプションで author date を指定出来る。
commit date は rebase 時に --committer-date-is-author-date を指定すると、author date に揃える事が出来る。

参考:
git difftool -d -x winmerge.sh
のようにすると dirdiff になるので便利らしい。

参考:
追記: 2017-11-02
ひょっとすると、2016-01-25 時点で既にそうだったのかそれ以降そうなったかが不明だが、デフォルトだと working tree 内のファイルはシンボリックリンク作るようになってるらしく、--no-simlinks オプション付けないと Cygwin から WinMerge 呼ぶ場合、上手く diff 取れない。
$ git difftool -d --no-symlinks -x winmerge.sh
以下のコマンドラインが一番詳細かな?
git log --all --graph --color --pretty=fuller --decorate=full
commit と index と working tree の比較は以下のようになる。
commandleftright
git diffindexworking tree
git diff --cachedHEADindex
git diff HEADHEADworking tree
git diff --cached HEAD~HEAD~index
左右入れ替えたいときは -R オプション。
--staged は --cached と同義。

参考:
git add したファイルを取り消すと言うか、index に入れたファイルを index から外すと言うか、stage したファイルを unstage すると言うか、
したい場合は
git reset HEAD FILENAME
もしくは
git reset -- FILENAME
FILENAME が commit 名と衝突しないなら HEAD や -- は省略可能

参考:
ヘルプに出て来ないので見落としていたが、git ls-files なんてサブコマンドがあるらしい。
手順としてはこんな感じ。
git checkout -b rearrange-code/XXX   # 幹
git checkout -b rearrange-code/XXX-A # 側枝
git checkout -b rearrange-code/XXX-B # 側枝
# 順序を入れ替えたいコード(XXX)以外を削除
git commit -a -m "Branch for changing the order of XXX function."
git checkout rearrange-code/XXX-A
git merge --no-ff -m
git checkout rearrange-code/XXX
git reset    rearrange-code/XXX-A
# 順序を入れ替えたいコード(XXX)を移動
commit commit -a --amend -m "Change the order of XXX function."
側枝 rearrange-code/XXX-B に入れ替えたいコードのみを分離しておいて、
側枝 rearrange-code/XXX-A に first-forward せずに merge する(この時点では入れ替えたいコード以外は消滅している)。
その後 rearrange-code/XXX の working copy (これは入れ替え前の状態)を維持したまま commit id だけ rearrange-code/XXX-A に振り替えて、
目的のコードの順序を入れ替えた後、--amend オプション付きで commit すれば、
側枝 rearrange-code/XXX-B に退避しておいたコードの blame が幹である rearrange-code/XXX に継承されるという寸法。
以下のようにすると特定の関数のみ抽出して変更履歴を追跡できる。
git log -L :<funcname>:<file>
ネタ元:

この機能いつから実装されていたのか疑問に思って blame 辿ってみたら、少なくともドキュメント上では 6 年前の 2013-03-29 に変更が入ってた。 結構昔からあった機能らしい。知らんかった。
従来、SHA-1 だったハッシュ値だが Git 2.29 からは SHA-256 によるハッシュ値にも(試験的に)対応したらしい。 git init する際に --object-format=sha256 を与えればハッシュ値が SHA-256 になる。

Cygwin には 2020-10-19 ビルドのバイナリが速攻で収録されてた。 Git for Windows こと git-bash も Git for Windows 2.29.1 がリリース済み。
しかし Ubuntu は現時点だと、focal(20.04LTS)で 2.25.1、groovy(20.10)で 2.27.0、
Debian ですら、testing, sid, experimental が 2.28.0 という状況。
あまり自前ビルドしたくないので、この辺りの足並って欲しいところ。
現時点では experimental と言われてるし、そのうち SHA-1 から SHA-256 への変換とかが出るんじゃないかと思うので、しばらく様子見よいだろうか?

memo

表記意味
<commit-ish>~<n>n代前の祖先
<commit-ish>^<n>1代前の祖先のn番目

参考:

関連