เมื่อฉันรันgit add -p
มีวิธีให้คอมไพล์เลือกไฟล์ที่สร้างขึ้นใหม่เป็น hunks เพื่อเลือกหรือไม่?
ดังนั้นถ้าฉันสร้างไฟล์ใหม่ชื่อfoo.java
แล้วเรียกใช้ git add -p git จะไม่ให้ฉันเลือกเนื้อหาของไฟล์นั้นที่จะเพิ่มลงในดัชนี
เมื่อฉันรันgit add -p
มีวิธีให้คอมไพล์เลือกไฟล์ที่สร้างขึ้นใหม่เป็น hunks เพื่อเลือกหรือไม่?
ดังนั้นถ้าฉันสร้างไฟล์ใหม่ชื่อfoo.java
แล้วเรียกใช้ git add -p git จะไม่ให้ฉันเลือกเนื้อหาของไฟล์นั้นที่จะเพิ่มลงในดัชนี
คำตอบ:
ในการดำเนินการกับไฟล์ใหม่ทุกไฟล์คุณสามารถเรียกใช้:
git add -N .
git add -p
หากคุณต้องการใช้บ่อยคุณสามารถสร้างนามแฝงใน~/.bashrc
:
alias gapan='git add --intent-to-add . && git add --patch'
หมายเหตุ : หากคุณใช้สิ่งนี้กับไฟล์ใหม่ที่ว่างเปล่า git จะไม่สามารถแก้ไขได้และข้ามไปยังไฟล์ถัดไป
เมื่อฉันลอง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
git add -N someNewFile.txt
ตามด้วยgit add -p
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
ตัวเอง!)
No changes.
ในไฟล์ใหม่ OP กำลังถามวิธีเพิ่ม hunks จากไฟล์ใหม่ไม่ใช่ทั้งไฟล์ ฉันเชื่อว่า--intent-to-add
ยังคงต้องการที่นี่
add -p
เพียงอย่างเดียวจะไม่ได้ผล แต่คำตอบนี้แนะนำadd -i
ซึ่งทำได้
git add -i
เพราะผมไม่ได้รู้เกี่ยวกับ อย่างไรก็ตามคุณสามารถทำสิ่งเดียวกันโดยไม่โต้ตอบgit add -N
ได้
นอกจากนี้ยังมีวิธีการที่คล้ายกันมากในการใช้--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
คือมันไม่ได้เพิ่มทุกอย่าง แต่ให้ฉันเลือกและเลือกสิ่งที่ฉันต้องการเพิ่ม วิธีนี้จะเพิ่มทุกอย่างสุ่มสี่สุ่มห้า
คำตอบของ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 add -N + git add -p
การแก้ไข hunks ด้วยตนเอง
git add -N
จะทำอย่างไรเพียงแค่เพิ่มไฟล์ที่ไม่ได้ติดตามที่ระบุลงในดัชนี แต่ไม่มีเนื้อหา