いくつかの本や記事に、Git のブランチとコミットの非常に見栄えの良いグラフが掲載されているのを見てきました。Git 履歴の印刷可能な高品質の画像を作成するにはどうすればよいですか?
36 に答える
更新 2: Git でブランチ トポロジを視覚化するという質問に対するこの回答の改良版を投稿しました。そのバージョンには が含まれ lg3
ており、作成者とコミッターの両方の情報が表示されるので、実際に確認する必要があります。歴史的な理由(および担当者、私は認めます)のためにこの回答を残しますが、私は本当にそれを削除したくなります.
私の2セント~/.gitconfig
:通常、ファイルにスローする2つのエイリアスがあります。
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
git lg
/git lg1
次のようになります。
次のようになりgit lg2
ます。
(注: fracz の、Jubobs の、またはHarry Lee のなど、この質問に対するより適切な回答が存在するようになりました!)
Gitgraph.jsを使用すると、リポジトリなしできれいな Git ブランチを描画できます。ブランチとコミットを構成する JavaScript コードを記述し、ブラウザーでレンダリングするだけです。インタラクティブなドキュメントが利用可能です。
var gitGraph = new GitGraph({
template: "blackarrow",
mode: "compact",
orientation: "horizontal",
reverseArrow: true
});
var master = gitGraph.branch("master").commit().commit();
var develop = gitGraph.branch("develop").commit();
master.commit();
develop.commit().commit();
develop.merge(master);
またはmetro
テンプレートを使用:
または、コミット メッセージ、作成者、およびタグを使用します。
JSFiddleでテストします。
@bsaraのGit Grapherで生成します。
TikZ と PGFの上に構築されgitdags
た小さな LaTeX パッケージで、ベクトル グラフィックのコミット グラフなどを簡単に作成できます。
既存のリポジトリのコミット グラフの自動生成はの目的ではありませんgitdags
。生成されるグラフは、教育目的のみを目的としています。
ASCII コミット グラフの代わりに、Git の質問に対する回答のグラフを作成するためによく使用します。
- マスターでバグ修正を行い、それを安定性の低いブランチに統合するにはどうすればよいですか?
- git commit --amend は正確にはどのように機能しますか?
- 「git checkout origin/<branch>」を実行した後、Git が「現在どのブランチにもありません」と表示するのはなぜですか?
- マスターをブランチにマージすることと、ブランチをマスターにマージすることの違いは何ですか?
- Git rebase --preserve-merges が失敗する
以下は、単純なリベースの効果を示すグラフの例です。
\documentclass{article}
\usepackage{subcaption}
\usepackage{gitdags}
\begin{document}
\begin{figure}
\begin{subfigure}[b]{\textwidth}
\centering
\begin{tikzpicture}
% Commit DAG
\gitDAG[grow right sep = 2em]{
A -- B -- {
C,
D -- E,
}
};
% Tag reference
\gittag
[v0p1] % node name
{v0.1} % node text
{above=of A} % node placement
{A} % target
% Remote branch
\gitremotebranch
[origmaster] % node name
{origin/master} % node text
{above=of C} % node placement
{C} % target
% Branch
\gitbranch
{master} % node name and text
{above=of E} % node placement
{E} % target
% HEAD reference
\gitHEAD
{above=of master} % node placement
{master} % target
\end{tikzpicture}
\subcaption{Before\ldots}
\end{subfigure}
\begin{subfigure}[b]{\textwidth}
\centering
\begin{tikzpicture}
\gitDAG[grow right sep = 2em]{
A -- B -- {
C -- D' -- E',
{[nodes=unreachable] D -- E },
}
};
% Tag reference
\gittag
[v0p1] % node name
{v0.1} % node text
{above=of A} % node placement
{A} % target
% Remote branch
\gitremotebranch
[origmaster] % node name
{origin/master} % node text
{above=of C} % node placement
{C} % target
% Branch
\gitbranch
{master} % node name and text
{above=of E'} % node placement
{E'} % target
% HEAD reference
\gitHEAD
{above=of master} % node placement
{master} % target
\end{tikzpicture}
\subcaption{\ldots{} and after \texttt{git rebase origin/master}}
\end{subfigure}
\caption{Demonstrating a typical \texttt{rebase}}
\end{figure}
\end{document}
HTML/Canvasを使用してきれいな Git コミット グラフを生成できるツールを 1 つ作成しました。
また、使いやすい jQuery プラグインを提供します。
[GitHub] https://github.com/tclh123/commits-graph
プレビュー:
Sourcetreeは本当に良いものです。見栄えの良い中サイズの履歴とブランチ グラフが出力されます (以下は、いくつかのブランチを表示するためだけに、実験的な Git プロジェクトで実行されます)。Windows 7 以降および Mac OS X 10.6 以降をサポートします。
git-forest
は、私が 1 年以上使用している優れた Perl スクリプトであり、git log
コマンドを直接使用することはほとんどありません。
これらは、私がこのスクリプトで気に入っている点の一部です。
- ユニコード文字を使用してグラフの線を描画し、グラフの線をより連続的に表示します。
- 通常のコマンド
--reverse
では不可能な、グラフ出力と組み合わせることができます。git log
- コミットのリストを取得するために内部的に使用
git log
されるため、渡すすべてのオプションgit log
もこのスクリプトに渡すことができます。
次のように使用するエイリアスがありgit-forest
ます。
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
端末での出力は次のようになります。
関連する質問への回答で見つけた Graphviz スクリプトに基づいて、Git リポジトリの概要ビューを作成するRuby スクリプトをハックしました。それはすべての線形履歴を省略し、「興味深い」コミット、つまり複数の親、複数の子を持つコミット、またはブランチまたはタグによって指されているコミットのみを表示します。jQuery用に生成されるグラフのスニペットを次に示します。
git-big-pictureとBranchMasterは、タグ、ブランチ、マージなどの関係のみを表示することで、グラフの高レベル構造のみを表示しようとする同様のツールです。
この質問にはさらにいくつかのオプションがあります。
git tree
、git stree
およびの 3 つのカスタム コマンドを追加しましgit vtree
た。その順番で見ていきます。
[alias]
tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n %C(black)[%cr]%C(reset) %x09%C(black)%an: %s %C(reset)'
とgit stree
でgit vtree
、Bash を使用して書式設定を支援しました。
[alias]
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
stree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
done < <(git logx && echo);"'
[alias]
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
vtree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
done < <(git logx && echo);"'
これは Git バージョン 1.9a で動作します。色の値「auto」は、このリリースで明らかにデビューしています。ブランチ名が異なる色になるので、これは素晴らしい追加です。これにより、たとえば、ローカル ブランチとリモート ブランチを簡単に区別できます。
より詳細なテキスト出力については、以下を試してください。
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
ファイル$HOME/.gitconfigにエイリアスを追加できます。
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
それは彼らがどのように見えたかによって異なります。次のような写真を作成するgitxを使用します。
24 方向のタコのマージでgit log --graph
対gitkを比較できます(元はhttp://clojure-log.n01se.net/date/2008-12-24.htmlから):
gitg : gtk ベースのリポジトリ ビューアー。これは新しいものですが、興味深くて便利です。
現在使用しています。
私は時々gitgを使用しますが、いつもコマンド ラインに戻ります。
[alias]
# Quick look at all repositories
loggsa = log --color --date-order --graph --oneline --decorate --simplify-by-decoration --all
# Quick look at active branch (or refs pointed)
loggs = log --color --date-order --graph --oneline --decorate --simplify-by-decoration
# Extend look at all repo
logga = log --color --date-order --graph --oneline --decorate --all
# Extend look at active branch
logg = log --color --date-order --graph --oneline --decorate
# Look with the date
logda = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\" --all
logd = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\"
# Look with the relative date
logdra = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\" --all
logdr = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\"
loga = log --graph --color --decorate --all
# For repositories without subject body commits (Vim repository, git-svn clones)
logt = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\"
logta = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all
logtsa = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all --simplify-by-decoration
ご覧のとおり、以下に基づいて、ほぼキーストロークを節約するエイリアスです。
- --color: クリアルック
- --graph: 親を可視化
- --date-order: 最も分かりやすいレポの見方
- --decorate: 誰が誰だ
- --oneline: 多くの場合、コミットについて知っておく必要があるすべてのこと
- --simplify-by-decoration: 初見の基本 (タグ、関連するマージ、ブランチのみ)
- --all: このオプションの有無にかかわらず、すべてのエイリアスでキーストロークを保存します
- --date=relative (%ar): リポジトリでのアクティビティを理解します (ブランチが master の近くに数か月前にコミットされている場合があります)
Git の最近のバージョン (1.8.5 以降) では、装飾プレースホルダー %d で %C(auto) を利用できます。
ここから必要なのは、必要なものをフィルタリングするためのgitrevisionsをよく理解することだけです (master..develop のようなもので、--simplify-merges
長期的なブランチに役立つ可能性があります)。
コマンド ラインの背後にある機能は、ニーズに基づいて迅速に構成できることです (リポジトリは一意のキー ログ構成ではないことを理解してください。そのため、--numstat、--raw、または --name-status を追加する必要がある場合があります。ここgit log
とエイリアス高速で強力で、(時間をかけて) 達成できる最も美しいグラフです. さらに, 出力はデフォルトでページャーを介して表示されます (控えめに言っても) 結果の中をいつでもすばやく検索できます. 納得できませんか? プロジェクトで常に結果を解析できますgitgraphのように。
Slipp の素晴らしい回答を微調整すると、彼のエイリアスを使用して 1 つのブランチのみをログに記録できます。
[alias]
lgBranch1 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lgBranch2 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit
lg = !"git lg1"
オフにすることで、--all
今できること
git lgBranch1 <branch name>
あるいは
git lgBranch1 --all
gitk
またはを試してくださいgitk --all
。ただし、関数としての印刷/保存imgはありません。
グラフの履歴を表示するために、次のgit log
エイリアスがあります。~/.gitconfig
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
これを配置git l
すると、次のような出力が得られます。
Git 2.12 以降log.graphColors
では、構成オプションを使用してグラフの線の色をカスタマイズすることもできます。
ログの形式は に似ていますが、作成者名( を尊重) と相対的な--oneline
作成日が追加されています。コミット ハッシュなどにデフォルトの色を使用するように Git に指示する構文は、Git >= 1.8.3でサポートされていることに注意してください。.mailmap
%C(auto)
Git リポジトリのコミット履歴の PNG または SVG 表現を生成します。
Raphael Web グラフィックス ライブラリのデモの 1 つとして、ファンキーな Git コミット グラフがあります。
デモは静的ですが、コードを取得して、静的データをライブ データ セットに交換するのは簡単なはずです。JSON 形式の Git コミット データに過ぎないと思います。
デモはこちら: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
OS X ユーザーのために、私は @gospes の例を取り上げ、それを gsed ( Homebrewgnu-sed
経由でインストール) 用にわずかに変更し、色を調整しました (黒の背景で動作するように、元の例がどのようにレンダリングされるかはわかりません)黒い背景の端末で黒いテキストを指定するための例)。
[alias]
# tree, vtree, stree support
logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++ %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n %C(bold black)[%cr]%C(reset) %x09%C(bold black)%an: %s %C(reset)'
stree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
done < <(git logx && echo);"' | less -r
vtree = !bash -c '" \
while IFS=+ read -r hash time branch message; do \
timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
printf \"%${timelength}s %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
done < <(git logx && echo);"' | less -r
OS X の鍵は、最初に GNU sed (-r オプション付き) をインストールすることです。これは、システムにインストールされた sed を上書きせず、代わりに GNU sed を「gsed」としてインストールする Homebrew で最も簡単に実行できます。これが、OS X が機能しないことについて上でコメントした @SlippD.Thompson に役立つことを願っています。
直接的なツールについてはわかりませんが、スクリプトをハックしてデータをドット形式にエクスポートし、Graphvizでレンダリングできるかもしれません。
コミュニティのエイリアスは次のとおりgit ls
です。git ls
グラフを表示すると、各コミットは 1 行だけをカバーします。すべてが色付きで、役立つ情報が含まれています。他のブランチのコミット履歴を確認することもできます:
git config --global alias.ls '!f() { git log $1 --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cgreen\\ [%ae,%ar]" --decorate --graph; }; f'
使用法:
# shows commits graph on the current branch
git ls
# shows commits graph on the develop branch
git ls develop