かなりgitブランチグラフ


1385

本や記事の中に、gitブランチとコミットの非常に見栄えのよいグラフがいくつかあるのを見てきました。gitの履歴の高品質で印刷可能な画像を作成するにはどうすればよいですか?


4
graphizグラフを作成するpythonスクリプトを作成しました!見てください。github.com/chode/git-graph
Stephan Bechter

4
高品質で印刷可能なものが必要な場合は、私のツール(bit-booster.com/graph.html)が「git log」をSVGに変換します。詳細については、私の回答を参照しください。
G.シルビーデイビス

2
独自のgit履歴を視覚化するツール、または-かなりの「Gitブランチ」を描画する方法があるチャート作成ツールを探していますか?
Uri Abramson 2016


5
この質問には関係がないので、directed-acyclic-graphsというタグを削除します
Maksim Dmitriev

回答:


1843

更新:この答えは、それに値するよりもはるかに注目されています。元々投稿されたのは、グラフが見栄えがよく、Illustratorでパブリケーション用に描画できるためです。それ以上の解決策はありませんでした。しかし、今のようなこのQに対してはるかに適用答え、そこに存在するfraczさん、Jubobs '、またはハリーリーさんを!それらに賛成投票してください!!

更新2:git質問の視覚化ブランチトポロジにこの回答の改良版を投稿しました。そのバージョンには 、作者とコミッターの両方の情報を表示するが含まれlg3ているため、実際に確認する必要があります。歴史的な理由で(&rep、私は認めます)この回答を残しますが、本当に削除したくなります。

私の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 lg1

そしてgit lg2次のようになります。
git lg2


35
ええ、そうです。通常および明るい/太字の色は、黒#202020/ #555555、赤:#5d1a14/ #da4939、緑:#424e24/ #a5c261、黄色:#6f5028/ #ffc66d、青:#263e4e/ #6d9cbe、マゼンタ:#3e1f50/ #a256c7、シアン:#234e3f/ #62c1a1、および白:#979797/ #ffffffです。
Slipp D. Thompson 2012

3
@ターボ:私の場合、ターミナルアプリ(Terminal.app)のプロファイル設定で色を変更できます。使用している端末アプリは、指定されたANSI色で表示される色の変更をサポートしている場合とサポートしていない場合があります。また、ダッシュ(正確にはダッシュ)は、option-shift- [ハイフン-マイナスキー]で作成されました。私は、現在のすべてのプラットフォームがUnicodeに対応していると誤って想定していたと思います。
Slipp D. Thompson 2013

3
あなた--date=relative--abbrev-commitあなたが明示的に使用しているため、冗長である%cr%h、それぞれ。
graywh 2013年

6
%C(auto)refnames(%d)に修飾子を追加して、より良い色を取得します。stackoverflow.com/questions/5889878/color-in-git-log/…を
Josef Eisl

2
すばらしい答えです。私は、コマンドが複数との--oneline --decorateの出力のように見えるように修正しましたlg = log --graph --abbrev-commit --decorate --format=format:'%C(yellow)%h%C(reset)%C(auto)%d%C(reset) %C(normal)%s%C(reset) %C(dim white)%an%C(reset) %C(dim blue)(%ar)%C (reset)' --all
クレイグP. Motlin

1198

ここでの回答の多くは素晴らしいですが、エイリアスやその他の設定をせずに、簡単な1行で適切な回答を求めている人のために、ここに示します。

git log --all --decorate --oneline --graph

誰もがgit logいつもやっているわけではありませんが、必要なときは覚えておいてください:

" A Dog " = git log- a ll- d ecorate- o neline - g raph

ここに画像の説明を入力してください


252
git config --global alias.adog "log --all --decorate --oneline --graph"
fracz 2017

4
私はずっと探してい--allたので、泣きそうになりました(T_T)ありがとうございます!
フェリペジェラール

2
--onelineはGit 1.6.3で導入されました: github.com/git/git/blob/…--pretty = onelineは1.6.3より前のGitバージョンで動作します
Pat Myron

13
SOのベストアンサー。それを気楽に保ってくれてありがとう。
トビアスフェイル

4
「--decorate」はデフォルトで含まれていると思います。とにかく私はこの方法で頭字語を覚えています!
Josiah Yoder

378

テキスト出力の場合、次のことを試すことができます。

git log --graph --abbrev-commit --decorate --date=relative --all

または:

git log --graph --oneline --decorate --all

または:ここにある DAGグラフを描画するためのgraphvizのエイリアスは。

私は個人的に使用しgitxgitk --allそしてgitnub


14
を追加すると--abbrev-commit --decorate、完璧です!
非対称的な

6
--abbrev-commitは--onelineによって暗示されますか?
dwineman 2012

4
@dwinemanはい、--abbrev-commit使用しても必要ありません--oneline
Thomas

2
2行目でgit log --graph --oneline --decorate --date=relative --allは、--date引数は役に立たないようです。ログに日付が表示されません。
Lerner Zhang

--onelineが指定されている場合、日付は表示されません
martinkunev

253

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);

Gitgraph.jsで生成されたサンプルグラフ

またはmetroテンプレート付き:

GitGraph.js Metroテーマ

または、コミットメッセージ、作成者、タグを使用します。

コミットメッセージを含むGitGraph

JSFiddleでテストします

@bsaraによるGit Grapherで生成します。


3
いや、それはすごい!それをフィドルjsfiddle.net/guan1oz1に投稿して、すぐにテストできるようにします。
berkus 2014年

14
ただし、矢印は子供を指すのではなく、親を指す必要があります。
jub0bs 2015

4
@Jubobs:いいですね。これは、Gitを理解しようとする人々にとって一般的なハードルです。継承ではなく、時間のシーケンスについて考えます。(ほぼ)gitのすべてが以前のものに関連していることを明確にすると、他のすべての部分が適切に配置されます。
Slipp D. Thompson、2015

6
矢印の方向については、ドキュメントから:* @param {Boolean} [options.reverseArrow = false]-trueの場合、矢印が祖先を指すようにする
Scott

2
ちなみに、この投稿を見てgitgraph.jsで遊んだ後、基本的にUIをgitgraph.jsに配置する小さなツールを作成することにしました。まだ完成していませんし、UIもまだ望んでいませんが、コントリビューションは大歓迎です!ご覧
bsara

123

上に構築は、TikZ&PGFgitdagsあなたは楽にベクトルグラフィックスは、グラフをコミットし、より生産することを可能にする小さなLaTeXのパッケージです。

既存のリポジトリのコミットグラフの自動生成はの目的ではありませんgitdags。それが生成するグラフは、教育目的のためだけのものです。

ASCIIコミットグラフの代わりに、Gitの質問への回答のグラフを作成するためによく使用します。

以下は、単純なリベースの効果を示すそのようなグラフの例です。

ここに画像の説明を入力してください

\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}

1
@それは素晴らしいですね!また、その使用方法についても数行説明します。LaTeXがまったくインストールされていないWindowsユーザーについて考えてみます。最初からグラフを作成する方法は?
VonC 2014

1
@VonCわかりませんが、LaTeXをインストールしたくない場合は、ShareLatexWriteLaTeXなどでグラフを作成できる可能性があります。私はそれを調べて、時間があればwikiを拡張します...パッケージを宣伝してください:)
jub0bs

これは素晴らしいことです!チュートリアルはいつか書こうと思いますが、とりあえず、documentclassスタンドアロンを使用してグラフを後処理し(私はトリミング機能を使用)、を使用latex input.texしてdviを生成し、最後にdvisvgm input.dvi透過性のあるSVGを生成します。SVGからPNGのようなラスター形式への変換は、で十分簡単convert -antialias -density 300 -background none input.svg output.pngです。ちなみに、これらの画像は完全に透明で驚くほどに見えます。引き続き
vmrob

5
私はどのようにするためのステップバイステップガイドに書いたように、それは、この作業を取得するために私にしばらく時間がかかったのUbuntu 14.04上のゼロから取り組んgitdags取得
ChrisFreeman

1
@AndreaPolci参照github.com/Jubobs/gitdags/issues/3マージの例。のドキュメントが作成中ですgitdags
jub0bs 2015

79

GitgはGitkとGitX for GNOME(KDEなどでも動作します)のクローンで、かなり色付きのグラフを表示します。

積極的に開発されている(2012年現在)。コミット(グラフノード)を時系列またはトポロジーのいずれかで並べ替え、選択したブランチにつながらないコミットを非表示にすることができます。

大きなリポジトリと複雑な依存関係グラフで正常に動作します。

linux-gitおよびlinux-2.6リポジトリを示すサンプルのスクリーンショット:

linux-git

linux-2.6


60

SourceTreeは本当に良いものです。見栄えの良い中型の履歴とブランチグラフを出力します(以下は、いくつかのブランチを表示するためだけに、実験的なGitプロジェクトで実行されています)。Windows 7以降およびMac OS X 10.6以降をサポートします。

ここに画像の説明を入力してください

http://www.sourcetreeapp.com/


App Storeでも入手できるため、アップデートは自動的に機能します。
WebOrCode

私はsourcetreeのグラフが大好きですが、コマンドラインを使用したいのですが、sourcetreeのデフォルトは常に私のリポジトリを混乱させます。
SgtPooki

SourceTreeは、Atlassianアカウントを作成する(またはGoogleアカウントを使用して、電子メールとプロファイル情報を取得するためのいくつかの権限をAtlassianに付与する)と主張し、Mac(OS X El Capitan v 10.11.5)にインストールした後、「クローン」ステップで失敗します。 「致命的:パス '<path skipped>'の.gitmodulesにサブモジュールマッピングが見つかりませんでした」と奇妙な警告:「テンプレートが見つかりません/ usr / local / git / share / git-core / templates」。あまりあいまいなメッセージで、それほど素晴らしいものではありません。
Dmitry Shevkoplyas

3
アンインストール後、前に付与したGoogleのセキュリティ権限を整理してください:myaccount.google.com/security- >接続されているアプリとサイト->アカウントに接続されているアプリ->アプリの管理
Dmitry Shevkoplyas

60

HTML / Canvasを使用してかなりのgit commitsグラフを生成できるツールを1つ書いたところです。

そして、使いやすいjQueryプラグインを提供します。

[github] https://github.com/tclh123/commits-graph

プレビュー:

下見


見栄えがいい、このグラフを描画するためにどのようにフォーマット済みのデータを取得するのですか
Olga

3
@Olgaリポジトリにバックエンドコードを追加するだけです。githubで見ることができます。
ハリーリー

56

git-forest1年以上使用してきた優れた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"

これは、ターミナルでの出力の様子です。

ここに画像の説明を入力してください


3
@ void.pointer-はい。git-forestはperlスクリプトであり、perlモジュールの依存関係があるため、そうなりません。必要なperlモジュールがインストールされたcygwinの下でgitを実行することは、Windowsでこれを本当に必要とする場合に得ることができる最良の代替策かもしれません:)
Tuxdude

1
うわー、そのレポには素晴らしいツールがたくさんあります。ありがとう!
Eldelshell、2015

1
Win $の下では@MinGW(MSYS)で完全に正常に動作します。CPANMをインストールします。次にGit.pm; エイリアスを作成すれば準備完了です。
Sektor 2016

あなたが使っているとても良いターミナルエミュレータは何ですか?グラフィカルプロンプトインジケーターが好きです。
NH。

この「スクリプト」のインストール方法は?私はubuntuにいます。
user13107

50

gitログをきれいなSVGグラフに変換するためのWebツールを作成しました: Bit-Booster-オフラインコミットグラフ描画ツール

git log --pretty='%h|%p|%d'ツールから出力を直接アップロードし、「download graph.svg」リンクをクリックします。

ツールは純粋なクライアント側であるため、Gitデータはサーバーと共有されません。HTML + JSをローカルに保存し、「file:///」URLを使用して実行することもできます。Ubuntu 12.04のChrome 48およびFirefox 43で検証済み。

任意のページ(ブログスポットのブログエンジンを含む!)に直接投稿できるHTMLを生成します。こちらのブログ投稿の一部をご覧ください。

http://bit-booster.blogspot.ca/

ツールによって生成されたサンプルHTMLファイルのスクリーンショットは次のとおりです。

http://bit-booster.com/graph.html(ツール)


1
@Jayそれは、色がその特定の枝のインデントレベルを反映しているように見え、その枝は別の列に移動して色が変わる場合があります。s
ThorbjørnRavn Andersen

44

関連する質問への回答で見つけたGraphvizスクリプトに基づいて、gitリポジトリの概要ビューを作成するRubyスクリプトをハッキングしまし。すべての線形履歴を省略し、「興味深い」コミット、つまり、複数の親、複数の子、またはブランチやタグが指すコミットを表示します。jqueryに対して生成されるグラフのスニペットは次のとおりです。

jqueryサンプル

git-big-pictureBranchMasterは、タグ、ブランチ、マージなどの関係のみを表示することで、グラフの高レベルの構造のみを表示しようとする同様のツールです。

この質問にはいくつかのオプションがあります。


2
私はこれを試しましたが、ドットがリポジトリの出力(42ブランチ、175タグ、42.000コミット)で正しく機能しませんでした...残念です...それがまさに私が探していたものです!
Xavier Nodet

1
@XavierNodet、リポジトリが公開されている場合やエラーメッセージなどが表示される場合は、GitHubに問題を報告してください。ありがとう!
Matt McHenry、

38

私は3つのカスタムコマンドを追加しました:git treegit streegit 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 vtreeIまし利用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);"'

git_stree


[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_vtree


編集:これはgitバージョン1.9aで動作します。色の値 'auto'は、このリリースで明らかにデビューしました。ブランチ名が異なる色になるので、これは素晴らしい追加です。これにより、たとえばローカルブランチとリモートブランチを簡単に区別できるようになります。


fatal: bad color value 'auto' for variable '--pretty format':(
2014

gitの古いバージョンであることが判明しました。Yumのリポジトリには、かなり古いバージョンのGitが含まれています。ソース(1.9)からコンパイルされており、うまく動作します。綺麗ですね!@gospesありがとうございます!
2014

OS Xは使用できません:sed: illegal option -- r
Slipp D. Thompson '27

@ SlippD.Thompson:私はLinuxを使用しています:)。-rは拡張正規表現用です。どうやらOSXバージョンのsedにはそれがありません。おそらく、sedを更新できます。それ以外の場合は、拡張正規表現なしでsedコマンドを書き換えることができます。
ゴスペ14

1
Mac OS X sedの場合、-rの代わりに-Eを使用します
Baxter Lopez

37

彼らがどのように見えるかに依存します。私はこのような写真を作るgitxを使用しています:

簡単なプロット

git log --graph24ウェイのタコのマージでgitk と比較できます(最初はhttp://clojure-log.n01se.net/date/2008-12-24.htmlから):

24ウェイgitタコマージ。 元のURLは<code> http://lwn.net/images/ns/kernel/gitk-octopus.png </ code>でした


49
おかしい…「24ウェイタコマージ」と言うのを聞いたことがあると思います。
dty d'

4
好奇心から、GitX(または別のGUI gitツール)の描画ルーチンをスタンドアロンの実行可能ファイルに抽出しようとした人はいますか?私が間違っていなければ、CocoaをベクターPDFファイルに描画することは難しくなく、OPの高品質の印刷可能な画像のニーズを満たします。
Slipp D. Thompson 2012

彼らが彼らの事をやり直す前にそれはスキッチを介してS3にありました。それがまだあったらいいのに。:(
ダスティン

clojure-log.n01se.net/date/2008-12-24.htmlからリンクされているlwn.net/images/ns/kernel/gitk-octopus.pngの gitkバージョンに置き換えただけです。@Dustin:大丈夫だと思います。同じ画像ではありませんが、目的は同じです。私はあなたがそのコミットを見つけると....同等gitxのスクリーンショットを再取ることができると思いますので、スクリーンショットから、それは、Linuxカーネルの一部のようになります
naught101

34

より詳細なテキスト出力については、以下を試してください:

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

29

これはこの問題についての私の見解です:

スクリーンショット:

スクリーンショット

使用法:

git hist -現在のブランチの履歴を表示

git hist --all -すべてのブランチ(リモートを含む)のグラフを表示します

git hist master devel -2つ以上のブランチ間の関係を表示する

git hist --branches -すべてのローカル支店を表示

--topo-order日付ではなくトポロジーでコミットをソートに追加します(このエイリアスのデフォルト)

利点:

  • 普通のように見える--decorateので、異なるブランチ名のために別々の色で
  • コミッターのメールを追加します
  • コミットの相対日付と絶対日付を追加します
  • コミットを日付でソートします

セットアップ:

git config --global alias.hist "log --graph --date-order --date=short \
--pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"


28

時にはgitgを使用しますが、常にコマンドラインに戻ってください:

[alias]
    #quick look at all repo
    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 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 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 repos without subject body commits (vim repo, 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:リポジトリを最も理解しやすい
  • -飾る:誰が誰であるか
  • --oneline:多くの場合、コミットについて知っておく必要があるすべてのこと
  • --simplify-by-decoration:初見の基本(タグ、関連するマージ、ブランチのみ)
  • --all:このオプションの有無にかかわらず、すべてのエイリアスでキーストロークを保存します
  • --date = relative(%ar):リポジトリのアクティビティを理解します(ブランチはマスターの近くで数か月前にブランチからコミットされることがあります)

gitの最近のバージョン(1.8.5以降)で、装飾プレースホルダー%dで%C(auto)を利用できることを確認してください

ここから必要なのは、必要なものをすべてフィルタリングするためのgitrevisionsの十分な理解です(master..developのようなもので、-simplify-mergesは長期ブランチに役立ちます)。

コマンドラインの背後にあるパワーは、ニーズに基づいた迅速な設定です(リポジトリは一意のキーログ設定ではないため、-numstat、-raw、または--name-statusを追加する必要がある場合があります。ここでgitログエイリアスは高速で強力であり、(時間とともに)実現できる最も美しいグラフです。さらに、デフォルトでポケットベルを通じて出力が表示されるため(たとえば、少ない)、常に結果内をすばやく検索できます。確信が持てませんか?常に結果を解析できますgitgraphのようなプロジェクト


非常に素晴らしい。これらを私の設定に追加します。しかし、%Cred%d%Cresetを%C(auto)%d%Cresetに変更することをお勧めします。これにより、リモートまたはローカルのブランチ名に異なる色が付けられます
MarkB42

17

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

15

私はtig https://github.com/jonas/tigをお勧めします 。これはgitのはるかに優れたコマンドラインツールです。

homebrewを使用して、macOSにtigをインストールできます。

$ brew install tig
$ tig

ここに画像の説明を入力してください


14

グラフの履歴を表示するために、この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が、作者名(を尊重します.mailmap)と相対的な作者の日付が追加されています%C(auto)コミットハッシュなどにデフォルトの色を使用するようにGitに指示する構文は、Git> = 1.8.3でサポートされています。


1
git log --graph --oneline ワンライナーが迷子になっていないことを確認するためだけに
tsenapathy

左側にブランチ名を付ける方法はありますか?
アナバー

12

試しましたgitkgitk --all?ただし、関数としてimgを印刷/保存することはできません。


3
gitkは効率的ですが、あまり美しくありません。
ヨハン

それが内蔵されているという事実は私にとってそれを快適で面倒なしにします。特に--all、すべてのブランチを表示します。
BcK


11
git -c core.pager='less -SRF' log --oneline --graph --decorate

これは私の端末のバリエーションで、ここでの多くの回答と同様です。渡されたフラグを調整しlessて、単語の折り返しを防止します。

出力例

コマンドが少し面倒なので、クイックアクセスのためにこれをエイリアスに設定しました。


8

ditaaを試してください。ASCIIダイアグラムを画像に変換できます。はGitブランチを考慮して設計されていませんが、その結果には感銘を受けました。

ソース(txtファイル):

        +--------+
        | hotfix |
        +---+----+
            |
--*<---*<---*
       ^ 
       |
       \--*<---*
               |
           +---+----+
           | master |
           +--------+

コマンド:

java -jar ditaa0_9.jar ascii-graph.txt

結果:

ここに画像の説明を入力してください

また、背景色、破線、さまざまな形状などもサポートしています。例を参照してください。


1
同様に、casual-effects.com / markdeepは、手作業で配置したアスキーアート図を作成するのに非常に強力です。
Beni Cherniavsky-Paskin

7

リポジトリがGitlabにある場合は、ブラウザでSVGとしてレンダリングされるので、そのグラフ表現を使用できます。

  • リポジトリのグラフビューに移動します。例:https : //gitlab.com/gitlab-org/gitter/webapp/network/develop

  • グラフを一番下までスクロールします(遅延読み込みコミットです!)

  • ブラウザのインス​​ペクタを使用して、SVG要素を新しいファイルにコピーします

  • お好みのレンダラー(Inkscapeなど)で開きます。

ここに画像の説明を入力してください


6

直接的なツールについては知りませんが、スクリプトをハックしてデータをドット形式にエクスポートし、graphvizでレンダリングできます。


これをgithub.com/gugod/bin/blob/master/git-graphvizで試してください。私の企業環境では依存関係がすべてなかったため、これらのioコマンドを単純なperl `git log [...]`コマンドに変更するとうまくいきました。
ロスロジャース

あなたがMac上でだとあなたがこのスクリプトを試してみたい場合は、とPerlをつかむことができbrew install perl dot、その後、cpan common::sense IO::all依存関係を取得します。次に、出力をのような適切なコマンドにパイプしますgit-graphviz | dot -Tpng -o repo.png。ただし、出力はgit-big-pictureとそれほど変わりません。
jrhorn424 2013年

6

Raphael Webグラフィックライブラリのデモの1つとして、ファンキーなGitコミットグラフがあります。

デモは静的ですが、コードを取得してそれらの静的データをライブデータセットに交換するのは簡単です。JSON形式のGitコミットデータにすぎないと思います。

デモはこちら:http : //dmitrybaranovskiy.github.io/raphael/github/impact.html


1
これは、GitHubのインパクトグラフで使用されているものと同じグラフコードです。(例:github.com/DmitryBaranovskiy/raphael/graphs/impact
Slipp D. Thompson

@Sven:指摘していただきありがとうございます。壊れたリンクを修正しましたが、この回答は5年前のものであるため、より適切な解決策が最近ある可能性があることに注意してください。
Spudley、2016年


6

シェル用の見栄えがよくきれいなテーブルのようなgitグラフ出力

通常のグラフツリーのほかにハッシュを使用

通常のグラフツリーのほかにハッシュを使用

または追加の列

または追加の列

編集:説明を読まずにすぐに始めたいですか?以下の編集5の gitエイリアス、スクリプト、または関数コードスニペットを使用します。

この質問へのすべての回答において、これまでのところ、シェルのきれいなテーブルのような出力はありませんでした。最も近いのは、私が始めたゴスペスからのこの答えでした。

私のアプローチの核心は、ユーザーに表示される木の文字だけを数えることです。次に、空白でそれらを個人的な長さに埋めます。

git以外にこれらのツールが必要です

  • グレップ
  • ペースト
  • printf
  • sed
  • シーケンス
  • tr
  • トイレ

ほとんどのLinuxディストリビューションに搭載されています。

コードスニペットは

while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$((9-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(214)%>(15,trunc)%d%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

必要な空白を計算するには、

  sed -nl500 'l' <<< "$graph"

ツリーの文字のみを選択するよりも、すべての文字(1行あたり500まで)を取得するには:/ \ _と空白

  grep -Eo '\\\\|\||\/|\ |\*|_'

最後にそれらをカウントし、選択した長さの値(例では9)から結果を引きます。

使用する空白の計算された量を生成するには

  seq -s' ' $whitespaces

と位置番号を切り捨てます

  tr -d '[:digit:]'

それらをグラフの行の最後に追加します。それでおしまい!

Gitには、すでに構文で出力指定子の長さフォーマットする素晴らしいオプションがあります'%><(amount_of_characters,truncate_option)'。これにより、左側の「>」または右側の「<」から空白が追加され、先頭の「ltrunc」、中央の「mtrunc」または末尾から文字が切り捨てられます「切り捨て」。

上記のprintf cmdは、対応するgit列に同じ長さの値を使用することが重要です。

あなたのニーズに合わせて、あなた自身のきれいなテーブルのように見える出力をスタイルするのを楽しんでください。

追加:

適切な長さの値を取得するには、次のスニペットを使用できます

while read -r graph;do
    chars=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
    [[ $chars -gt ${max_chars:-0} ]] && max_chars=$chars
done < <(git log --all --graph --pretty=format:' ')

上記の正しい長さの値として$ max_charsを使用します。


編集1:下線文字がgitツリーでも使用されていることに気づき、それに応じて上記のコードスニペットを編集します。他の文字が欠けている場合は、コメントを残してください。


編集2:ブランチとタグエントリの周りのブラケットを削除する場合は、編集3のように、gitコマンドで「%d」の代わりに「%D」を使用します。


編集3:おそらく「自動」カラーオプションは、ブランチとタグのエントリに最も好むものですか?

gitブラケットなしの自動カラーヘッドとタグ付きのテーブルのようなシェル出力

gitコマンドのこの部分を変更します(色214

%C(214)%>(15,trunc)%D%C(reset)

自動

%C(auto)%>(15,trunc)%D%C(reset)


編集4:または、その部分の独自のカラーミックス、点滅する頭を持つ派手な出力が好きですか?

gitツリーの派手なスタイルのテーブルのような出力

ヘッド、ブランチ名、タグをスタイルできるようにするには、最初にEDIT 3のようにgitコマンドに「auto」カラーオプションが必要です。

次に、これらの3行を追加して、既知のカラー値を独自のカラー値に置き換えることができます

 # branch name styling
 branch=${branch//1;32m/38;5;214m}
 # head styling
 branch=${branch//1;36m/3;5;1;38;5;196m}
 # tag styling
 branch=${branch//1;33m/1;38;5;222m}

行の直前

 branch_all="$branch_all$(printf '%15s' "$branch")\n"

私たちのコードスニペットで。置換値は上記の色を生成します。

たとえば、headの置換値は

3;5;1;38;5;196

ここで3; イタリック、5を表します。点滅用、1; 38; 5; 196色用。詳細はこちらから。注:この動作はお使いの端末によって異なるため、使用できない場合があります。

しかし、あなたは好きな色の値を選ぶことができます。

gitの色の値と同等のANSIの概要

ここに画像の説明を入力してください

ここにgit color / styleオプションのリストがあります

正確な色のためにコンソールの出力が必要な場合(上の画像はstackoverflowによって縮小されます)、次のように出力を生成できます。

for ((i=0;i<=255;i++));do
  while IFS='+' read -r tree hash;do 
    echo -e "$(printf '%-10s' "(bold $i)") $hash  $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
  done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done

gitログ出力からの最初のコミットを使用するgitプロジェクトパス内。


編集5:メンバー「Andras Deak」が述べたように、このコードの使用方法はいくつかあります。

1)エイリアスとして

エイリアスはパラメータを受け入れませんが、関数は受け入れることができるため、.bashrcで定義するだけです

   function git_tably () {
     unset branch_all graph_all hash_all message_all time_all max_chars

     ### add here the same code as under "2) as a shell-script" ###

   }

そして、関数git_tably(tablelikeから派生)をgitプロジェクトパスの直下に、または最初のパラメーターとしてgitプロジェクトパスを使用して、どこからでも呼び出します。

2)シェルスクリプトとして

最初のパラメーターとしてgitプロジェクトディレクトリを渡すオプションと一緒に使用するか、空の場合は通常の動作と同じように作業ディレクトリを使用します。全部で

# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"

# determine the max character length of your git tree
while IFS=+ read -r graph;do
  chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
  [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')

# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch=${branch//1;32m/${branch_style:-1;32}m}
  branch=${branch//1;36m/${head_style:-1;36}m}
  branch=${branch//1;33m/${tag_style:-1;33}m}
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"

done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

3)gitエイリアスとして

おそらく最も快適な方法は、.gitconfigにgitエイリアスを追加することです

[color "decorate"]
    HEAD = bold blink italic 196
    branch = 214
    tag = bold 222

[alias]
    count-log = log --all --graph --pretty=format:' '
    tably-log = log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)'
    tably     = !bash -c '"                                                                                                    \
                  while IFS=+ read -r graph;do                                                                                 \
                    chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
                    [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count;                                          \
                  done < <(git count-log && echo);                                                                             \
                  while IFS=+ read -r graph hash time branch message;do                                                        \
                    chars=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \
                    whitespaces=$(($max_chars-$chars));                                                                        \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                               \
                    graph_all=\"$graph_all$graph$whitespaces\n\";                                                              \
                    hash_all=\"$hash_all$(printf \"%7s\" \"$hash\")  \n\";                                                     \
                    time_all=\"$time_all$(printf \"%12s\" \"$time\") \n\";                                                     \
                    branch_all=\"$branch_all$(printf \"%15s\" \"$branch\")\n\";                                                \
                    message_all=\"$message_all$message\n\";                                                                    \
                  done < <(git tably-log && echo);                                                                             \
                  paste -d\" \" <(echo -e \"$time_all\") <(echo -e \"$branch_all\") <(echo -e \"$graph_all\")                  \
                                <(echo -e \"$hash_all\") <(echo -e \"$message_all\");                                          \
                '"

git tablyプロジェクトパスの下で呼び出すだけではありません。

Gitは非常に強力なので、上に示し、ここから取得したように、ヘッド、タグなどを直接変更できます

別の手の込んだオプションは、あなたが最も好きな木の色を選択することです

[log]
    graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan

それはあなたに奇妙に見えるが常にテーブルのようなgitログ出力を与える

fanciest_git_tree_tablelike_image

点滅が多すぎます!何が可能かを示すだけです。指定された色が少なすぎると、色が繰り返されます。

完全な.gitconfigリファレンスは、クリックするだけです。

再び:自分のクリーンなテーブルのような外観の出力をニーズに合わせてスタイル設定してください。


これらのbashスニペットが豪華なgit logのようなコマンドになる方法を回答で説明する必要があります。リンクした回答を見ると用途はわかりますが、回答は自己完結型でなければなりません
Andras Deak

あなたはgit log cmdを詳細に説明するべきですか?または、あなたが欠けているものの例を教えてください。
onemorequestion

注:このスニペットは、素晴らしいgit logコマンドの出力を使用して、端末でテーブル形式の出力を受信します。だから、あなたが言及したように逆の方法;)
onemorequestion

私はあなたがこれを必要とするたびに20行のbashをタイプしていないと思った。これをbash関数またはgitエイリアスとして定義することは理にかなっています。ほとんどの読者は、簡単に使用できるようにコードを完成させようとすることはありません。そういう意味です。パス上のランダムなshファイルにコードを置くだけであれば、無視してかまいません。
Andras Deak

1
そうですか。アドバイスありがとうございます。回答を編集してエイリアスを追加します。通常、私はあなたが言ったような「長い」コマンドにファイルを使用します。しかし、ここで両方の方法を書いたほうがはるかに快適です。
onemorequestion

5

〜/ .oh-my-zsh / plugins / git / git.plugin.zshのエイリアス

gke='\gitk --all $(git log -g --pretty=%h)'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit --all'

4

OSXユーザーの場合、@ gospesの例を使用して、gsed(gnu-sedhomebrewを介してインストール)用に少し変更し、色を調整しました(黒い背景で動作するように、元の例がどのようにレンダリングされるかはわかりません)黒い背景の端末で黒いテキストを指定しているため)。

[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

OSXの鍵は、最初にgnu sed(-rオプションがある)をインストールすることです。システムでインストールされたsedを上書きせず、代わりに「gsed」としてgnu sedをインストールするhomebrewで最も簡単に実行できます。これがOSXが機能しないことについて上記コメントした @ SlippD.Thompsonに役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.