'git add --patch' untuk menyertakan file baru?

104

Saat saya menjalankan git add -p, apakah ada cara bagi git untuk memilih file yang baru dibuat sebagai hunks untuk dipilih ??

Jadi jika saya membuat file baru bernama foo.java, lalu menjalankan git add -p, git tidak akan mengizinkan saya memilih konten file tersebut untuk ditambahkan ke indeks.

Alexander Bird
sumber

Jawaban:

77

Untuk melakukan ini dengan setiap file baru, Anda dapat menjalankan:

git add -N .
git add -p

Jika Anda ingin sering menggunakannya, Anda dapat membuat alias di ~/.bashrc:

alias gapan='git add --intent-to-add . && git add --patch'

NB : Jika Anda menggunakan ini dengan file baru yang kosong, git tidak akan dapat menambalnya dan melompat ke file berikutnya.

Ulysse BN
sumber
13
Bagi siapa pun yang bertanya-tanya apa yang git add -Ndilakukannya, itu hanya menambahkan file tertentu yang tidak terlacak ke indeks, tetapi tanpa konten.
Odin
112

Ketika saya mencoba git add -p someNewFile.txtfile baru (file yang tidak terlacak), git hanya akan menampilkan No changes.dan berhenti. Saya harus memberi tahu git bahwa saya bermaksud melacak file baru terlebih dahulu.

git add -N someNewFile.txt
git add -p

Namun, karena file tersebut tidak terlacak, itu akan muncul sebagai satu bongkahan raksasa yang tidak dapat dipisahkan (karena semuanya baru!). Jadi, kemudian saya perlu mengedit bingkah menjadi potongan-potongan yang lebih kecil. Jika Anda tidak terbiasa dengan itu, lihat referensi ini untuk memulai.

Perbarui - Info pengeditan barang Saya ingin memperbarui ini jika referensi di atas hilang. Karena file baru tidak terlacak, git add -pakan menampilkan setiap baris dalam file sebagai baris baru dalam satu potongan. Ini kemudian akan menanyakan Anda apa yang ingin Anda lakukan dengan cowok itu, memberi Anda prompt berikut:

Stage this hunk [y,n,q,a,d,/,e,?]?

Dengan asumsi bahwa Anda tidak ingin mengkomit seluruh bingkah (dan dengan demikian, seluruh file; karena saya tidak yakin mengapa Anda ingin menggunakan git add -pdalam kasus itu?), Anda akan ingin menentukan opsi euntuk memberi tahu git bahwa Anda ingin mengedit cowok itu.

Setelah Anda memberi tahu git bahwa Anda ingin mengedit hunk, Anda harus ditempatkan di editor pilihan Anda sehingga Anda dapat membuat perubahan. Semua baris harus diawali dengan a +dan git memiliki beberapa komentar penjelasan (diawali dengan a #) di akhir file. Cukup hapus baris yang tidak Anda inginkan di komit awal file Anda. Kemudian simpan dan keluar dari editor.

Penjelasan Git tentang opsi git's hunk:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
CatShoes
sumber
1
Tolong seseorang menjawab ini secara ringkas.
Inanc Gumus
5
Singkatnya, git add -N someNewFile.txtdiikuti olehgit add -p
CatShoes
7

git add -p benar-benar tentang menambahkan perubahan ke file yang sudah dilacak.

Perintah untuk memilih file secara interaktif untuk ditambahkan adalah git add -i. Sebagai contoh:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(Perintah sebenarnya memiliki warna yang tidak bisa saya potong-dan-tempel di sini, jadi lebih bagus daripada yang terlihat)

Sebenarnya, perintah p atch dari git add -imelakukan hal yang sama git add -p, jadi yang kedua adalah bagian dari yang pertama (walaupun saya akui saya mencintai add -pdan membenci add -idiri saya sendiri!).

Matthieu Moy
sumber
"Saya akui, saya suka menambahkan -p dan benci menambahkan -i sendiri!" Inilah mengapa git add then patch adalah solusi yang saya suka: Ini masih memungkinkan Anda untuk memeriksa konten file baru yang Anda tambahkan (karena Anda membandingkannya dengan versi kosongnya), dan menambal file yang telah Anda edit!
Ulysse BN
Harap perbaiki saya jika saya salah, tetapi bahkan di sini dalam mode interaktif, tambalan masih akan menampilkan No changes.file baru. OP bertanya bagaimana cara menambahkan bongkahan dari file baru, bukan seluruh file. Saya yakin --intent-to-addmasih dibutuhkan di sini.
Jeff Puckett
add -psaja tidak akan berhasil, tetapi jawaban ini menyarankan add -i, mana yang berhasil.
Matthieu Moy
Saya upvoting karena saya tidak tahu tentang git add -i. Namun, Anda dapat melakukan hal yang sama secara non-interaktif git add -N.
Fisikawan Gila
5

Ada juga pendekatan yang sangat mirip dengan menggunakan --cachedbendera ...

1) Ubah perubahan tidak bertahap menjadi bertahap, sama seperti file yang Anda tambahkan.

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2) Lihat perbedaannya (catatan: Anda dapat menyertakan hasil edit dan file baru).

git diff --cached

3) Buat tambalan.

git diff --cached > my_patch_file.patch
doublejosh
sumber
Sayangnya itu tidak akan mencapai tujuan yang sama. Yang saya suka git add -padalah tidak menambahkan segalanya, tetapi mari saya pilih dan pilih apa yang ingin saya tambahkan. Solusi ini akan menambahkan segalanya secara membabi buta.
Alexander Bird
Anda bisa memilih apa yang Anda tambahkan! Saya akan memperbarui jawabannya.
doublejosh
1
terima kasih: semuanya: ini bekerja luar biasa untuk saya
macool