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.


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]

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.


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.


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!


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


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


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

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.


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.


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/


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


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



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


9

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

gitk --all <filename>

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


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.


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'

4

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

git diff --cached

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.


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.


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"


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.


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.


Dari mana GUI ini berasal?
colidyre

Sourcetree UI. Terima kasih
savvyBrar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.