Lihat riwayat perubahan file menggunakan versi Git

3090

Bagaimana saya bisa melihat riwayat perubahan file individual di Git, melengkapi detail dengan apa yang telah berubah?

Saya sudah sampai sejauh:

git log -- [filename]

yang menunjukkan kepada saya sejarah komit file, tetapi bagaimana cara mendapatkan konten dari setiap perubahan file?

Saya mencoba membuat transisi dari MS SourceSafe dan yang dulunya sederhana right-clickshow history.

Richard
sumber
41
Tautan di atas tidak lagi valid. Tautan ini berfungsi hari ini: Git Community Book
chris
1
Tautan di atas (diposting oleh Chris) tidak lagi valid. Tautan ini berfungsi hari ini: git-scm.com/book/en/v2
Cog

Jawaban:

2370

Untuk ini saya akan menggunakan:

gitk [filename]

atau untuk mengikuti nama file yang lalu ganti nama

gitk --follow [filename]
Claudio Acciaresi
sumber
28
Tapi saya bahkan punya alat yang menggabungkan hal di atas dengan 'git menyalahkan' yang memungkinkan saya untuk menelusuri sumber file karena perubahan waktu ...
Egon Willighagen
26
Sayangnya, ini tidak mengikuti riwayat file yang telah diubah namanya.
Dan Moulding
146
Saya juga mencari riwayat file yang sebelumnya diubah namanya dan menemukan utas ini terlebih dahulu. Solusinya adalah dengan menggunakan "git log --follow <filename>" seperti yang ditunjukkan Phil di sini .
Florian Gutmann
115
Penulis sedang mencari alat baris perintah. Sementara gitk datang dengan GIT, itu bukan aplikasi baris perintah atau GUI yang sangat bagus.
mikemaccana
72
Apakah dia mencari alat baris perintah? "klik kanan -> tampilkan riwayat" tentu tidak menyiratkannya.
hdgarrood
2235

Kamu bisa menggunakan

git log -p filename

untuk membiarkan git membuat tambalan untuk setiap entri log.

Lihat

git help log

untuk lebih banyak opsi - ini sebenarnya dapat melakukan banyak hal yang menyenangkan :) Untuk mendapatkan perbedaan untuk komit tertentu, Anda dapat

git show HEAD 

atau revisi lainnya oleh pengidentifikasi. Atau gunakan

gitk

untuk menelusuri perubahan secara visual.

VolkA
sumber
8
git show HEAD menunjukkan semua file, apakah Anda tahu cara melacak file individual (seperti yang diminta Richard)?
Jonas Byström
5
Anda menggunakan: git show <revision> - nama file, yang akan menampilkan perbedaan untuk revisi itu, jika ada.
Marcos Oliveira
4
--stat juga membantu. Anda bisa menggunakannya bersama dengan -p.
Raffi Khatchadourian
5
Ini bagus. gitk tidak berperilaku baik ketika menentukan jalur yang tidak ada lagi. Saya menggunakan git log -p - path.
Paulo Casaretto
6
Plus gitk sepertinya dibangun oleh monster boogie. Ini adalah jawaban yang bagus dan paling disesuaikan dengan pertanyaan awal.
ghayes
1498

git log --follow -p -- path-to-file

Ini akan menampilkan seluruh histori file (termasuk histori di luar nama dan dengan perbedaan untuk setiap perubahan).

Dengan kata lain, jika file bernama bardulunya bernama foo, maka git log -p bar(tanpa --followopsi) hanya akan menampilkan riwayat file sampai pada titik di mana namanya diubah - itu tidak akan menampilkan sejarah file ketika dikenal sebagai foo. Menggunakan git log --follow -p barakan menampilkan seluruh riwayat file, termasuk perubahan apa pun pada file ketika dikenal sebagai foo. The -ppilihan memastikan bahwa diffs disertakan untuk setiap perubahan.

Dan Moulding
sumber
18
--stat juga membantu. Anda bisa menggunakannya bersama dengan -p.
Raffi Khatchadourian
23
Saya setuju ini adalah jawaban NYATA. (1.) --followmemastikan bahwa Anda melihat nama file (2.) -pmemastikan bahwa Anda melihat bagaimana file diubah (3.) itu hanya baris perintah.
Trevor Boyd Smith
3
@ NHDaly Saya perhatikan bahwa --telah ditambahkan, tapi saya tidak tahu mengapa ini yang terbaik? Apa itu?
Benjohn
40
@ Benjohn --Opsi memberi tahu Git bahwa ia telah mencapai akhir opsi dan segala sesuatu yang mengikuti --harus diperlakukan sebagai argumen. Untuk git logini hanya ada bedanya jika Anda memiliki nama jalur yang dimulai dengan tanda hubung . Katakanlah Anda ingin mengetahui riwayat file yang memiliki nama malang "--follow":git log --follow -p -- --follow
Dan Moulding
10
@ Benjohn: Biasanya, --ini berguna karena bisa juga melindungi terhadap revisionnama yang cocok dengan nama file yang Anda masukkan, yang sebenarnya bisa menakutkan. Sebagai contoh: Jika Anda memiliki cabang dan file bernama foo, git log -p fooakan menunjukkan sejarah log git hingga foo, bukan sejarah untuk file foo . Tetapi @DanMoulding benar bahwa karena --followperintah hanya menggunakan satu nama file sebagai argumennya, ini kurang penting karena tidak bisa menjadi revision. Saya baru tahu itu. Mungkin Anda benar mengabaikannya dari jawaban Anda saat itu; Saya tidak yakin.
NHDaly
172

Jika Anda lebih memilih untuk tetap berbasis teks, Anda mungkin ingin menggunakan tig .

Instal Cepat:

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

Gunakan untuk melihat riwayat pada satu file: tig [filename]
Atau jelajahi riwayat repo terperinci:tig

Mirip dengan gitktetapi berbasis teks. Mendukung warna dalam terminal!

Falken
sumber
23
Alat berbasis teks yang bagus, jawaban yang bagus. Saya panik ketika saya melihat dependensi untuk menginstal gitk di server tanpa kepala saya. Akan mengungguli lagi A +++
Tom McKenzie
Anda dapat melihat file-file tertentu dengan tig juga, yaitutig -- path/to/specific/file
gloriphobia
110

git whatchanged -p filenamejuga setara dengan git log -p filenamedalam hal ini.

Anda juga dapat melihat kapan baris kode tertentu di dalam file diubah git blame filename. Ini akan mencetak id komit pendek, penulis, cap waktu, dan baris kode lengkap untuk setiap baris dalam file. Ini sangat berguna setelah Anda menemukan bug dan Anda ingin tahu kapan bug itu diperkenalkan (atau siapa kesalahannya).

farktronix
sumber
4
+1, tetapi filenamebukan opsional dalam perintah git blame filename.
rockXrock
7
"Pengguna baru didorong untuk menggunakan git-log sebagai gantinya. (...) Perintah ini disimpan terutama karena alasan historis;"
ciastek
105

Pengguna SourceTree

Jika Anda menggunakan SourceTree untuk memvisualisasikan repositori Anda (gratis dan cukup bagus), Anda dapat mengeklik kanan sebuah file dan memilih Log yang Dipilih

masukkan deskripsi gambar di sini

Tampilan (di bawah) jauh lebih ramah daripada gitk dan sebagian besar opsi lain tercantum. Sayangnya (saat ini) tidak ada cara mudah untuk meluncurkan tampilan ini dari baris perintah - CLI SourceTree saat ini hanya membuka repo.

masukkan deskripsi gambar di sini

Mark Fox
sumber
1
Saya terutama menyukai opsi "Ikuti file yang diubah namanya", yang memungkinkan Anda untuk melihat apakah file diubah namanya atau dipindahkan.
Chris
tetapi kecuali saya salah (tolong beri tahu saya!), seseorang hanya dapat membandingkan dua versi sekaligus di gui? Adakah klien yang memiliki antarmuka elegan untuk membedakan beberapa versi sekaligus? Mungkin dengan tampilan zoom-out seperti di Sublime Text? Itu akan sangat berguna menurut saya.
Sam Lewallen
@ SamLewallen Jika saya mengerti Anda ingin membandingkan tiga commit yang berbeda? Ini terdengar mirip dengan gabungan tiga arah (milikku, milikmu, basis) - biasanya strategi ini digunakan untuk menyelesaikan konflik gabungan yang tidak harus membandingkan tiga komitmen sewenang-wenang. Ada banyak alat yang mendukung penggabungan tiga cara stackoverflow.com/questions/10998728/… tetapi triknya adalah memberi makan alat-alat ini revisi spesifik gitready.com/intermediate/2009/02/27/…
Mark Fox
Terima kasih Mark Fox, itulah yang saya maksud. Apakah Anda mengetahui aplikasi yang akan melakukan itu?
Sam Lewallen
1
@ MarnenLaibow-Koser Saya tidak ingat mengapa saya membutuhkan SHA pada waktu itu. Ahaha.
AechoLiu
63

Untuk menampilkan revisi dan penulis yang terakhir diubah setiap baris file:

git blame filename

atau jika Anda ingin menggunakan GUI yang disalahkan:

git gui blame filename
yllohy
sumber
49

Ringkasan jawaban lain setelah membacanya dan bermain sedikit:

Perintah baris perintah yang biasa adalah

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

Tetapi Anda juga bisa menggunakan gitk (gui) atau tig (text-ui) untuk memberikan cara yang lebih mudah dibaca untuk melihatnya.

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

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

Di bawah debian / ubuntu, perintah instal untuk alat-alat bagus ini seperti yang diharapkan:

sudo apt-get install gitk tig

Dan saya sedang menggunakan:

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

sehingga saya bisa mengetik gdf diruntuk mendapatkan sejarah yang terfokus dari segala sesuatu di subdirektori dir.

John Lawrence Aspden
sumber
2
Saya pikir ini adalah jawaban yang bagus. Mungkin Anda tidak terpilih juga karena Anda menjawab cara lain (IMHO lebih baik) untuk melihat perubahan yaitu melalui gitk dan tig di samping git.
PopcornKing
Hanya untuk menambah jawaban. Temukan path (dalam ruang git, hingga yang masih ada dalam repositori). Kemudian gunakan perintah yang dinyatakan di atas "git log --follow --all -p <folder_path / file_path>". Mungkin ada kasusnya, bahwa filde / folder akan dihapus dari histori, maka cari path maksimum yang masih ada, dan cobalah untuk mengambil histori nya. bekerja!
parasrish
2
--alladalah untuk semua cabang, sisanya dijelaskan dalam jawaban @ Dan
cregox
1
Oh man, setelah sekian lama mencari solusi yang baik untuk melacak file di luar nama baru, akhirnya, saya menemukannya di sini. Bekerja seperti pesona! Terima kasih!
xZero
25

Tambahkan alias ini ke .gitconfig Anda:

[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

Dan gunakan perintah seperti ini:

> git lg
> git lg -- filename

Outputnya akan terlihat hampir sama persis dengan output gitk. Nikmati.

Palesz
sumber
Setelah saya menjalankan pintasan lg itu, saya berkata (dan saya kutip) "Cantik!". Namun, perhatikan bahwa "\ n" setelah "--graph" adalah kesalahan.
jmbeck
3
Juga dapat digunakan git lg -p filename- itu mengembalikan diff indah dari file yang dicari.
Egel
22

Akhir-akhir ini saya menemukan tigdan menemukannya sangat berguna. Ada beberapa kasus saya berharap itu A atau B tetapi sebagian besar waktu itu agak rapi.

Untuk kasus Anda, tig <filename>mungkin apa yang Anda cari.

http://jonas.nitro.dk/tig/

lang2
sumber
pada centos yum instal tig
zzapper
18

Anda dapat menggunakan vscode dengan GitLens , ini adalah alat yang sangat kuat. Setelah menginstal GitLens, buka tab GitLens, pilih FILE HISTORYdan Anda dapat menjelajahinya.

masukkan deskripsi gambar di sini

foxiris
sumber
15

Saya menulis git-playback untuk tujuan yang tepat ini

pip install git-playback
git playback [filename]

Ini memiliki manfaat baik menampilkan hasil di baris perintah (seperti git log -p) sambil juga membiarkan Anda melangkah melalui setiap komit menggunakan tombol panah (seperti gitk).

Jian
sumber
13

Atau:

gitx -- <path/to/filename>

jika Anda menggunakan gitx

George Anderson
sumber
1
Entah mengapa gitx saya terbuka kosong.
IgorGanapolsky
@IgorGanapolsky Anda harus memastikan bahwa Anda adalah akar dari repositori git Anda
zdsbs
10

Anda juga dapat mencoba ini yang mencantumkan komit yang telah mengubah bagian tertentu dari file (Diimplementasikan dalam Git 1.8.4).

Hasil yang dikembalikan adalah daftar commit yang memodifikasi bagian khusus ini. Perintah:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

di mana upperLimit adalah start_line_number dan lowerLimit adalah ending_line_number file.

Lebih detail di https://www.techpurohit.com/list-some-useful-git-commands

jitendrapurohit
sumber
9

Jika Anda ingin melihat seluruh sejarah file, termasuk di semua lain cabang menggunakan:

gitk --all <filename>
Adi Shavit
sumber
7

Dengan Ekstensi Git yang sangat baik , Anda pergi ke suatu titik dalam sejarah di mana file masih ada (jika sudah dihapus, jika tidak pergi ke HEAD), beralih ke File treetab, klik kanan pada file dan pilih File history.

Secara default, ini mengikuti file melalui penggantian nama, dan Blametab memungkinkan untuk melihat nama pada revisi yang diberikan.

Ini memiliki beberapa Gotcha kecil, seperti ditampilkan fatal: Not a valid object namedi Viewtab ketika mengklik revisi penghapusan, tapi saya bisa hidup dengan itu. :-)

PhiLho
sumber
Perlu dicatat bahwa ini hanya untuk Windows.
Evan Hahn
3
@EvanHahn tidak akurat, via mono kita dapat menggunakan GitExtension juga di Linux, kita menggunakannya di ubuntu dan cukup senang dengan itu. lihat git-extensions-documentation.readthedocs.org/en/latest/…
Shmil The Cat
7

Jika Anda menggunakan git GUI (pada Windows) di bawah menu Repository, Anda dapat menggunakan "Visualisasikan master's History". Sorot komit di panel atas dan file di kanan bawah dan Anda akan melihat diff untuk komit di kiri bawah.

cori
sumber
Bagaimana ini menjawab pertanyaan?
jmbeck
3
Nah, OP tidak menentukan baris perintah, dan pindah dari SourceSafe (yang merupakan GUI) sepertinya relevan untuk menunjukkan bahwa Anda bisa melakukan hampir hal yang sama yang dapat Anda lakukan di VSS di Git GUI pada Windows.
cori
6

SmartGit :

  1. Dalam menu aktifkan untuk menampilkan file yang tidak berubah: Lihat / Tampilkan file yang tidak berubah
  2. Klik kanan file dan pilih 'Log' atau tekan 'Ctrl-L'
Antonín Slejška
sumber
4

Jawaban yang saya cari yang tidak ada di utas ini adalah melihat perubahan pada file yang saya komentari. yaitu

git diff --cached
Malks
sumber
1
Jika Anda ingin memasukkan perubahan lokal (tidak dipentaskan), saya sering berlari git diff origin/masteruntuk menunjukkan perbedaan lengkap antara cabang lokal Anda dan cabang master (yang dapat diperbarui dari jarak jauh melalui git fetch)
ghayes
4

Jika Anda menggunakan TortoiseGit Anda harus dapat mengklik kanan pada file dan lakukan TortoiseGit --> Show Log. Di jendela yang muncul, pastikan:

  • Show Whole ProjectOpsi ' ' tidak dicentang.

  • All BranchesOpsi ' ' dicentang.

pengguna3885927
sumber
TortoiseGit (dan Eclipse Git juga) entah bagaimana melewatkan revisi file yang dipilih, jangan mengandalkan itu!
Noam Manos
@NoamManos, saya belum menemukan masalah itu, jadi saya tidak dapat memverifikasi apakah pernyataan Anda benar.
user3885927
Kesalahan saya, ini hanya terjadi di Eclipse, tetapi di TortoiseGit Anda dapat melihat semua revisi file jika tidak mencentang "tunjukkan semua proyek" + memeriksa "semua cabang" (jika file dilakukan di cabang lain, sebelum digabungkan ke main cabang). Saya akan memperbarui jawaban Anda.
Noam Manos
3

git diff -U <filename> memberi Anda unified diff.

Itu harus diwarnai merah dan hijau. Jika tidak, jalankan: git config color.ui autopertama.

Lukasz Czerwinski
sumber
2

Jika Anda menggunakan gerhana dengan plugin git, ia memiliki tampilan perbandingan yang sangat baik dengan riwayat. Klik kanan file dan pilih "bandingkan dengan" => "riwayat"

AhHatem
sumber
Namun itu tidak memungkinkan Anda menemukan file yang dihapus.
avgvstvs
Membandingkan dua versi file berbeda dengan Melihat riwayat perubahan file
golimar
0

Saya mungkin tentang di mana OP saat ini dimulai, mencari sesuatu yang sederhana yang akan membiarkan saya menggunakan git difftool dengan vimdiff untuk meninjau perubahan pada file dalam repo saya mulai dari komit tertentu. Saya tidak terlalu senang dengan jawaban saya menemukan, jadi saya melemparkan ini git inc remental rep orter (gitincrep) naskah bersama-sama dan itu sudah berguna bagi saya:

#!/usr/bin/env bash

STARTWITH="${1:-}"
shift 1

DFILES=( "$@" )

RunDiff()
{
        GIT1=$1
        GIT2=$2
        shift 2

        if [ "$(git diff $GIT1 $GIT2 "$@")" ]
        then
                git log ${GIT1}..${GIT2}
                git difftool --tool=vimdiff $GIT1 $GIT2 "$@"
        fi
}

OLDVERS=""
RUNDIFF=""

for NEWVERS in $(git log --format=format:%h  --reverse)
do
        if [ "$RUNDIFF" ]
        then
                RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
        elif [ "$OLDVERS" ]
        then
                if [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]
                then
                        RUNDIFF=true
                        RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
                fi
        fi
        OLDVERS=$NEWVERS
done

Dipanggil tanpa argumen, ini akan dimulai dari awal sejarah repo, jika tidak akan dimulai dengan hash komit singkat apa pun yang Anda berikan dan lanjutkan ke saat ini - Anda dapat ctrl-C kapan saja untuk keluar. Setiap argumen setelah argumen pertama akan membatasi laporan perbedaan hanya untuk menyertakan file yang terdaftar di antara argumen tersebut (yang menurut saya adalah yang diinginkan OP, dan saya akan merekomendasikan untuk semua proyek kecil kecuali). Jika Anda memeriksa perubahan pada file tertentu dan ingin memulai dari awal, Anda harus memberikan string kosong untuk arg1. Jika Anda bukan pengguna vim, Anda dapat mengganti vimdiff dengan alat dif favorit Anda.

Behavior adalah untuk menghasilkan komit komentar ketika perubahan yang relevan ditemukan dan mulai menawarkan vimdiff berjalan untuk setiap file yang diubah (itu adalah perilaku git difftool , tetapi berfungsi di sini).

Pendekatan ini mungkin cukup naif, tetapi melihat melalui banyak solusi di sini dan di pos terkait, banyak yang terlibat menginstal alat baru pada sistem di mana saya tidak memiliki akses admin, dengan antarmuka yang memiliki kurva belajar mereka sendiri. Script di atas melakukan apa yang saya inginkan tanpa berurusan dengan semua itu. Saya akan melihat banyak saran bagus di sini ketika saya membutuhkan sesuatu yang lebih canggih - tetapi saya pikir ini langsung responsif terhadap OP.

oracleif
sumber
0

Saya telah menemukan solusi yang sangat sederhana untuk dengan cepat menemukan riwayat file.

  1. Buat perubahan acak dalam file
  2. Ini akan ditampilkan sebagai perubahan tanpa komitmen pada kode sumber Anda
  3. Klik kanan pada file dan pilih 'Log Dipilih'

masukkan deskripsi gambar di sini

Itu akan menunjukkan sejarah semua komitmen.

savvyBrar
sumber
Dari mana GUI ini berasal?
colidyre
Sourcetree UI. Terima kasih
savvyBrar