Gitでブランチトポロジを視覚化する


883

私は自分のマシンでGitを分離して遊んでおり、すべてのブランチとコミットのメンタルモデルを維持するのが難しいと感じています。私がどこgit logからコミット履歴を見ることができるか知っていますが、ブランチの説明にどこでも使用されているように見えるこれらのASCIIマップのようなブランチのトポロジ全体を見る方法はありますか?

      .-A---M---N---O---P
     /     /   /   /   /
    I     B   C   D   E
     \   /   /   /   /
      `-------------'

誰かがやって来て私のリポジトリを拾おうとすると、何が起こっているのか正確に理解するのが難しいように感じるだけです。

AccuRevのストリームブラウザの影響を受けていると思います...



1
@ leif81、半二重、私にとって。@Masiは彼の質問でgitkを明示的に除外しました。
ベンジョー

回答:


1082

git log --graphまたはを使用しgitkます。(どちらも受け入れ--all、現在のブランチだけでなくすべてのブランチを表示します。)

ブランチ名とコンパクトビューについては、次を試してください。

git log --graph --decorate --oneline

47
これはブランチでコミットにラベルを付けさえしません。私はこれを現状のままでは良い視覚化とは言いません。
Roman Starkov、2012

7
ありがとう!gitgには--allオプションもあり、コミットにラベルを付けます。また、ドロップダウンで、そこにあるすべてのブランチを選択できることも知りませんでした。
トーマス

210
私はお勧めしますgit log --graph --decorate --oneline-行ごとに1つのコミットを示し、ブランチ名で装飾します。
sleske 2013年

8
TIG(ncurseのgitクライアント)も提供して--allオプションを選択します。かなり便利!
Pierre-Adrien Buisson 2014

5
オプションについては、Andrewによる回答も参照してください--simplify-by-decoration
ruvim

483

私は通常使用します

git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

色付き(シェルがBashの場合):

git log --graph --full-history --all --color \
        --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"

これは、次のようなテキストベースの表現を印刷します。

* 040cc7c       (HEAD, master) Manual is NOT built by default
* a29ceb7       Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines.
| * 901c7dd     (cvc3) cvc3 now configured before building
| * d9e8b5e     More sane Yices SMT solver caller
| | * 5b98a10   (nullvars) All uninitialized variables get zero inits
| |/
| * 1cad874     CFLAGS for cvc3 to work successfully
| *   1579581   Merge branch 'llvm-inv' into cvc3
| |\
| | * a9a246b   nostaticalias option
| | * 73b91cc   Comment about aliases.
| | * 001b20a   Prints number of iteration and node.
| |/
|/|
| * 39d2638     Included header files to cvc3 sources
| * 266023b     Added cvc3 to blast infrastructure.
| * ac9eb10     Initial sources of cvc3-1.5
|/
* d642f88       Option -aliasstat, by default stats are suppressed

(あなたは単にを使用することもできますがgit log --format=oneline、コミットメッセージを数字に結び付けます。

このコマンドのショートカットを作成するには、~/.gitconfigファイルを編集します。

[alias]
  gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"

ただし、コメント内のVociferousの注記であるSodelのように、このような長い書式設定コマンドは覚えにくいです。通常、~/.gitconfigファイルに入れても問題ありません。ただし、設定ファイルを変更できないリモートマシンにログインする必要がある場合は、バージョンを入力するのがより簡単ですが高速です。

git log --graph --oneline

10
日付が好きな場合:git log --graph --full-history --all --color --date = short --pretty = format: "%x1b [31m%h%x09%x1b [32m%d%x1b [ 0m%x20%ad%s」
sehugg 2010

7
--onelineは、かなり魅力的なフォーマットのディープマジックのすべての記憶に残る代用です。
Daniel Ralston、2011

1
@SodeltheVociferous、確かに、私はあなたが話している側から問題に取り組みませんでした。答えを広げました。
Pは

2
注:ファイルパス--full-historyを使用--simplify-by-decorationまたは指定する場合にのみ関連します。
Slipp D. Thompson

2
どこからフォーマット文字列を取得したのか尋ねてもいいですか?または、一体どうやってそのことを調合したのですか?
elliotwesoff 2016年

444

私は通常3つのエイリアス(および簡単に使用できる4つのエイリアスエイリアスを持ってい~/.gitconfigます。

[alias]
    lg = lg1
    lg1 = lg1-specific --all
    lg2 = lg2-specific --all
    lg3 = lg3-specific --all

    lg1-specific = 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(auto)%d%C(reset)'
    lg2-specific = 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(auto)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
    lg3-specific = 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 cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n''          %C(white)%s%C(reset)%n''          %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)'

git lg/ git lg1は次のようになります:

git lg1

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

git lg2

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

git lg3

これは万能のソリューションではなく、好みに合わせて変更、追加、修正するためのテンプレートであることに注意してください。これらを使用する場合、私の推奨は次のとおりです。

  1. それらをに追加し.gitconfig
  2. 好みに合わせてカスタマイズ(異なる色の選択、2行バージョンと3行バージョンの異なるライン配置など)、
  3. そして、コピーをGistまたは他のコードスニペットツールに保存.gitconfigして、将来的にsにコピー&ペーストできるようにします(あるいは、もちろん、ドットファイルのバージョン管理も可能です

注:回答は、stackoverflow.com / questions / 1057564 / pretty-git-branch-graphsからコピーされ、改良されています。ここでは、実際よりもはるかに適切だからです。歴史的な理由により、他の質問にコピーを残しました。現在は閉じられており、回答は他の多数の回答によって参照されています。


10
提案:と置き換え%C(bold yellow)て、ローカルブランチリモートブランチの%C(auto)色を変える(ref)。HEAD
Atcold 2016年

2
を使用して、フォーマット文字列にインデントを手動で追加することを回避できることに注意してください%w()。これにより、グラフをめちゃくちゃにすることなく、長いメッセージや複数行のコミットメッセージを適切に行折り返しすることもできます。
charliegreen 2017年

1
@ mbadawi23これらは、プラットフォームとGitのインストール全体で一貫性を保つために冗長です。 --abbrev-commit2行目と3行目がスペースで手でインデントされているので、そこにあります。短いSHAを使用することを絶対に確認したかったので、申し訳ありませんが安全です。 --decorateGitのデフォルトでも同じことを行いますが、Gitのバージョンによって設定が異なる場合や異なる場合があるためです。これらについては、絶対に装飾が必要です。最終的に、追加/冗長フラグはここでは悪くありません。これはファイルに入れられます。いつもタイプするものではありません。
Slipp D. Thompson 2017

1
@TimothyPulliam各ブランチ/タグの先端を表す各行の終わりに、関連付けられたブランチ/タグの名前が括弧内に表示されます。たとえば、lg1&のlg2スクリーンショット(origin/test_on_10.8)では、リモートブランチの表示を確認lg2でき、スクリーンショットではブランチの(HEAD -> master, origin/master, origin/HEAD)ローカル位置とリモート位置の両方との表示を参照してください。これは、Gitのブランチを視覚化する人気のあるGUIツール(gitk、SourceTree、TortoiseGit、Tower、Fork、GitX)と一致しますが、少し冗長です(一部のGUIツールは色分けを使用します)masterHEAD
Slipp D. Thompson

2
@TimothyPulliamコミットが「各ブランチの一部」であることを理解するには、色付きの線を視覚的にトレースする必要があります。Gitのコミットは本質的にどのブランチにも属していないため、ほぼすべてのツールはこれで多くのことを支援するわけではありません。それらは、親の祖先にあるブランチまたはタグに属していることを暗黙に示しています(グラフの視覚化時に)。 。コミットを参照するブランチ/タグがなく、消えた場合(ただし、約2週間ガベージコレクションされません)。以前に参照されていないコミットを参照するブランチ/タグを追加すると、再び表示されます。これがすべて理にかなっているといいのですが。
Slipp D. Thompson

236

これらのレシピのいずれかに(git logまたはgitkに基づいて)、--simplify-by-decoration履歴の興味のない線形部分を折りたたむように追加できます。これにより、トポロジの多くが一度に表示されます。このオプションがなければ理解できない大きな履歴を理解できるようになりました。

よく知られているようには見えないので、投稿する必要性を感じました。履歴の視覚化に関するほとんどのStack Overflowの質問には表示されません。また、必要なことを知っていた後でも、検索にかなりの時間を要しました。私はついにこのDebianバグレポートでそれを見つけました。Stack Overflowに関する最初の言及は、Antoine Pelisseによるこの回答のようです。


3
完璧-まさに私が探していたもの!賛成票が増えるはずです。ほとんどの人はgitk / gitg / git log --graphについてすでに知っていますが、ブランチトポロジを視覚化したい場合やシングルコミットを気にしない場合は、あまり役に立ちません。
imolit 2014年

4
これはまさに私が必要としていたものです。すべての答えのうち、それが私を助けた唯一のものです。--simplify-by-decoration何が起こっているのかを明確にします。
Ela782 2015

9
これが本当に答えになるはずです。git log --graph --all --simplify-by-decoration同様に動作します。
Irfy、2016年

--simplify-by-decoration階層化された各コミットの前後にn個のコミットを追加するときに使用できる場合(-Bおよび-Aforなどgrep)。
junvar

私はこのソリューションを頻繁に使用しているため、「git tree」としてエイリアスを設定しています。
user16973

76

Gitk 時々私は読むのが辛い。

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

GitVersionTreeを書く気にさせてください

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


3
@exhuma私は作者と共にMonoをサポートするためのPRを持っています(Mono 2.10に対してUbuntu 13.10でテスト済み)
Max Ehrlich

1
GitVersionTreeは時間とともにブランチを同じ場所に保持するため、状況の変化を簡単に確認できることがわかりました。
16:38にsfranky

48

私の時間の99.999%は履歴を見てgit lgおり、0.001%はgit logです。

便利な2つのログエイリアスを共有したい(.gitconfigから構成):

[Alias]
     lg = log --graph --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
     hist = log --graph --full-history --all --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
  • git lg 現在のブランチ履歴が表示されます。
  • git hist ブランチ全体の履歴が表示されます。

44

Gitkraken-トポロジをわかりやすく表示するクロスプラットフォームGUIを見てください

トポロジー

これは、いくつかの高度な機能に関する簡単なビデオチュートリアルです。


6
このスレッドにはどのようにGitKrakenがありますが、古くて無料のSourceTreeはありませんか?(私は知っています、私は知っています、アトラシアンは常にすべてが正しくなるとは限りません。しかしSourceTreeは視覚化のためのかなり素晴らしいツールです。)
XML

43

私はgit log、次のことを行うのが好きです:

 git log --graph --oneline --branches

(リモートブランチも表示するために--allも使用)

最近のGitリリースで動作:1.6.3以降で導入(2009年5月7日))

  • --pretty=<style>コマンドのログファミリの「」オプションを「」と綴ることができるようになりました--format=<style>
    また、--format=%formatstringはの省略形です--pretty=tformat:%formatstring

  • --oneline」は「」の同義語です--pretty=oneline --abbrev-commit

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix
| | * 8183707 a first bug10 fix
| |/
| * e727105 a second evol for 2.0
| * 473d44e a main evol
|/
* b68c1f5 first evol, for making 1.0

ログ表示のスパン(コミット数)を制限することもできます。

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all -5
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix

(最後の5つのコミットのみを表示)


現在選択されているソリューションについて私が気に入らないのは:

 git log --graph

それはあまりにも多くの情報を表示しました(簡単な要約だけを見たいとき):

PS D:\git\tests\finalRepo> git log --graph
* commit 4919b681db93df82ead7ba6190eca6a49a9d82e7
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:42:20 2009 +0100
|
|     a second bug10 fix
|
* commit 3469e13f8d0fadeac5fcb6f388aca69497fd08a9
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:41:50 2009 +0100
|
|     a first bug10 fix
|

gitk 素晴らしいですが、シェルセッションを別のウィンドウに残すように強制しますが、最後のn個のコミットをすばやく表示するだけで十分なことがよくあります。


私もこの方法を選択しましたが、「git graph」と入力するのが「git log --graph --decorate --oneline」を実行するのと同じになるようにエイリアスを作成しました。
パイクは

@ConnerPike良いアイデア。私はエイリアス「lg」を自分で持っています:stackoverflow.com/a/3667139/6309を
VonC

35

GitgはLinux向けの優れたツールで、Gitx for OS Xに似ています。コマンドラインでリポジトリのツリー構造内のどこかから「gitg」を実行するだけです(gitxと同じ)。


3
つまり、gitgにはドロップダウンメニューがあり、視覚化するブランチを選択できます。このドロップダウンには、「すべて」オプションもあります。
Phluks

1
またはgitg --all、ドロップダウンメニューをいじりたくない場合は、で開始できます。
imolit 2014年

25

「git-big-picture」が非常に便利であることがわかりました:https : //github.com/esc/git-big-picture

これは、gitkや友人が作成するかなり直線的な「1次元」ビューの代わりに、ドット/グラフビズを使用してかなり2Dグラフを作成します。-iオプションを使用すると、ブランチポイントとマージコミットが表示されますが、その間のすべてが省略されます。


非常に使いやすく、多くのコミットがなくシンプルなソリューションが必要な場合は、試してみてください。
wiswit 2015

(-iを使用した場合)コミット数に応じて適切にスケーリングする必要があります。複雑なブランチとマージがある場合(ただし、どのツールがそうでない場合)は読めなくなる可能性があります
Frank Osterfeld

1
中規模のプロジェクトでは、これは大量の線で巨大な画像を生成します。それが行く深さを制限できますか?つまり、過去N日間からコミットします。
OndraŽižka18年

25

優れたWebベースのツールはungitです。node.jsとgitがサポートする任意のプラットフォームで動作します。そのようなことを読むよりも簡単だと思う人のためにそれがどのように機能するかのビデオがあります...

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


21

見ていBranchMasterを

私は、それらの間のすべてのコミットを1行に折りたたむことにより、複雑なブランチ構造を視覚化するためにそれを書きました。数字はコミットの数を示します。

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


1
これは私が探しているものです。これを行うための代替コマンド/ツールはありますか?
Aalex Gabi 2016

3
@AalexGabiこれをgitconfigに入れると同じことになりますが、コマンドラインではgbranch = log --graph --simplify-by-decoration --pretty = format: '%C(yellow)%h%C(white)% d%C(太字の黒)%ar%C(リセット)%n '--all
kracejic

ブランチを視覚化するためのデータをどのように取得していますか?
Snowfish、2018年

15

誰も言及していtigませんか?「BranchMaster」のように枝を折りたたむわけではありませんが...

高速で、ターミナルで実行されます。

素早い(+キーボード制御)ので素晴らしいUXを手に入れることができるので、lsgitリポジトリを含むディレクトリの場合は、私の " " とほとんど同じです。

https://jonas.github.io/tig/

/検索などの通常のショートカットがあります。

リビジョングラフ

(ps。これはこのスクリーンショットの背景にある端末です。最近は見た目が良くなっていますが、私のコンピュータはスクリーンショットの取得を拒否しています。申し訳ありません)

(pps。私はgitkrakenも使用しており、視覚化は本当に明確ですが、それよりもはるかに重いですtig


私は端末愛好家であり、Tig(Gitのテキストモードインターフェイス)はGitリポジトリと対話するための優れたツールです。グラフビューやGit履歴など、非常に便利です。Gitコマンドラインの追加ツールとして、ターミナル愛好家にお勧めします。
hermeslm

15

Tortoise Gitには、「リビジョングラフ」と呼ばれるツールがあります。Windowsを使用している場合は、リポジトリを右クリックするだけで簡単です-> Tortoise Git->リビジョングラフ。


1
亀のgitを長い間使用しているが、この機能を知らないという素晴らしい機能
kreamik

これはずっと簡単です。ありがとう。
Anoop


12

以下のエイリアスを使用しています。

[alias]
    lol = log --graph --decorate --pretty=oneline --abbrev-commit
    lola = log --graph --decorate --pretty=oneline --abbrev-commit --all

上記で見たエイリアスよりも配色の情報が多いです。また、非常に一般的であるように思われるため、他の環境に存在したり、説明せずに会話で言及したりできる可能性があります。

スクリーンショットと詳しい説明はこちら:http : //blog.kfish.org/2010/04/git-lola.html


12

Macユーザーの場合は、無料のオープンソースツールであるGitUpをチェックアウトします(しゃれはありません):http ://gitup.co/

グラフの表示方法が気に入っています。これまでに見た他のツールよりもはっきりしています。

プロジェクトはここにあります:https : //github.com/git-up/GitUp

GitUpスクリーンショット


これは、x軸にブランチが表示され、y軸に時間が表示される唯一のグラフです。とても直感的です。GitUpは本当に素晴らしいです!macOSはもうないので、私はWindowsに切り替えており、Gitupを非常に見逃してしまいます。
午後5

11

グラフの履歴を表示するために、この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
私が実際の著者の日付を見るのはこれが初めてで、とてもいいです!おかげで、それを私のgitconfigに追加します!
Simon C.

Windowsユーザーは一重引用符を二重引用符に置き換える必要があります
PierDipi

11

簡潔な方法を示すこのブログ投稿を見つけました:

git log --oneline --abbrev-commit --all --graph --decorate --color

私は通常、上記のコマンドのエイリアスを作成します。

alias gl='git log --oneline --abbrev-commit --all --graph --decorate --color'

シンプルに使うだけgl

git configにエイリアスを追加することもできます。~/.gitconfig次の行を開いて[エイリアス]に追加します

[alias]
        lg = log --oneline --abbrev-commit --all --graph --decorate --color

次のように使用します。 git lg


8

.gitconfigを介した私の個人的なお気に入りのエイリアスは次のとおりです。

graph = log --graph --color --all --pretty=format:"%C(yellow)%H%C(green)%d%C(reset)%n%x20%cd%n%x20%cn%x20(%ce)%n%x20%s%n"

6
コマンドがどのように見えるかを少し説明すればすばらしいでしょう。
最大

8

VSCodeテキストエディターを使用している場合は、D。JayamanneによるGit History Extensionを検討してください。

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


この拡張機能は、私の考えでは少し遅いです。また、自動更新は行われず、磨かれていないように見えます。しかし、これはコミットツリーを視覚化するのに
役立ち

2
Visual Studio Codeのもう1つの拡張機能は、mhutchieによるGit Graphです。これをGitLensと一緒に使用します。
Josef.B

7

Gitxは、たまたまOS Xを使用している場合でも、素晴らしい視覚化ツールです。


3
gitk(誰にとっても)は非常に似ています。まったく同じではありませんが、かなり似ています。
xero

Gitxのフォークがいくつかあります- これ1(rowanj)は現時点で最善のようです。
rjmunro 14

7

別のgit logコマンド。固定幅の列を持つこれ:

git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short


3

Windowsでは、非常に便利なツールとしてgit extensionsを使用できます。これはguiツールであり、git操作を非常に簡単にします。

また、オープンソースです。

http://gitextensions.github.io


2

試しました--simplify-by-decorationが、すべてのマージが表示されません。そのため、ヘッダーに "\"と "/"記号のない行を削除し、常に "("の行はその直後の分岐を示します。分岐履歴を表示するとき、私は一般的にコミットコメントに関心がないので、私もそれらを削除すると、次のシェルエイリアスになります。

gbh () { 
    git log --graph --oneline --decorate "$@" | grep '^[^0-9a-f]*[\\/][^0-9a-f]*\( [0-9a-f]\|$\)\|^[^0-9a-f]*[0-9a-f]*\ (' | sed -e 's/).*/)/'
}

2

もっと複雑にできますか?

単純なgit log --all --decorate --oneline --graphはどうですか(A Dog = --All --Decorate --Oneline --Graphを思い出してください)


1
これは受け入れられた答えと同じです。ただし、ニーモニックの小道具
aljgom

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