Đồ thị nhánh khá git


1385

Tôi đã thấy một số sách và bài viết có một số biểu đồ thực sự đẹp mắt của các chi nhánh và cam kết. Làm cách nào tôi có thể tạo hình ảnh có thể in chất lượng cao của lịch sử git?


4
Tôi đã tạo một kịch bản python để tạo một biểu đồ graphiz! Hãy xem. github.com/chode/git-graph
Stephan Bechter

4
Nếu bạn muốn chất lượng cao và có thể in được, công cụ của tôi ( bit-booster.com/graph.html ) chuyển đổi "git log" thành SVG. Để biết thêm thông tin, xem câu trả lời của tôi .
G. Sylvie Davies

2
Bạn đang tìm kiếm một công cụ để trực quan hóa lịch sử git của riêng bạn - hoặc - một công cụ biểu đồ có cách vẽ những "nhánh Git" đẹp?
Uri Abramson

1
Bản sao có thể có của trực quan hóa cấu trúc liên kết chi nhánh trong git
trblnc

5
Tôi sẽ xóa thẻ theo hướng đồ thị theo hướng vì nó không liên quan đến câu hỏi này
Maksim Dmitriev

Câu trả lời:


1843

Cập nhật: Câu trả lời này đã nhận được nhiều sự chú ý hơn nó xứng đáng. Ban đầu nó được đăng bởi vì tôi nghĩ rằng các biểu đồ trông rất đẹp và chúng có thể được vẽ trong Illustrator cho một ấn phẩm thành công và không có giải pháp nào tốt hơn. Nhưng hiện tại đã tồn tại nhiều câu trả lời phù hợp hơn cho Q này, chẳng hạn như fracz ', Jubobs ' hay Harry Lee ! Hãy đi upvote những !!

Cập nhật 2: Tôi đã đăng một phiên bản cải tiến của câu trả lời này lên cấu trúc liên kết nhánh Trực quan hóa trong câu hỏi git , vì nó phù hợp hơn nhiều ở đó. Phiên bản đó bao gồm lg3, hiển thị cả thông tin về tác giả và thông tin, vì vậy bạn thực sự nên kiểm tra nó. Để lại câu trả lời này cho các lý do lịch sử (& rep, tôi sẽ thừa nhận), mặc dù tôi thực sự muốn xóa nó.

2 : Tôi có hai bí danh tôi thường ném vào ~/.gitconfigtệp của mình :

[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 lg1trông như thế này:
git lg1

git lg2trông như thế này:
git lg2


35
Yeah tôi làm. Màu bình thường và sáng / đậm là: Đen #202020/ #555555, Đỏ: #5d1a14/ #da4939, Xanh lục: #424e24/ #a5c261, Vàng: #6f5028/ #ffc66d, Xanh lam: #263e4e/ #6d9cbe, Đỏ tươi: #3e1f50/ #a256c7, Lục lam: #234e3f/ #62c1a1, và Trắng: #979797/ #ffffff.
Slipp D. Thompson

3
@Turbo: Đối với tôi, màu sắc có thể thay đổi trong cài đặt cấu hình cho ứng dụng đầu cuối của tôi (Terminal.app). Ứng dụng đầu cuối bạn đang sử dụng có thể hoặc không thể hỗ trợ thay đổi màu nào được hiển thị cho các màu ANSI cụ thể. Ngoài ra, dấu gạch ngang (em dash, chính xác) đã được tạo bằng tùy chọn-shift- [phím gạch nối-dấu trừ]. Tôi cho rằng tôi đã sai khi cho rằng tất cả các nền tảng hiện tại đều cập nhật với Unicode.
Slipp D. Thompson

3
Của bạn --date=relative--abbrev-commitlà dư thừa vì bạn sử dụng rõ ràng %cr%h, tương ứng.
Graywh

6
Tôi muốn thêm công cụ %C(auto)sửa đổi vào tên họ ( %d) để có màu sắc đẹp hơn. Xem stackoverflow.com/questions/5889878/color-in-git-log/
triệt

2
Câu trả lời chính xác. Tôi đã sửa đổi lệnh để trông giống như đầu ra của --oneline - phân phối vớilg = 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
Craig P. Motlin

1198

Nhiều câu trả lời ở đây là tuyệt vời, nhưng đối với những người chỉ muốn một dòng đơn giản cho câu trả lời điểm mà không phải thiết lập bí danh hoặc bất cứ điều gì thêm, đây là:

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

Không phải ai cũng sẽ làm git logtất cả thời gian, nhưng khi bạn cần nó chỉ cần nhớ:

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

nhập mô tả hình ảnh ở đây


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

4
Tôi đã tìm kiếm bấy --alllâu nay tôi sắp khóc (T_T) CẢM ƠN BẠN!
Felipe Gerard

2
--oneline được giới thiệu trong Git 1.6.3: github.com/git/git/blob/, --pretty = oneline sẽ hoạt động với các phiên bản Git trước 1.6.3
Pat Myron

13
câu trả lời hay nhất về SO. Cảm ơn vì đã giữ cho nó vui vẻ.
Tobias Feil

4
Tôi nghĩ rằng "- trang web" hiện được bao gồm theo mặc định. Nhưng dù sao tôi cũng sẽ nhớ từ viết tắt này!
Josiah Yoder

378

Đối với đầu ra văn bản, bạn có thể thử:

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

hoặc là:

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

hoặc: đây là bí danh graphviz để vẽ biểu đồ DAG.

Cá nhân tôi sử dụng gitx, gitk --allgitnub.


14
tôi sẽ thêm --abbrev-commit --decorate, và sau đó nó hoàn hảo!
bất đối xứng

6
--abbrev-commit được ngụ ý bởi --oneline, không?
dwineman

4
@dwineman có, bạn không cần --abbrev-commitnếu bạn sử dụng--oneline
Thomas

2
Có vẻ như trong dòng thứ hai của bạn git log --graph --oneline --decorate --date=relative --all, --dateđối số là vô ích. Tôi có thể thấy không có ngày hiển thị trong nhật ký.
Lerner Zhang

ngày không được hiển thị khi --oneline được chỉ định
martinkunev

253

Gitgraph.js cho phép vẽ các nhánh git đẹp mà không cần kho lưu trữ. Chỉ cần viết mã Javascript để cấu hình các nhánh của bạn và xác nhận và hiển thị nó trong trình duyệt.

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

biểu đồ mẫu được tạo bằng Gitgraph.js

hoặc với metromẫu:

Chủ đề tàu điện ngầm GitGraph.js

hoặc với các thông điệp cam kết, tác giả và thẻ:

GitGraph với thông điệp cam kết

Kiểm tra nó với JSFiddle .

Tạo nó với Git Gograph bởi @bsara.


3
Yay, điều đó hoàn toàn tuyệt vời! Đăng nó vào fiddle jsfiddle.net/guan1oz1 để bạn có thể kiểm tra nó ngay lập tức.
berkus

14
Các mũi tên phải chỉ vào cha mẹ, mặc dù, không phải cho trẻ em.
jub0bs 4/2/2015

4
@Jubobs: Điểm tốt. Đó là một trở ngại chung cho những người cố gắng hiểu Git: họ nghĩ về chuỗi thời gian thay vì thừa kế. Làm rõ rằng (gần) mọi thứ trong git đều liên quan đến thứ gì đó trước đó giúp tất cả các phần khác rơi vào vị trí.
Slipp D. Thompson

6
Về hướng mũi tên, từ các tài liệu: * @param {Boolean} [tùy chọn.reverseArrow = false] - Tạo mũi tên chỉ vào tổ tiên nếu đúng
Scott

2
FYI, sau khi xem bài đăng này và chơi với gitgraph.js, tôi quyết định tạo một công cụ nhỏ về cơ bản đặt UI cho gitgraph.js. Nó chưa kết thúc và giao diện người dùng không phải là nơi tôi muốn, nhưng đóng góp rất đáng hoan nghênh! hãy xem: github.com/bsara/git-gograph
bsara

123

Được xây dựng trên đỉnh TikZ & PGF , gitdagslà một gói LaTeX nhỏ cho phép bạn dễ dàng tạo ra các biểu đồ cam kết đồ họa vector , v.v.

Việc tạo tự động đồ thị cam kết của kho lưu trữ hiện tại không phải là mục đích của gitdags; các đồ thị nó tạo ra chỉ có ý nghĩa cho mục đích giáo dục .

Tôi thường sử dụng nó để tạo các biểu đồ cho câu trả lời của mình cho các câu hỏi Git, như là một thay thế cho biểu đồ cam kết ASCII:

Dưới đây là một ví dụ về biểu đồ như vậy chứng minh tác dụng của một rebase đơn giản:

nhập mô tả hình ảnh ở đây

\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
@Rằng sẽ rất tốt! Tôi cũng muốn có một vài dòng về cách sử dụng nó: hãy xem xét một người dùng Windows chưa cài đặt LaTeX. Làm thế nào để sản xuất một biểu đồ từ đầu?
VonC

1
@VonC Tôi không chắc, nhưng nếu bạn không muốn cài đặt LaTeX, bạn có thể tạo biểu đồ của mình trên ShareLatexWriteLaTeX và những thứ tương tự. Tôi sẽ xem xét và mở rộng wiki khi tôi có nhiều thời gian hơn ... Hãy thoải mái quảng bá gói:)
jub0bs

Đây là công cụ tuyệt vời! Tôi sẽ viết một hướng dẫn tại một số điểm, nhưng bây giờ, tôi chỉ muốn đề cập rằng bạn có thể xử lý hậu đồ thị của mình bằng cách sử dụng độc lập lớp tài liệu (tôi sử dụng tính năng cắt xén), sử dụng latex input.texđể tạo dvi, và cuối cùng sử dụng dvisvgm input.dviđể tạo ra một SVG với tính minh bạch. Chuyển đổi từ SVG sang định dạng raster như PNG là đủ dễ dàng với convert -antialias -density 300 -background none input.svg output.png. Nhân tiện, những hình ảnh này trông tuyệt vời với sự minh bạch đầy đủ. Vẫn đang xử lý vấn đề về phông chữ ... i.imgur.com/1Xu2Ry5.png
vmrob

5
Phải mất một thời gian để tôi làm việc này vì vậy tôi đã viết một hướng dẫn từng bước làm thế nào để các gitdags hoạt động từ đầu trên Ubuntu 14.04
ChrisFreeman

1
@AndreaPolci Xem github.com/Jubobs/gitdags/issues/3 để biết ví dụ về hợp nhất. Các tài liệu cho gitdagslà trên đường!
jub0bs

79

Gitg là một bản sao của Gitk và GitX cho Gnome (nó cũng hoạt động trên KDE, v.v.) hiển thị một biểu đồ có màu khá đẹp.

Nó được tích cực phát triển (tính đến năm 2012). Nó cho phép bạn sắp xếp các xác nhận (các nút biểu đồ) theo thứ tự thời gian hoặc theo cấu trúc liên kết và ẩn các xác nhận không dẫn đến một nhánh được chọn.

Nó hoạt động tốt với kho lớn và đồ thị phụ thuộc phức tạp.

Ảnh chụp màn hình mẫu, hiển thị kho lưu trữ linux-git và linux-2.6:

linux-git

linux-2.6


60

SourceTree là một trong những thực sự tốt. Nó in ra một biểu đồ chi nhánh và lịch sử kích thước trung bình và đẹp mắt: (sau đây được thực hiện trên một dự án Git thử nghiệm chỉ để xem một số chi nhánh). Hỗ trợ Windows 7+ và Mac OS X 10.6+.

nhập mô tả hình ảnh ở đây

http://www.sourcetrezon.com/


Nó cũng có sẵn trong App Store, vì vậy cập nhật sẽ hoạt động tự động.
WebOrCode

Tôi thích biểu đồ của sourcetree, nhưng tôi muốn sử dụng dòng lệnh và mặc định của sourcetree luôn gây rối với repos của tôi.
SgtPooki

SourceTree sẽ yêu cầu bạn tạo tài khoản Atlassian (hoặc sử dụng tài khoản google của bạn và cấp cho Atlassian một số quyền để nhận email và thông tin hồ sơ của bạn) và sau khi cài đặt trên Mac (OS X El Capitan v 10.11.5), nó không thành công trong bước 'Clonning': "gây tử vong: không tìm thấy ánh xạ mô hình con trong .gitmodules cho đường dẫn '<đường dẫn bị bỏ qua>'" và cũng là một cảnh báo lạ: "không tìm thấy mẫu / usr / local / git / share / git-core / samples". Tin nhắn rất tối nghĩa, không quá tuyệt vời.
Dmitry Shevkoplyas

3
Và sau khi gỡ cài đặt, đừng quên thu dọn các đặc quyền bảo mật Google mà bạn đã cấp trước đó: myaccount.google.com/securance -> Ứng dụng và trang web được kết nối -> Ứng dụng được kết nối với tài khoản của bạn -> Quản lý ứng dụng
Dmitry Shevkoplyas

60

Tôi vừa viết một công cụ có thể tạo biểu đồ cam kết đẹp bằng HTML / Canvas.

Và cung cấp một plugin jQuery giúp dễ sử dụng.

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

Xem trước:

xem trước


Trông thật tuyệt, làm thế nào để bạn có được dữ liệu được định dạng sẵn để vẽ biểu đồ này?
Olga

3
@Olga Tôi chỉ cần thêm mã phụ trợ vào repo của mình. Bạn có thể xem trên github.
Harry Lee

56

git-forestlà một tập lệnh perl tuyệt vời mà tôi đã sử dụng trong hơn một năm và tôi hầu như không sử dụng git loglệnh trực tiếp nữa.

Đây là một số điều tôi thích về kịch bản này:

  • Nó sử dụng các ký tự unicode để vẽ các đường trong biểu đồ mang lại cái nhìn liên tục hơn cho các đường biểu đồ.
  • Bạn có thể kết hợp --reversevới đầu ra đồ thị, điều này là không thể với git loglệnh thông thường .
  • Nó sử dụng git lognội bộ để lấy danh sách các cam kết, vì vậy tất cả các tùy chọn mà bạn chuyển đến git logcũng có thể được chuyển đến tập lệnh này.

Tôi có một bí danh sử dụng git-forestnhư sau:

[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"

Đây là cách đầu ra trông như thế nào trên một thiết bị đầu cuối:

nhập mô tả hình ảnh ở đây


3
@ void.pulum - Có, điều đó sẽ không xảy ra vì git-Forest là tập lệnh perl và có các phụ thuộc mô-đun perl. Chạy git theo cygwin với các mô-đun perl cần thiết được cài đặt có thể là giải pháp thay thế tốt nhất bạn có thể nhận được nếu bạn thực sự muốn điều này trên Windows :)
Tuxdude

1
Wow, repo đó có rất nhiều công cụ tuyệt vời. Cảm ơn!
Eldelshell

1
Hoạt động hoàn toàn tốt @MinGW (MSYS) trong Win $; cài đặt CPANM; rồi Git.pm; tạo một bí danh và bạn đã sẵn sàng để đi
Sektor

trình giả lập thiết bị đầu cuối rất đẹp mà bạn sử dụng là gì? Tôi thích những thứ chỉ báo đồ họa.
NH.

Làm thế nào để cài đặt "tập lệnh" này? Tôi đang dùng Ubuntu.
dùng13107

50

Tôi đã viết một công cụ web để chuyển đổi nhật ký git thành các biểu đồ SVG đẹp mắt: Bit-Booster - Công cụ vẽ biểu đồ cam kết ngoại tuyến

Tải đầu ra từ git log --pretty='%h|%p|%d'trực tiếp vào công cụ và sau đó nhấp vào liên kết "tải xuống graph.svg".

Công cụ này hoàn toàn ở phía máy khách và vì vậy không có dữ liệu Git nào của bạn được chia sẻ với máy chủ của tôi. Bạn cũng có thể lưu HTML + JS cục bộ và chạy nó bằng URL "file: ///". Đã xác minh trên Chrome 48 và Firefox 43 trên Ubuntu 12.04.

Nó tạo ra HTML có thể được đăng trực tiếp vào bất kỳ trang nào (bao gồm cả công cụ viết blog blogspot!). Hãy xem một số bài viết trên blog ở đây:

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

Dưới đây là ảnh chụp màn hình của tệp HTML mẫu được tạo bởi công cụ:

http://bit-booster.com/graph.html (công cụ)


1
@Jay nó xuất hiện màu phản ánh mức độ thụt của nhánh cụ thể đó và các nhánh đó có thể chuyển sang cột khác và do đó thay đổi màu sắc
Thorbjørn Ravn Andersen

44

Dựa trên tập lệnh Graphviz mà tôi tìm thấy trong câu trả lời cho một câu hỏi liên quan , tôi đã hack một tập lệnh ruby để tạo ra một cái nhìn tóm tắt về kho lưu trữ git. Nó phù hợp với tất cả lịch sử tuyến tính và chỉ hiển thị các cam kết "thú vị", tức là những người có nhiều cha mẹ, nhiều con hoặc được chỉ bởi một nhánh hoặc thẻ. Đây là một đoạn của biểu đồ mà nó tạo ra cho jquery :

mẫu jquery

git-big-hìnhBranchMaster là những công cụ tương tự cố gắng chỉ hiển thị cấu trúc cấp cao của biểu đồ, bằng cách chỉ hiển thị cách các thẻ, nhánh, sáp nhập, v.v.

Câu hỏi này có một số tùy chọn hơn.


2
Tôi đã thử điều này, nhưng không thể có dấu chấm để hoạt động chính xác với đầu ra cho repo của chúng tôi (42 chi nhánh, 175 thẻ, 42.000 cam kết) ... Thật tệ ... Đó chính xác là những gì tôi đang tìm kiếm!
Xavier Nodet

1
@XavierNodet, nếu repo của bạn ở chế độ công khai và / hoặc bạn có thông báo lỗi, v.v., vui lòng gửi một vấn đề trên GitHub. Cảm ơn!
Matt McHenry

38

Tôi đã thêm ba lệnh tùy chỉnh: git tree, git streegit vtree. Tôi sẽ đi qua chúng theo thứ tự đó.

[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)'

nhập mô tả hình ảnh ở đây

Với git streegit vtreetôi đã sử dụng bash để giúp định dạng.

[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


EDIT: Điều này hoạt động với phiên bản git 1.9a. Giá trị màu 'tự động' dường như xuất hiện lần đầu trong phiên bản này. Đây là một bổ sung tốt vì tên chi nhánh sẽ có màu khác. Điều này giúp dễ dàng phân biệt giữa các nhánh cục bộ và từ xa chẳng hạn.


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

Hóa ra là một phiên bản cũ của git. Yum có một phiên bản Git khá lỗi thời trong repo của nó. Được tổng hợp từ nguồn (1.9) và nó hoạt động rất tốt. Nó cũng đẹp đấy! Cảm ơn @gospes!
Xoay

Không đi trên OS X:sed: illegal option -- r
Slipp D. Thompson

@ SlippD.Thndry: Tôi đang sử dụng linux :). Các -r là cho các biểu thức chính quy mở rộng. Rõ ràng phiên bản OSX của sed không có nó. Có lẽ bạn có thể cập nhật sed. Nếu không, bạn chỉ có thể viết lại lệnh sed mà không cần regex mở rộng.
Tin mừng

1
Đối với máy Mac OS X sed, hãy sử dụng -E thay vì -r
Baxter Lopez

37

Phụ thuộc vào những gì họ trông giống như. Tôi sử dụng gitx để tạo ra hình ảnh như thế này:

cốt truyện đơn giản

Bạn có thể so sánh git log --graphvới gitk trên hợp nhất bạch tuộc 24 chiều (ban đầu từ http://clojure-log.n01se.net/date/2008-12-24.html ):

Bạch tuộc git 24 đường hợp nhất.  URL gốc là <code> http://lwn.net/images/ns/kernel/gitk-octopus.png </ code>


49
Thật buồn cười ... Tôi đã thề rằng tôi đã nghe bạn nói "hợp nhất bạch tuộc 24 chiều"!
dty

4
Vì tò mò, có ai đã cố gắng trích xuất các thói quen vẽ của GitX (hoặc một công cụ git GUI khác) thành một tệp thực thi độc lập chưa? Nếu tôi không nhầm, việc lấy Cacao để vẽ thành tệp PDF vector sẽ không khó và sẽ đáp ứng nhu cầu của OP đối với hình ảnh có thể in Q cao.
Slipp D. Thompson

Đó là trên S3 thông qua skitch trước khi họ làm lại điều của họ. Tôi ước tôi vẫn có nó. :(
Dustin

Chỉ cần thay thế nó bằng phiên bản gitk từ lwn.net/images/ns/kernel/gitk-octopus.png , được liên kết từ clojure-log.n01se.net/date/2008-12-24.html . @Dustin: hy vọng là ok. Nó không giống hình ảnh, nhưng nó phục vụ một mục đích tương tự. Từ ảnh chụp màn hình, có vẻ như đó là một phần của hạt nhân linux, vì vậy tôi đoán bạn có thể tìm thấy cam kết đó và chụp lại ảnh chụp màn hình gitx tương đương ....
naught101

34

Để biết thêm chi tiết về văn bản, vui lòng thử:

git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short

Bạn có thể viết bí danh bằng $ HOME / .gitconfig

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short

29

Đây là ý kiến ​​của tôi về vấn đề này:

Ảnh chụp màn hình:

Ảnh chụp màn hình

Sử dụng:

git hist - Hiển thị lịch sử của chi nhánh hiện tại

git hist --all - Hiển thị biểu đồ của tất cả các chi nhánh (bao gồm cả điều khiển từ xa)

git hist master devel - Hiển thị mối quan hệ giữa hai hoặc nhiều chi nhánh

git hist --branches - Hiển thị tất cả các chi nhánh địa phương

Thêm vào --topo-order để sắp xếp các cam kết theo cấu trúc liên kết, thay vì theo ngày (mặc định trong bí danh này)

Những lợi ích:

  • Trông giống như đơn giản --decorate , vì vậy với các màu riêng biệt cho các tên nhánh khác nhau
  • Thêm email người gửi
  • Thêm cam kết tương đối và ngày tuyệt đối
  • Sắp xếp cam kết theo ngày

Thiết lập:

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

Mặc dù đôi khi tôi sử dụng gitg , luôn quay lại dòng lệnh:

[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 

Như bạn có thể thấy gần như là một bí danh tiết kiệm tổ hợp phím, dựa trên:

  • --color: nhìn rõ ràng
  • --graph: hình dung cha mẹ
  • --date-order: cái nhìn dễ hiểu nhất về repo
  • --decISE: ai là ai
  • --oneline: Nhiều lần tất cả những gì bạn cần biết về một cam kết
  • --simplify-by-trang trí: cơ bản cho cái nhìn đầu tiên (chỉ cần thẻ, sáp nhập có liên quan, các chi nhánh)
  • --all: lưu tổ hợp phím với tất cả bí danh có và không có tùy chọn này
  • --date = tương đối (% ar): Hiểu hoạt động trong repo (đôi khi một nhánh có vài lần cam kết gần chủ nhưng cách đây vài tháng)

Xem trong phiên bản gần đây của git (1.8.5 trở lên), bạn có thể hưởng lợi từ% C (tự động) trong giữ chỗ trang trí% d

Từ đây, tất cả những gì bạn cần là hiểu rõ về gitrevutions để lọc bất cứ thứ gì bạn cần (một cái gì đó như master..develop, trong đó --simplify-sáp nhập có thể giúp với các nhánh dài hạn)

Sức mạnh đằng sau dòng lệnh là cấu hình nhanh dựa trên nhu cầu của bạn (hiểu rằng repo không phải là cấu hình nhật ký khóa duy nhất, do đó, việc thêm --numstat hoặc --raw hoặc --name-status đôi khi cần thiết. và bí danh là nhanh, mạnh mẽ và (theo thời gian) biểu đồ đẹp nhất bạn có thể đạt được. Thậm chí, với đầu ra được hiển thị theo mặc định thông qua một máy nhắn tin (nói ít hơn), bạn luôn có thể tìm kiếm nhanh trong kết quả. Bạn không thể thuyết phục kết quả với các dự án như gitgraph


Rất đẹp. Thêm chúng vào cấu hình của tôi. Nhưng tôi khuyên bạn nên thay đổi% Tín dụng% d% Creset thành% C (tự động)% d% Creset sẽ cung cấp các màu khác nhau cho tên chi nhánh từ xa hoặc địa phương
MarkB42

17

Rất ít điều chỉnh câu trả lời tuyệt vời của Slipp , bạn có thể sử dụng bí danh của mình để đăng nhập chỉ một nhánh:

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

Bằng cách rời khỏi --allbây giờ bạn có thể làm

git lgBranch1 <branch name>

hoặc thậm chí

git lgBranch1 --all

15

Tôi đề nghị tig https://github.com/jonas/tig , một công cụ dòng lệnh tốt hơn nhiều cho git.

Bạn có thể sử dụng homebrew để cài đặt tig trên macOS:

$ brew install tig
$ tig

nhập mô tả hình ảnh ở đây


14

Tôi có git logbí danh này ~/.gitconfigđể xem lịch sử biểu đồ:

[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'

Với vị trí này, git lsẽ xuất ra một cái gì đó như:

nhập mô tả hình ảnh ở đây

Trong Git 2.12 +, bạn thậm chí có thể tùy chỉnh màu đường của biểu đồ bằng log.graphColorstùy chọn cấu hình.

Đối với định dạng của nhật ký, nó tương tự như --oneline, với việc thêm tên tác giả (tôn trọng .mailmap) và ngày tác giả tương đối . Lưu ý rằng %C(auto)cú pháp yêu cầu Git sử dụng màu mặc định cho hàm băm xác nhận, v.v. được hỗ trợ trong Git> = 1.8.3 .


1
git log --graph --oneline chỉ để đảm bảo oneliner không bị lạc
tsenapathy

Có cách nào để đặt tên chi nhánh trên leftside?
anaval

12

Bạn đã thử gitkhay gitk --allchưa? Tuy nhiên, nó không có chức năng in / lưu img.


3
gitk là hiệu quả nhưng không đẹp lắm.
Johan

Thực tế là nó được tích hợp sẵn giúp tôi dễ chịu và không gặp rắc rối. Đặc biệt là --allcho bạn thấy tất cả các chi nhánh.
BcK


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

Đây là biến thể đầu cuối của tôi, tương tự như nhiều câu trả lời ở đây. Tôi thích điều chỉnh các cờ được thông qua lessđể ngăn chặn việc gói từ.

đầu ra ví dụ

Tôi đặt cái này thành bí danh để truy cập nhanh vì lệnh này hơi cồng kềnh.


8

Hãy thử ditaa . Nó có thể biến đổi bất kỳ sơ đồ ASCII thành hình ảnh. Mặc dù không được thiết kế với các nhánh Git, tôi rất ấn tượng với kết quả này.

Nguồn (tệp txt):

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

Chỉ huy:

java -jar ditaa0_9.jar ascii-graph.txt

Kết quả:

nhập mô tả hình ảnh ở đây

Nó cũng hỗ trợ màu nền, đường nét đứt, hình dạng khác nhau và nhiều hơn nữa. Xem các ví dụ .


1
Trong một mạch tương tự, Casual-effects.com/markdeep rất mạnh mẽ để tạo ra các sơ đồ nghệ thuật ascii được sắp xếp bằng tay.
Beni Cherniavsky-Paskin

7

Nếu kho lưu trữ của bạn nằm trên Gitlab, bạn có thể sử dụng biểu diễn đồ thị của nó như được hiển thị dưới dạng SVG trong trình duyệt của bạn.

  • Chuyển đến chế độ xem biểu đồ của kho lưu trữ của bạn, ví dụ: https://gitlab.com/gitlab-org/gitter/webapp/network/develop

  • Cuộn biểu đồ xuống phía dưới (nó lười tải cam kết!)

  • Sử dụng trình kiểm tra trình duyệt của bạn để sao chép phần tử SVG sang tệp mới

  • Mở nó trong trình kết xuất mà bạn chọn, ví dụ: Inkscape

nhập mô tả hình ảnh ở đây


6

Tôi không biết về một công cụ trực tiếp, nhưng có lẽ bạn có thể hack một tập lệnh để xuất dữ liệu sang định dạng dấu chấm và kết xuất nó bằng graphviz.


Hãy thử một github.com/gugod/bin/blob/master/git-graphviz này . Tôi không có tất cả các phụ thuộc trong môi trường công ty của mình, vì vậy việc thay đổi các iolệnh đó thành các lệnh đơn giản perl `git log [...]` làm việc cho tôi.
Ross Rogers

Nếu bạn đang dùng mac và bạn muốn thử tập lệnh này, bạn có thể lấy perl với brew install perl dotvà sau đó cpan common::sense IO::allđể có được các phụ thuộc. Sau đó, chỉ cần dẫn đầu ra cho một lệnh thích hợp, như git-graphviz | dot -Tpng -o repo.png. Tuy nhiên, đầu ra không khác nhiều so với git-big-hình .
jrhorn424

6

Có một biểu đồ cam kết Git thú vị là một trong những bản demo của Raphael thư viện đồ họa web .

Bản demo là tĩnh, nhưng nó đủ dễ để lấy mã và trao đổi dữ liệu tĩnh của chúng để lấy một bộ dữ liệu trực tiếp - Tôi nghĩ đó chỉ là Git commit data ở định dạng JSON.

Bản demo ở đây: http://dmitrybaranovskiy.github.io/raphael/github/impact.html


1
Đó có phải là mã biểu đồ được sử dụng trên biểu đồ tác động của GitHub không? (ví dụ: github.com/DmitryBaranovskiy/raphael/graphs/impact )
Slipp D. Thompson

@Sven: Cảm ơn bạn đã chỉ ra điều đó. Tôi đã sửa các liên kết bị hỏng cho bạn, mặc dù xin lưu ý rằng câu trả lời này là năm tuổi, và do đó có thể có một giải pháp tốt hơn gần đây.
Spudley


6

Một đầu ra biểu đồ git tablelike đẹp và sạch sẽ cho shell

với băm như bình thường bên cạnh cây đồ thị

với băm như bình thường bên cạnh cây đồ thị

hoặc trong một cột thêm

hoặc trong một cột thêm

Chỉnh sửa : Bạn muốn bắt đầu ngay mà không cần đọc giải thích? Sử dụng các bí danh git, đoạn mã hoặc đoạn mã chức năng từ phần EDIT 5 bên dưới.

Trong tất cả các câu trả lời cho câu hỏi này, không có kết quả nào cho thấy đầu ra rõ ràng giống như tablelike. Gần nhất là câu trả lời này từ các sách phúc âm nơi tôi bắt đầu.

Điểm cốt lõi trong cách tiếp cận của tôi là chỉ đếm các ký tự cây được hiển thị cho người dùng. Sau đó điền chúng vào một chiều dài cá nhân với khoảng trắng.

Khác với git bạn cần những công cụ này

  • grep
  • dán
  • in
  • quyến rũ
  • seq
  • tr
  • wc

chủ yếu là trên tàu với bất kỳ phân phối linux.

Đoạn mã là

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

Để tính toán khoảng trắng cần thiết, chúng tôi sử dụng

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

để có được tất cả các ký tự (đến 500 trên mỗi dòng), chỉ chọn các ký tự cây: * | / \ _ và khoảng trắng với

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

cuối cùng đếm chúng và trừ kết quả từ giá trị độ dài được chọn của chúng tôi, là 9 trong ví dụ.

Để tạo ra số lượng khoảng trắng được tính toán, chúng tôi sử dụng

  seq -s' ' $whitespaces

và cắt các số vị trí với

  tr -d '[:digit:]'

hơn là thêm chúng vào cuối dòng biểu đồ của chúng tôi. Đó là nó!

Git có tùy chọn đẹp để định dạng độ dài của các chỉ định đầu ra đã có cú pháp'%><(amount_of_characters,truncate_option)' , bổ sung khoảng trắng từ bên trái '>' hoặc bên phải '<' và có thể cắt bớt các ký tự từ đầu 'ltrunc', giữa 'mtrunc' hoặc end 'cắt ngắn'.

Điều quan trọng là các printf cmd ở trên sử dụng cùng các giá trị độ dài cho cột git tương ứng.

Hãy vui vẻ để tạo kiểu đầu ra rõ ràng giống như bàn của bạn theo nhu cầu của bạn.

Thêm:

Để có được giá trị độ dài phù hợp, bạn có thể sử dụng đoạn mã sau

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:' ')

và sử dụng $ max_chars làm giá trị độ dài phù hợp ở trên.


EDIT 1 : Chỉ cần lưu ý rằng charater gạch chân cũng được sử dụng trong cây git và chỉnh sửa các đoạn mã ở trên cho phù hợp. Nếu có những nhân vật khác bị mất, xin vui lòng để lại nhận xét.


EDIT 2 : Nếu bạn muốn thoát khỏi dấu ngoặc quanh các mục nhập chi nhánh và thẻ, chỉ cần sử dụng "% D" thay vì "% d" trong lệnh git, như trong EDIT 3.


EDIT 3 : Có lẽ tùy chọn màu "tự động" là tùy chọn bạn thích nhất cho các mục nhập chi nhánh và thẻ?

đầu tự động git ngoặc trắng và đầu ra vỏ thẻ tablelike

Thay đổi phần này của lệnh git (màu 214 )

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

để tự động

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


EDIT 4 : Hoặc bạn thích phối màu của riêng bạn cho phần đó, một đầu ra lạ mắt với đầu nhấp nháy?

cây git ưa thích đầu ra theo kiểu tablelike

Để có thể định kiểu đầu, tên nhánh và thẻ trước tiên, chúng ta cần tùy chọn màu "tự động" trong lệnh git của chúng tôi như trong EDIT 3.

Sau đó, chúng ta có thể thay thế các giá trị màu đã biết bằng cách thêm 3 dòng này

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

ngay trước dòng

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

trong đoạn mã của chúng tôi. Các giá trị thay thế tạo ra các màu trên.

Ví dụ: giá trị thay thế cho đầu là

3;5;1;38;5;196

trong đó 3; viết tắt của chữ nghiêng, 5; cho nhấp nháy và 1; 38; 5; 196 cho màu. Để biết thêm thông tin bắt đầu ở đây. Lưu ý: Hành vi này phụ thuộc vào thiết bị đầu cuối yêu thích của bạn và do đó có thể không sử dụng được.

NHƯNG bạn có thể chọn bất kỳ giá trị màu nào bạn thích.

TỔNG QUAN về các giá trị màu git và tương đương ANSI

nhập mô tả hình ảnh ở đây

Bạn tìm thấy một danh sách với tùy chọn màu git / phong cách ở đây .

Nếu bạn cần đầu ra trên bảng điều khiển của mình để có màu chính xác (hình trên được thu nhỏ lại theo stackoverflow), bạn có thể tạo đầu ra với

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

trong đường dẫn dự án git của bạn sử dụng cam kết đầu tiên từ đầu ra nhật ký git của bạn.


EDIT 5 : Như thành viên "Andras Deak" đã đề cập, có một số cách sử dụng mã này:

1) dưới dạng bí danh :

bí danh không chấp nhận tham số nhưng một hàm có thể , do đó chỉ cần xác định trong .bashrc của bạn

   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" ###

   }

và gọi hàm git_tossible (xuất phát từ tablelike) ngay dưới đường dẫn dự án git của bạn hoặc từ bất cứ nơi nào bạn muốn với đường dẫn dự án git của bạn làm tham số đầu tiên.

2) dưới dạng shell-script :

Tôi sử dụng nó với tùy chọn để chuyển một thư mục dự án git làm tham số đầu tiên cho nó hoặc nếu trống, hãy lấy thư mục làm việc như hành vi bình thường. Trong toàn bộ chúng ta có

# 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) như một bí danh git :

Có lẽ cách thoải mái nhất là thêm bí danh git trong .gitconfig của bạn

[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\");                                          \
                '"

Hơn chỉ gọi git tablytheo bất kỳ con đường dự án.

Git mạnh đến mức bạn có thể thay đổi đầu, thẻ, ... trực tiếp như được hiển thị ở trên và được lấy từ đây .

Một tùy chọn ưa thích khác là chọn màu cây bạn thích nhất với

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

điều đó mang lại cho bạn vẻ ngoài điên rồ nhưng luôn luôn xuất hiện git log

fanciest_git_tree_tableelike_image

Nháy mắt quá nhiều! Chỉ để chứng minh những gì có thể. Quá ít màu sắc được chỉ định dẫn đến sự lặp lại màu sắc.

Một tham chiếu .gitconfig hoàn chỉnh chỉ là một cú nhấp chuột.

MỘT LẦN NỮA: Hãy vui vẻ để tạo kiểu đầu ra rõ ràng giống như bàn của bạn theo nhu cầu của bạn.


Bạn nên giải thích trong câu trả lời của mình làm thế nào những đoạn bash này sẽ biến thành các lệnh giống như nhật ký git. Người ta có thể tìm ra cách sử dụng nhìn vào câu trả lời mà bạn đã liên kết, nhưng câu trả lời nên được khép kín
Andras Deak

Bạn có nghĩa là tôi nên giải thích chi tiết git log cmd? Hoặc bạn có thể cho tôi một ví dụ về những gì bạn đang thiếu, xin vui lòng.
onemorequestion

Lưu ý: Đầu ra của lệnh git log tuyệt vời được đoạn mã này sử dụng để nhận đầu ra giống như tab trên một thiết bị đầu cuối. Vì vậy, cách khác như bạn đã đề cập;)
onemorequestion

Tôi hình dung bạn không gõ 20 dòng bash mỗi khi bạn cần thứ này. Nó có ý nghĩa để xác định điều này như là một hàm bash hoặc bí danh git. Hầu hết các độc giả sẽ không cố gắng hoàn thành mã của bạn để làm cho nó dễ sử dụng. Ý tôi là thế Nếu bạn chỉ đặt mã trong một tệp sh ngẫu nhiên trên đường dẫn của bạn, bạn có thể bỏ qua tôi.
Andras Deak

1
Tôi hiểu rồi. Cảm ơn lời khuyên của bạn. Tôi sẽ chỉnh sửa câu trả lời của tôi và thêm một bí danh như vậy. Thông thường tôi sử dụng các tệp cho các lệnh "dài" như bạn đã đề cập. Nhưng để có cả hai cách viết ở đây thoải mái hơn nhiều, tôi đồng ý.
onemorequestion

5

một số bí danh trong ~ / .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

Đối với người dùng OSX, tôi đã lấy ví dụ @gospes và sửa đổi một chút cho gsed ( gnu-sedđược cài đặt qua homebrew) và điều chỉnh màu sắc (để hoạt động với nền đen, không chắc ví dụ ban đầu có thể hiển thị như thế nào trong ví dụ vì nó chỉ định văn bản màu đen trên thiết bị đầu cuối có nền màu đen).

[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

Chìa khóa cho OSX là trước tiên cài đặt gnu sed (có tùy chọn -r). Dễ dàng thực hiện nhất với homebrew, nó sẽ không ghi đè lên sed được cài đặt hệ thống, mà thay vào đó sẽ cài đặt gnu sed là "gsed". Hy vọng điều này sẽ giúp @ SlippD.Thndry đã nhận xét ở trên về OSX không hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.