Câu hỏi Xem lịch sử thay đổi của tệp bằng cách sử dụng phiên bản Git


Làm thế nào tôi có thể xem lịch sử thay đổi của một tệp riêng lẻ trong Git, hoàn thành chi tiết về những gì đã thay đổi?

Tôi đã có được như xa như:

git log -- [filename]

hiển thị cho tôi lịch sử cam kết của tệp, nhưng làm cách nào để tôi nhận được nội dung của từng thay đổi trong tệp?

Tôi đang cố gắng thực hiện chuyển đổi từ MS SourceSafe và đã từng đơn giản right-click → show history.


2510
2017-11-10 15:42


gốc


Liên kết trên không còn hợp lệ nữa. Liên kết này hiện đang hoạt động: Sách cộng đồng Git - chris


Các câu trả lời:


Đối với điều này tôi muốn sử dụng:

gitk [filename]

hoặc để làm theo tên tập tin quá khứ đổi tên

gitk --follow [filename]

1951
2017-08-24 12:05



Nhưng tôi thậm chí còn có một công cụ kết hợp ở trên với 'git đổ lỗi' cho phép tôi duyệt nguồn của một tập tin khi nó thay đổi trong thời gian ... - Egon Willighagen
Thật không may, điều này không theo lịch sử của tập tin trong quá khứ đổi tên. - Dan Moulding
Tôi cũng đang tìm kiếm lịch sử của các tệp đã được đổi tên trước đó và tìm thấy chuỗi này trước tiên. Giải pháp là sử dụng "git log --follow <filename>" như Phil đã chỉ ra đây. - Florian Gutmann
Tác giả đang tìm kiếm một công cụ dòng lệnh. Trong khi gitk đi kèm với GIT, nó không phải là một ứng dụng dòng lệnh cũng không phải là một GUI đặc biệt tốt. - mikemaccana
Anh ta đang tìm kiếm một công cụ dòng lệnh? "nhấp chuột phải -> hiển thị lịch sử" chắc chắn không hàm ý điều đó. - hdgarrood


Bạn có thể dùng

git log -p filename

để cho git tạo các bản vá cho mỗi mục nhập nhật ký.

Xem

git help log

để có thêm lựa chọn - nó thực sự có thể làm được rất nhiều điều tốt đẹp :) Để có được sự khác biệt cho một cam kết cụ thể, bạn có thể

git show HEAD 

hoặc bất kỳ sửa đổi nào khác bằng số nhận dạng. Hoặc dùng

gitk

để duyệt các thay đổi một cách trực quan.


1836
2017-11-10 15:56



git show HEAD hiển thị tất cả các tệp, bạn có biết cách theo dõi một tệp riêng lẻ (như Richard đang yêu cầu) không? - Jonas Byström
bạn sử dụng: git show <revision> - tên tập tin, sẽ hiển thị các khác biệt cho bản sửa đổi đó, trong trường hợp tồn tại một. - Marcos Oliveira
--stat cũng hữu ích. Bạn có thể sử dụng nó cùng với -p. - Raffi Khatchadourian
Điều đó thật tuyệt. gitk không hoạt động tốt khi chỉ định đường dẫn không tồn tại nữa. Tôi đã sử dụng git log -p - path. - Paulo Casaretto
Plus gitk trông giống như nó được xây dựng bởi quái vật boogie. Đây là một câu trả lời tuyệt vời và được điều chỉnh tốt nhất cho câu hỏi ban đầu. - ghayes


git log --follow -p -- file

Điều này sẽ hiển thị toàn thể lịch sử của tệp (bao gồm lịch sử ngoài đổi tên và có sự khác biệt cho mỗi thay đổi).

Nói cách khác, nếu tập tin có tên bar đã từng được đặt tên foo, sau đó git log -p bar (không có --follow tùy chọn) sẽ chỉ hiển thị lịch sử của tệp cho đến khi nó được đổi tên - nó sẽ không hiển thị lịch sử của tệp khi nó được gọi là foo. Sử dụng git log --follow -p bar sẽ hiển thị toàn bộ lịch sử của tệp, bao gồm bất kỳ thay đổi nào đối với tệp khi được gọi là foo. Các -p tùy chọn đảm bảo rằng các khác biệt được bao gồm cho mỗi thay đổi.


1187
2018-03-30 23:25



--stat cũng hữu ích. Bạn có thể sử dụng nó cùng với -p. - Raffi Khatchadourian
Câu trả lời của Dan là câu trả lời thực sự duy nhất! git log --follow -p file - zzeroo
Tôi đồng ý đây là câu trả lời REAL. (1.) --follow đảm bảo rằng bạn thấy tên tập tin (2.) -p đảm bảo rằng bạn thấy cách tập tin được thay đổi (3.) nó chỉ là dòng lệnh. - Trevor Boyd Smith
@Benjohn The -- tùy chọn cho Git biết rằng nó đã đến cuối các tùy chọn và bất cứ điều gì sau -- nên được coi là một đối số. Dành cho git log điều này chỉ tạo ra bất kỳ sự khác biệt nào nếu bạn có tên đường dẫn bắt đầu bằng dấu gạch ngang. Giả sử bạn muốn biết lịch sử của một tệp có tên không may "--follow": git log --follow -p -- --follow - Dan Moulding
@Benjohn: Thông thường, -- rất hữu ích vì nó cũng có thể bảo vệ chống lại bất kỳ revision tên khớp với tên tệp bạn đã nhập, điều này thực sự đáng sợ. Ví dụ: Nếu bạn có cả chi nhánh và tệp có tên foo, git log -p foo sẽ hiển thị lịch sử nhật ký git lên đến foo, không phải lịch sử cho tập tin  foo. Nhưng @DanMoulding đúng là vì --follow lệnh chỉ lấy một tên tệp làm đối số của nó, điều này ít cần thiết hơn vì nó không thể là một revision. Tôi vừa học được điều đó. Có lẽ bạn đã có quyền để nó ra khỏi câu trả lời của bạn sau đó; Tôi không chắc. - NHDaly


Nếu bạn muốn giữ nguyên văn bản, bạn có thể muốn sử dụng tig.

Cài đặt nhanh:

  • apt-get: # apt-get install tig 
  • Homebrew (OS X): $ brew install tig

Sử dụng nó để xem lịch sử trên một tệp duy nhất: tig [filename]
Hoặc duyệt qua lịch sử repo chi tiết: tig

Tương tự như gitk nhưng dựa trên văn bản. Hỗ trợ màu sắc trong terminal!


147
2018-06-07 10:23



Công cụ dựa trên văn bản tuyệt vời, câu trả lời tuyệt vời. Tôi hoảng sợ khi tôi thấy những phụ thuộc cho gitk cài đặt trên máy chủ không đầu của tôi. Sẽ upvote một lần nữa A +++ - Tom McKenzie
Bạn cũng có thể xem các tệp cụ thể với tig, tức là tig -- path/to/specific/file - gloriphobia


git whatchanged -p filename cũng tương đương với git log -p filename trong trường hợp này.

Bạn cũng có thể thấy khi nào một dòng mã cụ thể bên trong một tệp đã được thay đổi bằng git blame filename. Thao tác này sẽ in ra một thẻ cam kết ngắn, tác giả, dấu thời gian và dòng mã hoàn chỉnh cho mỗi dòng trong tệp. Điều này rất hữu ích sau khi bạn đã tìm thấy một lỗi và bạn muốn biết khi nào nó được giới thiệu (hoặc lỗi của ai).


102
2017-11-11 06:12



+1, nhưng filename không phải là tùy chọn trong lệnh git blame filename. - rockXrock
"Người dùng mới được khuyến khích sử dụng git-log để thay thế. (...) Lệnh này được giữ chủ yếu vì lý do lịch sử;" - ciastek


Người dùng SourceTree

Nếu bạn sử dụng SourceTree để hình dung kho lưu trữ của bạn (miễn phí và khá tốt), bạn có thể nhấp chuột phải vào một tệp và chọn Nhật ký đã chọn

enter image description here

Màn hình (bên dưới) thân thiện hơn nhiều so với gitk và hầu hết các tùy chọn khác được liệt kê. Thật không may (tại thời điểm này) không có cách nào dễ dàng để khởi chạy khung nhìn này từ dòng lệnh - CLI của SourceTree hiện chỉ mở repos.

enter image description here


92
2017-07-30 18:55



Tôi đặc biệt thích tùy chọn "Theo dõi các tệp đã đổi tên", cho phép bạn xem tệp đã được đổi tên hay di chuyển hay chưa. - Chris
nhưng trừ khi tôi nhầm lẫn (xin vui lòng cho tôi biết!), người ta chỉ có thể so sánh hai phiên bản tại một thời điểm trong gui? Có bất kỳ khách hàng nào có giao diện thanh lịch để phân biệt một số phiên bản khác nhau cùng một lúc không? Có thể với chế độ xem thu nhỏ như trong Văn bản siêu việt? Điều đó sẽ thực sự hữu ích tôi nghĩ. - Sam Lewallen
@SamLewallen Nếu tôi hiểu chính xác bạn muốn so sánh ba cam kết khác nhau? Điều này nghe có vẻ tương tự như một cách hợp nhất ba chiều (của tôi, của bạn, cơ sở) - thường là chiến lược này được sử dụng để giải quyết xung đột hợp nhất không nhất thiết phải so sánh ba cam kết tùy ý. Có nhiều công cụ hỗ trợ ba cách sáp nhập stackoverflow.com/questions/10998728/… nhưng mẹo đó là cho các công cụ này những bản sửa đổi cụ thể gitready.com/intermediate/2009/02/27/… - Mark Fox
Cảm ơn Mark Fox, đó là ý tôi. Bạn có biết về bất kỳ ứng dụng nào sẽ làm điều đó không? - Sam Lewallen
Bạn cứu mạng tôi. Bạn có thể dùng gitk để tìm SHA1 băm, và sau đó mở SourceTree nhập Log Selected.. dựa trên tìm thấy SHA1. - AechoLiu


Để hiển thị sửa đổi và tác giả sửa đổi lần cuối mỗi dòng của một tệp:

git blame filename

hoặc nếu bạn muốn sử dụng GUI đổ lỗi mạnh mẽ:

git gui blame filename

57
2017-08-11 13:01





Tóm tắt các câu trả lời khác sau khi đọc qua chúng và chơi một chút:

Lệnh dòng lệnh thông thường sẽ là

git log --follow --all -p dir/file.c

Nhưng bạn cũng có thể sử dụng gitk (gui) hoặc tig (text-ui) để cung cấp nhiều cách đọc được con người hơn.

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

Dưới debian / ubuntu, lệnh cài đặt cho các công cụ đáng yêu này như mong đợi:

sudo apt-get install gitk tig

Và tôi hiện đang sử dụng:

alias gdf='gitk --follow --all -p'

để tôi có thể gõ gdf dir để có được lịch sử tập trung của mọi thứ trong thư mục con dir.


40
2017-12-05 18:38



Tôi nghĩ đây là một câu trả lời tuyệt vời. Có thể bạn cũng không được bình chọn vì bạn trả lời các cách khác (IMHO tốt hơn) để xem các thay đổi tức là thông qua gitk và tig ngoài git. - PopcornKing
Chỉ cần thêm vào câu trả lời. Xác định vị trí đường dẫn (trong không gian git, đến đó tồn tại trong kho lưu trữ vẫn còn). Sau đó, sử dụng lệnh được nêu ở trên "git log --follow --all -p <folder_path / file_path>". Có thể có trường hợp, rằng filde / thư mục có thể đã được gỡ bỏ trong lịch sử, do đó xác định vị trí đường dẫn tối đa tồn tại vẫn còn, và cố gắng lấy lịch sử của nó. công trinh ! - parasrish
--all dành cho tất cả các nhánh, phần còn lại được giải thích trong câu trả lời của @ Dan - cregox


Thêm bí danh này vào tệp .gitconfig của bạn:

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

Và sử dụng lệnh như thế này:

> git lg
> git lg -- filename

Đầu ra sẽ trông gần như chính xác giống như đầu ra gitk. Thưởng thức.


22
2018-06-26 20:12



Sau khi tôi chạy phím tắt đó, tôi nói (và tôi trích dẫn) "Beautiful!". Tuy nhiên, lưu ý rằng "\ n" sau "- biểu đồ" là một lỗi. - jmbeck
Cũng có thể được sử dụng git lg -p filename - nó trả về một sự khác biệt tuyệt vời của tập tin tìm kiếm. - Egel


tôi đã viết phát lại git cho mục đích chính xác này

pip install git-playback
git playback [filename]

Điều này có lợi ích của cả hai hiển thị các kết quả trong dòng lệnh (như git log -p) trong khi cũng cho phép bạn thực hiện từng bước bằng cách sử dụng các phím mũi tên (như gitk).


14
2017-11-19 06:25





Hoặc là:

gitx -- <path/to/filename>

nếu bạn đang sử dụng gitx


13
2017-09-17 16:50



Đối với một số lý do gitx của tôi mở ra trống. - Igor Ganapolsky
@IgorGanapolsky bạn phải chắc chắn rằng bạn đang ở gốc của kho git của bạn - zdsbs