'git add --patch' เพื่อรวมไฟล์ใหม่?


105

เมื่อฉันรันgit add -pมีวิธีให้คอมไพล์เลือกไฟล์ที่สร้างขึ้นใหม่เป็น hunks เพื่อเลือกหรือไม่?

ดังนั้นถ้าฉันสร้างไฟล์ใหม่ชื่อfoo.javaแล้วเรียกใช้ git add -p git จะไม่ให้ฉันเลือกเนื้อหาของไฟล์นั้นที่จะเพิ่มลงในดัชนี

คำตอบ:


78

ในการดำเนินการกับไฟล์ใหม่ทุกไฟล์คุณสามารถเรียกใช้:

git add -N .
git add -p

หากคุณต้องการใช้บ่อยคุณสามารถสร้างนามแฝงใน~/.bashrc:

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

หมายเหตุ : หากคุณใช้สิ่งนี้กับไฟล์ใหม่ที่ว่างเปล่า git จะไม่สามารถแก้ไขได้และข้ามไปยังไฟล์ถัดไป


13
สำหรับใครก็ตามที่สงสัยว่าgit add -Nจะทำอย่างไรเพียงแค่เพิ่มไฟล์ที่ไม่ได้ติดตามที่ระบุลงในดัชนี แต่ไม่มีเนื้อหา
Odin

112

เมื่อฉันลองgit add -p someNewFile.txtไฟล์ใหม่ (ไฟล์ที่ไม่ได้ติดตาม) git ก็จะส่งออกNo changes.และหยุด ฉันต้องบอก git ว่าฉันตั้งใจจะติดตามไฟล์ใหม่ก่อน

git add -N someNewFile.txt
git add -p

อย่างไรก็ตามเนื่องจากไฟล์ไม่ได้รับการติดตามไฟล์จะแสดงเป็นก้อนใหญ่ขนาดยักษ์ที่ไม่สามารถแยกได้ (เพราะเป็นไฟล์ใหม่ทั้งหมด!) ดังนั้นฉันต้องแก้ไข hunk เป็นบิตเล็ก ๆ หากคุณไม่คุ้นเคยกับสิ่งนั้นให้ชำระเงินการอ้างอิงนี้เพื่อเริ่มต้น

อัปเดต - ข้อมูลการแก้ไข Hunk ฉันต้องการอัปเดตในกรณีที่ข้อมูลอ้างอิงข้างต้นหายไป เนื่องจากไฟล์ใหม่ไม่ถูกติดตามgit add -pจะแสดงทุกบรรทัดในไฟล์เป็นบรรทัดใหม่ในกลุ่มเดียว จากนั้นจะถามคุณว่าคุณต้องการทำอะไรกับก้อนนั้นโดยแจ้งให้คุณทราบต่อไปนี้:

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

สมมติว่าคุณไม่ต้องการผูกมัดทั้งไฟล์ (ดังนั้นทั้งไฟล์เพราะฉันไม่แน่ใจว่าทำไมคุณถึงต้องการใช้git add -pในกรณีนั้น?) คุณจะต้องระบุตัวเลือกeเพื่อบอกคอมไพล์ที่คุณต้องการแก้ไข ก้อนใหญ่

เมื่อคุณบอกคอมไพล์ว่าคุณต้องการแก้ไข hunk แล้วคุณควรเข้าสู่ตัวแก้ไขที่คุณเลือกเพื่อให้คุณสามารถทำการเปลี่ยนแปลงได้ ทุกบรรทัดควรขึ้นต้นด้วย a +และ git มีความคิดเห็นเชิงอธิบาย (นำหน้าด้วย a #) ที่ท้ายไฟล์ เพียงแค่ลบบรรทัดใด ๆ ที่คุณไม่ต้องการในการคอมมิตครั้งแรกของไฟล์ จากนั้นบันทึกและออกจากโปรแกรมแก้ไข

คำอธิบายของ Git เกี่ยวกับตัวเลือกก้อนใหญ่ของ git:

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

1
โปรดมีคนตอบโดยสรุปนี้
Inanc Gumus

5
สรุปแล้วgit add -N someNewFile.txtตามด้วยgit add -p
CatShoes

ดูเหมือนว่าใน git เวอร์ชันใหม่พฤติกรรมจะเปลี่ยนไป ไม่มีตัวเลือกในการแก้ไขก้อนปัจจุบันด้วยตนเอง
The.Wolfgang.Grimmer

7

git add -p เป็นเรื่องเกี่ยวกับการเพิ่มการเปลี่ยนแปลงในไฟล์ที่ติดตามแล้ว

git add -iคำสั่งการโต้ตอบเลือกไฟล์ที่จะเพิ่มเป็น ตัวอย่างเช่น:

$ 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

(คำสั่งจริงมีสีซึ่งฉันไม่สามารถตัดและวางที่นี่ได้ดังนั้นจึงดีกว่าที่คิด)

อันที่จริงคำสั่งp atch git add -iจะเหมือนกับgit add -pดังนั้นคำสั่งที่สองจึงเป็นส่วนย่อยของชุดแรก (แม้ว่าฉันจะยอมรับว่าฉันรักadd -pและเกลียดadd -iตัวเอง!)


"ฉันยอมรับว่าฉันรัก add -p และเกลียดแอด - ฉันเอง!" นี่คือเหตุผลที่การเพิ่มคอมไพล์แล้วแพตช์เป็นวิธีแก้ปัญหาที่ฉันชอบ: มันยังช่วยให้คุณตรวจสอบเนื้อหาของไฟล์ใหม่ที่คุณกำลังเพิ่ม (เนื่องจากคุณเปรียบเทียบกับเวอร์ชันที่ว่างเปล่า) และแก้ไขไฟล์ที่คุณแก้ไข!
Ulysse BN

โปรดแก้ไขฉันหากฉันผิด แต่ถึงแม้จะอยู่ในโหมดอินเทอร์แอกทีฟแพตช์จะยังคงแสดงผลNo changes.ในไฟล์ใหม่ OP กำลังถามวิธีเพิ่ม hunks จากไฟล์ใหม่ไม่ใช่ทั้งไฟล์ ฉันเชื่อว่า--intent-to-addยังคงต้องการที่นี่
Jeff Puckett

add -pเพียงอย่างเดียวจะไม่ได้ผล แต่คำตอบนี้แนะนำadd -iซึ่งทำได้
Matthieu Moy

ฉัน upvoting git add -iเพราะผมไม่ได้รู้เกี่ยวกับ อย่างไรก็ตามคุณสามารถทำสิ่งเดียวกันโดยไม่โต้ตอบgit add -Nได้
Mad Physicist

5

นอกจากนี้ยังมีวิธีการที่คล้ายกันมากในการใช้--cachedธง ...

1) เปลี่ยนการเปลี่ยนแปลงที่ไม่มีขั้นตอนของคุณให้เป็นแบบทีละขั้นเช่นเดียวกับไฟล์ที่คุณเพิ่ม

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

2) ดูความแตกต่าง (หมายเหตุ: คุณสามารถรวมทั้งการแก้ไขและไฟล์ใหม่)

git diff --cached

3) สร้างแพทช์

git diff --cached > my_patch_file.patch

น่าเสียดายที่ไม่บรรลุวัตถุประสงค์เดียวกัน สิ่งที่ฉันชอบgit add -pคือมันไม่ได้เพิ่มทุกอย่าง แต่ให้ฉันเลือกและเลือกสิ่งที่ฉันต้องการเพิ่ม วิธีนี้จะเพิ่มทุกอย่างสุ่มสี่สุ่มห้า
Alexander Bird

คุณสามารถเลือกสิ่งที่คุณเพิ่มได้! ฉันจะอัปเดตคำตอบ
doublejosh

1
ขอบคุณ: allthethings: สิ่งนี้ได้ผลสำหรับฉันอย่างน่าอัศจรรย์
macool

1

คำตอบของCatshoesได้แก่ :

เมื่อฉันลองgit add -p someNewFile.txtไฟล์ใหม่ (ไฟล์ที่ไม่ได้ติดตาม) git จะแสดงผลไม่มีการเปลี่ยนแปลง และหยุด
ฉันต้องบอก git ว่าฉันตั้งใจจะติดตามไฟล์ใหม่ก่อน

git add -N someNewFile.txt
git add -p

สิ่งนี้ควรเปลี่ยนเร็ว ๆ นี้ด้วย Git 2.29 (Q4 2020)

เวอร์ชันล่าสุดของ " git diff-files" ( man )แสดงความแตกต่างระหว่างดัชนีและโครงสร้างการทำงานสำหรับเส้นทาง "จุดประสงค์เพื่อเพิ่ม" เป็นแพตช์ "ไฟล์ใหม่"
" git apply --cached" ( man )ควรจะสามารถใช้ " git diff-files" และควรทำหน้าที่เทียบเท่ากับ " git add" สำหรับพา ธ แต่คำสั่งนั้นล้มเหลวในการดำเนินการสำหรับเส้นทางดังกล่าว

ดูกระทำ 4c025c6 , กระทำ e3cc41b (8 สิงหาคม 2020) และกระทำ 7cfde3f (6 สิงหาคม 2020) โดยเรย์มอนด์อีพัสโก (juped )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ ca81676 , 17 สิงหาคม 2020)

apply: อนุญาตแพตช์ "ไฟล์ใหม่" ในรายการ ita

ช่วยเหลือโดย: Junio ​​C Hamano
ลงนามโดย: Raymond E. Pasco

diff-files เพิ่งเปลี่ยนเพื่อรักษาการเปลี่ยนแปลงเส้นทางที่มีเครื่องหมาย "เจตนาที่จะเพิ่ม" ในดัชนีเนื่องจากไฟล์ใหม่แตกต่างแทนที่จะแตกต่างจากหยดว่าง

อย่างไรก็ตามการapplyปฏิเสธที่จะใช้ไฟล์ใหม่จะแตกต่างจากรายการดัชนีที่มีอยู่ยกเว้นในกรณีของการเปลี่ยนชื่อ
สิ่งนี้ทำให้ " git add -p" ( man )ซึ่งใช้ Apply ล้มเหลวเมื่อพยายามจัดระยะ hunks จากไฟล์เมื่อมีการบันทึกเจตนาที่จะเพิ่ม

สิ่งนี้จะเปลี่ยนตรรกะในการcheck_to_create()ตรวจสอบว่ามีรายการอยู่แล้วในดัชนีหรือไม่ในสองวิธี:

  • อันดับแรกเราค้นหาเฉพาะรายการดัชนีเท่านั้นหากok_if_existsเป็นเท็จ
  • ประการที่สองเราตรวจสอบCE_INTENT_TO_ADDแฟล็กในรายการดัชนีใด ๆ ที่เราพบและอนุญาตให้ใช้เพื่อดำเนินการต่อหากมีการตั้งค่า

มีการอัปเดตเกี่ยวกับสิ่งนี้หรือไม่ ฉันใช้ git เวอร์ชัน 2.28.0 และใช้ไม่ได้กับgit add -N + git add -pการแก้ไข hunks ด้วยตนเอง
The.Wolfgang.Grimmer

1
@ The.Wolfgang.Grimmer ยังไม่: 2.29 จะออกในอีกไม่กี่สัปดาห์
VonC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.