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
?
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
?
Jawaban:
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.
git diff --no-index tracked_file untracked_file
git diff --no-index untracked_file_1 untracked_file_2
untuk mendapatkan git diff
pewarnaan sintaks dll di diffs ... indah.
/dev/null
gantinya: git diff --no-index -- /dev/null <untracked_file>
.
cat untracked_file_1
, atau mungkin printf '\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 rusak git 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:
d() {
if test "$#" = 0; then
(
git diff --color
git ls-files --others --exclude-standard |
while read -r i; do git diff --color -- /dev/null "$i"; done
) | `git config --get core.pager`
else
git diff "$@"
fi
}
Mengetik hanya d
akan memasukkan file yang tidak terlacak dalam diff (yang merupakan hal yang saya pedulikan dalam alur kerja saya), dan d args...
akan berperilaku seperti biasa git diff
.
Catatan:
git diff
benar-benar hanya perbedaan individual yang disatukan, jadi tidak mungkin untuk mengetahui d
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 ditambahkan git
pada suatu saat nanti, silakan tinggalkan catatan di sini!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
solusi saya yang saya sarankan untuk git yang lebih tua tidak berhasil git stash
, dengan asumsi Anda sudah mendapatkan e69de29bb di db Anda, misalnya dengan mencoba menggunakan add -N
sebelumnya. Jadi rupanya itu tidak persis setara dengan git 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, tetapi test "$#" -eq 0
lebih tepatnya apa yang dimaksudkan.
less
sehingga Anda tidak perlu menekan q
untuk setiap file dan rasanya persis seperti git diff
, dengan menghapus pagination per file ( -P
), menambahkannya kembali setelah itu ( | less
), menjaga warna ( --color=always
) dan menafsirkannya sebagai warna ( less -r
atau less -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. Dan xargs
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 menghilangkan while
dan read
, 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:
less $(git ls-files --others --exclude-standard)
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
:
git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less
Anda juga dapat mengarahkan output ke file atau menggunakan perintah diff lain dalam kasus ini.
git diff /dev/null <untracked_tile>
dan mendapatkan tambalan dalam format tambalan alih-alih "hanya" sebuah file
git add -A
git diff HEAD
Hasilkan tambalan jika diperlukan, dan kemudian:
git reset HEAD
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:
git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
Langkah terakhir adalah opsional, itu akan meninggalkan file dalam keadaan sebelumnya (tidak terlacak)
berguna jika Anda membuat tambalan juga:
git diff --cached my_file.txt > my_file-patch.patch
Perubahan berfungsi saat dipentaskan dan tidak dipentaskan dengan perintah ini. File baru berfungsi saat dipentaskan:
$ git diff HEAD
Jika tidak dipentaskan, Anda hanya akan melihat perbedaan file.
git add
dari setiap file yang tidak dilacak
git add
ini adalah yang paling sederhana jika use case Anda adalah untuk memeriksa apa yang baru saja Anda tambahkan / ingin tambahkan
Untuk satu file:
git diff --no-index /dev/null new_file
Untuk semua file baru:
for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
Sebagai alias:
alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
Untuk semua file yang dimodifikasi dan baru digabungkan sebagai satu perintah:
{ git --no-pager diff; gdnew }
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
#set -x
branchname=`git branch | grep -F '*' | awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool FETCH_HEAD $file ;
done
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.
Dengan asumsi Anda tidak memiliki komitmen lokal,
git diff origin/master
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
, dan git 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. :)