Apakah mungkin untuk meminta git diff untuk memasukkan file yang tidak terlacak dalam output diffnya? Atau taruhan terbaik saya untuk menambahkan file baru yang saya buat dan file yang sudah saya edit, dan gunakan
git diff --cached
?
Dengan versi git terbaru Anda dapat git add -N
file (atau --intent-to-add
), yang menambahkan gumpalan panjang nol ke indeks di lokasi itu. Hasilnya adalah bahwa file Anda "tidak terlacak" sekarang menjadi modifikasi untuk menambahkan semua konten ke file panjang nol ini, dan itu muncul dalam output "git diff".
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
Sayangnya, seperti yang ditunjukkan, Anda tidak dapat git stash
sementara Anda memiliki --intent-to-add
file yang tertunda seperti ini. Meskipun jika Anda perlu menyimpan, Anda cukup menambahkan file baru dan menyimpannya. Atau Anda dapat menggunakan solusi emulasi:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(menyiapkan alias adalah teman Anda di sini).
git add -N .
Saya percaya Anda bisa berbeda terhadap file dalam indeks Anda dan file yang tidak terlacak dengan hanya menyediakan path ke kedua file.
sumber
git diff --no-index untracked_file_1 untracked_file_2
untuk mendapatkangit diff
pewarnaan sintaks dll di diffs ... indah./dev/null
gantinya:git diff --no-index -- /dev/null <untracked_file>
.cat untracked_file_1
, atau mungkinprintf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
jika Anda benar-benar membutuhkan keluaran ramah lingkungan. :) (Meskipun pada catatan yang lebih serius, harap perhatikan bahwa penggantian perintah akan menghapus baris baru dari file Anda.)Untuk gitting interaktif saya sehari-hari (di mana saya melakukan diff pohon kerja terhadap HEAD sepanjang waktu, dan ingin agar file yang tidak terlacak dimasukkan ke dalam diff),
add -N/--intent-to-add
tidak dapat digunakan, karena rusakgit stash
.Jadi, inilah
git diff
pengganti saya . Ini bukan solusi yang sangat bersih, tetapi karena saya benar-benar hanya menggunakannya secara interaktif, saya setuju dengan peretasan:Mengetik hanya
d
akan memasukkan file yang tidak terlacak dalam diff (yang merupakan hal yang saya pedulikan dalam alur kerja saya), dand args...
akan berperilaku seperti biasagit diff
.Catatan:
git diff
benar-benar hanya perbedaan individual yang disatukan, jadi tidak mungkin untuk mengetahuid
keluaran dari "perbedaan nyata" - kecuali fakta bahwa semua file yang tidak terlacak disortir terakhir.git diff
. Jika seseorang mengetahui cara melakukan ini, atau jika mungkin suatu fitur ditambahkangit
pada suatu saat nanti, silakan tinggalkan catatan di sini!sumber
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
solusi saya yang saya sarankan untuk git yang lebih tua tidak berhasilgit stash
, dengan asumsi Anda sudah mendapatkan e69de29bb di db Anda, misalnya dengan mencoba menggunakanadd -N
sebelumnya. Jadi rupanya itu tidak persis setara dengangit add -N
cara tertentu: tbh saya tidak yakin bagaimana caranya.test
-ngomong, Anda melakukan perbandingan string alih-alih kesetaraan numerik dengan perintah Anda . Seharusnya tidak mempengaruhi apa pun, tetapitest "$#" -eq 0
lebih tepatnya apa yang dimaksudkan.less
sehingga Anda tidak perlu menekanq
untuk setiap file dan rasanya persis sepertigit diff
, dengan menghapus pagination per file (-P
), menambahkannya kembali setelah itu (| less
), menjaga warna (--color=always
) dan menafsirkannya sebagai warna (less -r
atauless -R
). Jadi semuanya:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(jadi mis.if [ -t 1 ]; then color_arg=--color; fi
Atau sesuatu) adalah cara bagi shell untuk memeriksa apakah outputnya adalah terminal, yang merupakan cara yang berguna untuk memutuskan pewarnaan. Danxargs
mungkin memberi cara untuk menyingkirkan loop sementara. Anda masih membutuhkannya-n 1
, jadi masih akan meluncurkan git beberapa kali, dan masih harus berpasangan seperti itu, tapi ... itu menghilangkanwhile
danread
, jadi mungkin itu lebih baik?!? Saya serahkan itu pada pembaca.Tidak 100% to the point, tetapi jika karena alasan tertentu Anda tidak ingin menambahkan file Anda ke indeks seperti yang disarankan oleh jawaban yang diterima, berikut adalah pilihan lain:
Jika file tidak dilacak, jelas diff adalah keseluruhan file, jadi Anda bisa melihatnya dengan sedikit:
Menavigasi di antara mereka dengan
:n
dan:p
untuk selanjutnya dan sebelumnya ..Perbarui dari komentar: Jika Anda memerlukan format tambalan Anda juga dapat menggabungkannya dengan
git diff
:Anda juga dapat mengarahkan output ke file atau menggunakan perintah diff lain dalam kasus ini.
sumber
git diff /dev/null <untracked_tile>
dan mendapatkan tambalan dalam format tambalan alih-alih "hanya" sebuah fileHasilkan tambalan jika diperlukan, dan kemudian:
sumber
git add -p
sangat sering (yang biasanya saya sarankan, omong-omong) ... Ini memang memberikan cara melakukan hal dasar, itu hanya ... harus dicatat bahwa ia memiliki potensi untuk sisi yang tidak diinginkan efek.ini bekerja untuk saya:
Langkah terakhir adalah opsional, itu akan meninggalkan file dalam keadaan sebelumnya (tidak terlacak)
berguna jika Anda membuat tambalan juga:
sumber
Perubahan berfungsi saat dipentaskan dan tidak dipentaskan dengan perintah ini. File baru berfungsi saat dipentaskan:
Jika tidak dipentaskan, Anda hanya akan melihat perbedaan file.
sumber
HEAD
adalah nilai default , jadi ini sama dengangit diff
yang tidak menyelesaikan masalah.git add
dari setiap file yang tidak dilacakgit add
ini adalah yang paling sederhana jika use case Anda adalah untuk memeriksa apa yang baru saja Anda tambahkan / ingin tambahkanUntuk satu file:
Untuk semua file baru:
Sebagai alias:
Untuk semua file yang dimodifikasi dan baru digabungkan sebagai satu perintah:
sumber
biasanya ketika saya bekerja dengan tim lokasi terpencil, penting bagi saya bahwa saya memiliki pengetahuan sebelumnya tentang perubahan yang dilakukan oleh tim lain dalam file yang sama, sebelum saya mengikuti tahapan git untrack -> bertahap -> komit untuk itu saya menulis skrip bash yang bantu saya untuk menghindari penyelesaian konflik merger yang tidak perlu dengan tim jarak jauh atau membuat cabang lokal baru dan membandingkan dan menggabungkan cabang utama
dalam skrip di atas saya mengambil cabang utama jarak jauh (tidak perlu cabang masternya) ke FETCH_HEAD mereka membuat daftar file yang dimodifikasi saja dan membandingkan file yang dimodifikasi dengan git difftool
di sini banyak difftool yang didukung oleh git, saya mengkonfigurasi 'Meld Diff Viewer' untuk perbandingan GUI yang baik.
sumber
Dengan asumsi Anda tidak memiliki komitmen lokal,
sumber
git diff
perintah yang menyertakan file yang tidak dilacak. Perintah ini tidak termasuk mereka. Juga, apakah komitmen lokal ada atau tidak sama sekali tidak ada hubungannya dengan pertanyaan.git merge --squash mybranch
, dangit diff master
menunjukkan kepada saya perubahan dalam file yang tidak terlacak.git diff
tidak menunjukkan perbedaan dalam file yang tidak terlacak: karena mereka tidak terlacak tidak pernah ada perbedaan untuk ditunjukkan, menurut definisi. Begitulah cara Git bekerja. :)