ยอมรับเฉพาะส่วนหนึ่งของไฟล์ใน Git


2764

เมื่อฉันทำการเปลี่ยนแปลงไฟล์ใน Git ฉันจะยอมรับการเปลี่ยนแปลงบางอย่างได้อย่างไร

ตัวอย่างเช่นฉันจะส่ง 15 บรรทัดจาก 30 บรรทัดที่มีการเปลี่ยนแปลงในไฟล์ได้อย่างไร


3
ที่เกี่ยวข้องstackoverflow.com/q/34609924/52074 : ถ้าคุณต้องการที่จะแยกก้อนใหญ่ลง hunks ขนาดเล็ก
Trevor Boyd Smith

สรุป: ในแง่ของความสามารถ: git gui= git add -e> git add -i -p; git guiในแง่ของความสะดวกสบาย: git add -i -p> git add -e> ดังนั้น: เลือกgit guiเมื่อคุณเข้าถึง X. เลือกgit add -i -pสำหรับสิ่งที่ง่ายและเมื่อคุณไม่มีหรือต้องการใช้ X. git add -eสำหรับการจัดเตรียมที่ซับซ้อนโดยไม่ต้อง X
Penghe Geng

คำตอบ:


3687

คุณสามารถใช้git add --patch <filename>(หรือ-pสั้น ๆ ) และคอมไพล์จะเริ่มแบ่งไฟล์ของคุณเป็นสิ่งที่คิดว่าเป็น "hunks" ที่สมเหตุสมผล (บางส่วนของไฟล์) จากนั้นจะแจ้งให้คุณทราบคำถามนี้:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

นี่คือคำอธิบายของแต่ละตัวเลือก:

  • y เวทีก้อนใหญ่นี้สำหรับการกระทำต่อไป
  • n อย่าทำสเตจขนาดใหญ่นี้สำหรับการส่งครั้งต่อไป
  • qเลิก; อย่าทำสเตจขนาดใหญ่นี้หรือการล่าสัตว์ใด ๆ ที่เหลืออยู่
  • a เวทีก้อนใหญ่นี้และทั้งหมดในภายหลัง hunks ในไฟล์
  • d อย่าทำสเตจขนาดใหญ่นี้หรือการล่าในภายหลังในไฟล์
  • g เลือกก้อนใหญ่เพื่อไปที่
  • / ค้นหาก้อนใหญ่ที่ตรงกับ regex ที่กำหนด
  • j ปล่อยให้ไม่แน่ใจก้อนใหญ่นี้ดูก้อนใหญ่ที่ไม่ลังเลต่อไป
  • J ทิ้งก้อนใหญ่ทิ้งไว้ดูก้อนใหญ่ก้อนต่อไป
  • k ออกจากก้อนใหญ่ลังเลนี้ดูก้อนใหญ่ลังเลก่อนหน้า
  • K ทิ้งก้อนใหญ่ทิ้งไว้ดูก้อนใหญ่ก่อนหน้า
  • s แยกก้อนใหญ่ปัจจุบันเป็นก้อนเล็ก ๆ
  • e แก้ไขก้อนใหญ่ปัจจุบันด้วยตนเอง
  • ? พิมพ์ช่วยเหลือก้อนใหญ่

หากไฟล์ไม่ได้อยู่ในพื้นที่เก็บข้อมูลคุณสามารถทำได้git add -N <filename>ก่อน git add -p <filename>หลังจากนั้นคุณสามารถไปกับ

หลังจากนั้นคุณสามารถใช้:

  • git diff --staged เพื่อตรวจสอบว่าคุณแสดงการเปลี่ยนแปลงที่ถูกต้อง
  • git reset -p เพื่อ unstage hunks เพิ่มผิดพลาด
  • git commit -v เพื่อดูการกระทำของคุณในขณะที่คุณแก้ไขข้อความการกระทำ

หมายเหตุนี่แตกต่างจากgit format-patchคำสั่งซึ่งมีวัตถุประสงค์เพื่อแยกวิเคราะห์ข้อมูลลงใน.patchไฟล์

การอ้างอิงสำหรับอนาคต: เครื่องมือ Git - การจัดเตรียมแบบโต้ตอบ


83
มันอาจจะมีประโยชน์ที่จะทราบว่า-p/--patchเป็นทางลัดไปยังการดำเนินการแพทช์ภายในเป็น-i/--interactiveคำสั่งที่บำเพ็ญประโยชน์โหมดโต้ตอบ
tutuDajuju

5
> จะเกิดอะไรขึ้นถ้าไฟล์นั้นได้รับการจัดฉากแล้ว? มันจะแสดงการเปลี่ยนแปลงที่ไม่จัดทำขึ้นเท่านั้น เช่นเดียวกับgit diffไม่
Eugen Konkov

3
ฉันจะแก้ไขก้อนใหญ่ปัจจุบันด้วยตนเองได้อย่างไร ฉันไม่รู้ว่าต้องทำอะไรหลังจากพิมพ์ e
Hunsu

23
หลังจากกดeคุณสามารถแก้ไขก้อนใหญ่ได้ด้วยตนเองโดยแทนที่+หรือ-โดย#
veksen

1
มันเยี่ยมมาก แต่ตอนนี้ฉันจะผลักมันได้อย่างไร ถ้าฉันทำgit pushมันบอกว่าทันสมัยแล้ว และถ้าฉันgit diffฉันเห็น hunks ฉันพูดnกับ ถ้าฉันgit diff --stagedฉันเห็นความมุ่งมั่นที่ฉันต้องการที่จะผลักดัน สมมติว่าฉันสามารถส่งความมุ่งมั่นฉันจะลบ hunks ที่ฉันพูดได้noอย่างไร
chovy

250

คุณสามารถใช้git add --interactiveหรือจากนั้น( ไม่ ); ดูโหมดการโต้ตอบในgit-add manpage หรือเพียงทำตามคำแนะนำgit add -p <file>git commit git commit -a

Modern Git ยังมีgit commit --interactive(และgit commit --patchซึ่งเป็นทางลัดไปยังตัวเลือกการแก้ไขในการโต้ตอบแบบโต้ตอบ)

หากคุณชอบทำมันออกมาจาก GUI คุณสามารถใช้คอมไพล์-GUI คุณสามารถทำเครื่องหมายชิ้นที่คุณต้องการรวมไว้ในคอมมิชชัน git add -iผมเองพบว่ามันง่ายกว่าการใช้ GUI git อื่น ๆ เช่น QGit หรือ GitX อาจมีฟังก์ชั่นนี้เช่นกัน


1
ที่น่าสนใจ windows.github.com สนับสนุนมีการคอมไฟล์บางส่วน แต่ดูเหมือนว่าจะมีการปรับตัวลดลงเมื่อเร็ว ๆ นี้ ..
Juri

1
@Juri ฉันคิดว่าการสนับสนุนไฟล์ที่คอมมิทบางส่วนกลับมาแล้ว
Ela782

@Juri ยินดีต้อนรับ จริง ๆ แล้วฉันไม่เคยสังเกตเห็นว่ามันเคยมีมาก่อน - ฉันเห็นมันเมื่อสัปดาห์ที่แล้วและคิดว่า "โอ้เป็นคุณลักษณะใหม่ที่น่าทึ่ง"! :-)
Ela782

1
ทุกวันนี้ windows.github.com เปลี่ยนเส้นทางไปยัง GitHub Desktop ที่เปลี่ยนโฉมใหม่ซึ่งดีกว่า Git GUI และรองรับการคอมมิทบางส่วน ... แต่ไม่รองรับการเซ็นสัญญา ถอนหายใจ

147

git guiมีฟังก์ชันนี้ภายใต้มุมมอง diff เพียงคลิกขวาที่บรรทัดที่คุณสนใจและคุณจะเห็นรายการเมนู "จัดลำดับบรรทัดนี้เพื่อส่ง"


13
สำหรับการแก้ไขที่ซับซ้อนนี้มักจะเป็นวิธีที่เร็วที่สุดสำหรับฉัน
hochl

7
นี่เป็นวิธีที่มีประสิทธิภาพและใช้งานง่ายมากในการเพิ่มการเปลี่ยนแปลงไปยังพื้นที่จัดแสดงในลักษณะที่ละเอียด สามารถเลือกได้หลายบรรทัดและการเปลี่ยนแปลงทั้งหมดภายในการเลือกนั้นจะถูกเพิ่มเข้าไป
jox

โปรดทราบว่านี่ไม่ใช่gitkแต่รวมอยู่ใน Git Bash สำหรับ Windows git guiคุณควรจะมีรายการเมนูเริ่มต้นสำหรับมันหรือสามารถเริ่มต้นด้วยคำสั่ง นอกจากนี้ยังมีที่น่าจะเป็นประโยชน์มากกว่าstage this hunk stage this lineอาจจะใหม่เนื่องจากคำตอบนี้สร้างเมื่อ 10 ปีที่แล้ว
Chris

82

ฉันเชื่อว่าgit add -e myfileเป็นวิธีที่ง่ายที่สุด (อย่างน้อยฉันชอบ) เนื่องจากมันเป็นเพียงแค่เปิดโปรแกรมแก้ไขข้อความและให้คุณเลือกบรรทัดที่คุณต้องการให้เวทีและบรรทัดที่คุณไม่ต้องการ เกี่ยวกับคำสั่งแก้ไข:

เพิ่มเนื้อหา:

เนื้อหาที่เพิ่มเข้ามาจะถูกแทนด้วยบรรทัดที่ขึ้นต้นด้วย "+" คุณสามารถป้องกันการแสดงละครบรรทัดการเพิ่มใด ๆ โดยการลบพวกเขา

ลบเนื้อหา:

เนื้อหาที่ถูกลบถูกแสดงโดยบรรทัดที่ขึ้นต้นด้วย "-" คุณสามารถป้องกันการแสดงละครเป็นการลบโดยแปลง "-" เป็น "" (ช่องว่าง)

เนื้อหาที่แก้ไข:

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

ทุกรายละเอียดเกี่ยวกับgit addมีอยู่ในgit --help add


7
สิ่งนี้จะมีประโยชน์มากขึ้นถ้ามีคำอธิบายที่ชัดเจนว่าจะเลือกบรรทัดเหล่านั้นอย่างไร (เช่นคำสั่งจริงที่จะป้อน) ฉันหาไม่พบในเอกสาร คุณสามารถเพิ่มการอ้างอิงได้หรือไม่?
อเล็กซ์

4
สำหรับผู้ที่ไม่ชอบตัวเลือกชวเลขเป็น-e --edit
Kolyunya

2
@Alex คำพูดอ้างอิงเพิ่มโดย theFreedomBanana มาจากส่วนแก้ไขแพทช์ในgit --help add
Randall

8
นี่เป็นคำตอบเดียว (ต้องใช้คอมไพล์เท่านั้น) ที่แก้ปัญหาการเพิ่ม / ลบบรรทัดที่ฉลาดเมื่อคุณไม่สามารถทำให้การล่าสัตว์เล็กลงด้วยsในโหมดแพทช์แบบโต้ตอบ
cdosborn

3
การเข้าใจว่าคำสั่งนี้ ( git add -e) * ไม่ได้เปลี่ยนเนื้อหาไฟล์ในดิสก์ มันเพิ่งย้ายส่วนหนึ่งของการเปลี่ยนแปลงจาก unstaged ไปยัง staged (ดัชนี)
Penghe Geng

44

หากคุณกำลังใช้เสียงเรียกเข้าคุณอาจต้องการที่จะลองปลั๊กอินที่ดีที่เรียกว่าผู้ลี้ภัย

คุณสามารถเห็นความแตกต่างของไฟล์ระหว่างการคัดลอกและดัชนีที่ใช้:Gdiffงานได้จากนั้นเพิ่มบรรทัดหรือ hunks ให้กับดัชนีโดยใช้คำสั่ง vim diff แบบdpดั้งเดิมเช่น บันทึกการแก้ไขในดัชนีและกระทำด้วย:Gcommitและคุณทำเสร็จแล้ว

screencasts เบื้องต้นที่ดีมากที่นี่ (ดู esp. ตอนที่ 2 )


ขอบคุณมากสำหรับลิงค์นี้ เหมือนกับสิ่งที่ฉันต้องการ โดยเฉพาะอย่างยิ่ง:diffget/:diffputในโหมดภาพซึ่งฉันสามารถเลือกบรรทัดที่เฉพาะเจาะจงซึ่งฉันต้องการรีเซ็ต / กระทำ ดังนั้นโปรดตรวจสอบอีกครั้ง: เสียงเรียกเข้าที่ยอดเยี่ยม
goodniceweb

30

ฉันขอแนะนำอย่างยิ่งให้ใช้SourceTreeจาก Atlassian (ฟรี) ทำให้เรื่องนี้น่ารำคาญ คุณสามารถจัดลำดับโค้ดแต่ละอันหรือแต่ละบรรทัดอย่างรวดเร็วและง่ายดาย

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันยอมรับว่า SourceTree เป็นเครื่องมือที่ดีสำหรับวัตถุประสงค์นี้เพราะให้การควบคุมที่ละเอียดยิ่งกว่าสิ่งที่เป็นไปได้ผ่านบรรทัดคำสั่ง

18
@ คัพเค้กฉันจะโต้แย้งตรงข้ามเห็นว่า SourceTree อาจใช้บรรทัดคำสั่งคอมไพล์ปฏิบัติการเหล่านั้นโดยเนื้อแท้มันจะเป็นไปได้ที่จะทำเช่นเดียวกัน (หรือมากกว่า) การกระทำที่ละเอียดผ่านทาง "บรรทัดคำสั่ง"
tutuDajuju

2
โดยไม่คำนึงถึงข้อโต้แย้งที่ละเอียดฉันขอแนะนำSourceTreeเนื่องจากการล่าสัตว์การแสดงละครและแต่ละบรรทัดนั้นง่ายมาก: i.imgur.com/85bNu4C.png
Mars Robertson

1
@tutuDajuju ในกรณีนี้ฉันไม่แน่ใจว่าเป็นเรื่องจริง SourceTree มีความสามารถในการเลือกสิ่งที่บางส่วนไปยังขั้นตอนทีละบรรทัด คุณไม่ต้องทำฉากใหญ่ทั้งหมด คุณสามารถสเตจ 2 บรรทัดกลางก้อนใหญ่ ฉันไม่รู้เลยว่ามันจะประสบความสำเร็จได้อย่างไร (ในขณะนี้ฉันพยายามที่จะแก้ไข SourceTree ที่ไม่สามารถจัดลำดับบรรทัดเฉพาะสำหรับไฟล์ที่ไม่ได้ติดตามได้ฉันลงจอดที่นี่เพื่อหาวิธีแก้ปัญหาเท่านั้นเพื่อค้นหาว่า git ดูเหมือนจะไม่สามารถเสนอความสามารถแบบบรรทัดต่อบรรทัดได้ อย่างน้อยก็ไม่ได้ตรงไปตรงมา)
jpmc26

1
@ ซันคุณสามารถคลิกที่บรรทัดที่ 50 และกด + คลิกบรรทัดที่ 100 จากนั้นสเตจ คุณสามารถแสดงละคร 50-100 บรรทัดใน Sourcetree :)
ryan123

26

ที่น่าสังเกตว่าในการใช้งานgit add --patchสำหรับไฟล์ใหม่ที่คุณต้องแรกเพิ่มไฟล์ในดัชนีด้วยgit add --intent-to-add:

git add -N file
git add -p file

23

เมื่อฉันมีการเปลี่ยนแปลงจำนวนมากและจะจบลงด้วยการสร้างความมุ่งมั่นสองสามข้อจากการเปลี่ยนแปลงดังนั้นฉันจึงต้องการบันทึกจุดเริ่มต้นชั่วคราวก่อนที่จะทำการแสดง

แบบนี้:

$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop

คำตอบของ Whymarrh คือสิ่งที่ฉันมักจะทำยกเว้นบางครั้งมีการเปลี่ยนแปลงมากมายและฉันสามารถบอกได้ว่าฉันอาจทำผิดพลาดในขณะที่จัดเตรียมสิ่งต่าง ๆ และฉันต้องการสถานะที่มุ่งมั่นที่ฉันสามารถถอยกลับได้


12

หากคุณใช้ emacs ให้ดูที่Magitซึ่งมีอินเตอร์เฟส git สำหรับ emacs มันรองรับการแสดงละคร (บางส่วนของไฟล์) ได้ค่อนข้างดี


ฉันมักจะเดินทางข้ามคำสั่ง git ที่ต้องการเปิดตัวแก้ไขเมื่อฉันเรียกใช้จากหน้าต่าง Mx shell magit สกัดกั้นความบ้าคลั่งนั้นและเปิดบัฟเฟอร์ใหม่สำหรับสิ่งนั้นหรือไม่? (โปรดไม่มีคำแนะนำ background-emacs-daemon; ขอบคุณอยู่ดี แต่ชีวิตมันสั้นเกินไป)
user2066657

ไม่เท่าที่ฉันสามารถบอกได้ว่ามันไม่ได้ขัดขวางสิ่งนี้ แต่ไม่เพียง แต่ใช้คำของฉันเพราะ (1) ฉันแทบจะไม่เคยใช้เชลล์หน้าต่างใน Emacs และ (2) โดยปกติฉันใช้ emacsclient ต้องบอกว่าถ้า emacsclient เป็นตัวเลือกสำหรับคุณอย่างน้อยก็ป้องกันไม่ให้เปิดหน้าต่างเพิ่มเติมด้วย emacs และบัฟเฟอร์ "COMMIT_EDITMSG" ถูกเปิดในหน้าต่าง Emacs ที่มีอยู่ของฉัน
Mark van Lent

10

Intellij IDEA (และฉันเดาว่าผลิตภัณฑ์อื่น ๆ ทั้งหมดของซีรี่ส์) ได้รับการสนับสนุนในบางส่วนตั้งแต่ v2018.1

ป้อนคำอธิบายรูปภาพที่นี่


9

สำหรับผู้ที่ใช้Git Extensions :

ในหน้าต่าง Commit ให้เลือกไฟล์ที่คุณต้องการคอมมิตบางส่วนจากนั้นเลือกข้อความที่คุณต้องการคอมมิทในบานหน้าต่างด้านขวาจากนั้นคลิกขวาที่ตัวเลือกและเลือก 'เลือกเส้นที่เลือก' จากเมนูบริบท


2
แป้นพิมพ์ลัดใน Git Extensions สำหรับ 'เลือกเส้นขั้นตอน' คือs- มีประโยชน์อย่างมากสำหรับการจัดเตรียมส่วนของไฟล์เพื่อทำการคอมมิท
Alchemistmatt

8

เหมือนคำตอบของ jdsumsion คุณยังสามารถซ่อนงานปัจจุบันของคุณ แต่จากนั้นใช้ difftool เช่น meld เพื่อดึงการเปลี่ยนแปลงที่เลือกจากที่เก็บ วิธีนี้คุณสามารถแก้ไขการล่าสัตว์ด้วยตนเองได้อย่างง่ายดายซึ่งเป็นเรื่องที่เจ็บปวดเมื่ออยู่ในgit add -p:

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

การใช้วิธีการซ่อนจะช่วยให้คุณมีโอกาสทดสอบว่ารหัสของคุณยังใช้งานได้หรือไม่ก่อนที่จะส่งมอบ


มันใช้งานได้ดี แต่ถ้าคุณใช้git commit --amendดูเหมือนว่าคุณจะไม่สามารถซ่อนเงินหลังจากนั้นหรือมีวิธีการทำเช่นนี้?
ทำเครื่องหมาย

7

การเพิ่มคำตอบก่อนหน้านี้หากคุณต้องการใช้บรรทัดคำสั่งการป้อนgit add -e myfileจะให้ตัวเลือกในการเลือกบรรทัดต่อบรรทัดสิ่งที่คุณต้องการยอมรับเนื่องจากคำสั่งนี้จะเปิดตัวแก้ไขที่มีความแตกต่างดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่คุณอาจรู้จักบรรทัดที่ขึ้นต้นด้วย+addtions, บรรทัดที่เริ่มต้นด้วย-การลบ ดังนั้น:

  • หากไม่ต้องการทำการเพิ่มให้ลบบรรทัดนั้น
  • เพื่อไม่ให้เวทีการลบเพียงแค่เปลี่ยนที่มีพื้นที่-

นี่คือสิ่งที่git add -hกล่าวเกี่ยวกับการเพิ่มไฟล์ด้วยวิธีนี้ (การแพตช์ไฟล์):

เนื้อหาที่เพิ่มเนื้อหาที่ เพิ่มจะแสดงเป็นบรรทัดที่ขึ้นต้นด้วย "+" คุณสามารถป้องกันการจัดเตรียมบรรทัดการเพิ่มใด ๆ โดยการลบ

เนื้อหาที่ ถูกลบ: เนื้อหาที่ถูกลบถูกแสดงโดยบรรทัดที่ขึ้นต้นด้วย "-" คุณสามารถป้องกันการลบการแสดงชั่วคราวโดยการแปลง "-" เป็น "" (ช่องว่าง)

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

ข้อควรระวัง:อย่าเปลี่ยนเนื้อหาของไฟล์นี่เป็นจุดที่ไม่ควรทำ เพียงแค่เปลี่ยนตัวดำเนินการของบรรทัดที่ถูกลบหรือเพิ่ม


คำตอบก่อนหน้าคืออะไร คำตอบจะถูกจัดเก็บตามจำนวนคะแนนที่มี ดังนั้นคำตอบของคุณจึงแตกต่างจากตอนที่คุณเขียนเมื่อเทียบกับคำตอบอื่น ๆ
KulaGGin

ฉันเชื่อว่าคำตอบที่อ้างอิงมาจาก @theFreedomBanana
K. สัญลักษณ์

6

ปลั๊กอินvim-gitgutterสามารถจัดการ hunks โดยไม่ต้องใช้เครื่องมือแก้ไข vim

:GitGutterStageHunk

นอกจากนี้ยังมีคุณสมบัติเจ๋ง ๆ อื่น ๆ เช่นคอลัมน์สัญญาณต่าง ๆ ใน IDE ที่ทันสมัยบางตัว

หากเพียงส่วนหนึ่งของก้อนใหญ่ควรจัดฉากผู้ลี้ภัย

:Gdiff

อนุญาตให้เลือกช่วงที่มองเห็นได้แล้ว:'<,'>diffputหรือ:'<,'>diffgetเปลี่ยนสถานะ / ย้อนกลับแต่ละบรรทัด



4

ด้วย TortoiseGit:

Context Menu → Restore after commitคลิกขวาที่ไฟล์และการใช้ สิ่งนี้จะสร้างสำเนาของไฟล์เหมือนเดิม จากนั้นคุณสามารถแก้ไขไฟล์เช่นใน TortoiseGitMerge และเลิกทำการเปลี่ยนแปลงทั้งหมดที่คุณไม่ต้องการส่ง หลังจากบันทึกการเปลี่ยนแปลงเหล่านั้นคุณสามารถส่งไฟล์ได้


4

10 ปีแล้วที่คำถามนี้ถูกถาม และฉันหวังว่าคำตอบนี้จะเป็นประโยชน์กับใครบางคน ดังที่ได้กล่าวไว้ในคำตอบที่นี่ที่ GUI ไม่ได้เป็นตัวเลือกส่วนขยาย crecordของAndrew Shaduraช่วยนำหน้าต่าง ncurses ซึ่งเราสามารถเลือกบรรทัดที่จะคอมมิท

ตั้งค่าส่วนขยายดังนี้:

git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord

cd ไปยัง repo git ของคุณและเรียกใช้ดังนี้:

git crecord

สิ่งนี้จะแสดงอินเตอร์เฟส ncurses ซึ่งสามารถใช้งานได้ดังแสดงด้านล่าง การกดปุ่มต่อไปนี้ในหน้าต่าง ncurses จะทำการกระทำบางอย่าง:

f       hunk toggle fold (arrow keys can also be used)
space   toggle hunk selection
a       toggle commit or amend
c       confirm and open commit window

Screencast แสดงการใช้งานตัวอย่างตัวอย่าง


3

สำหรับAtomผู้ใช้แพคเกจGitHubgit guiรวมถึงการแสดงละครโต้ตอบในรูปแบบของ สำหรับทางลัดดูแพคเกจของเอกสาร

การใช้ Atom ช่วยให้การทำงานกับชุดรูปแบบที่มีพื้นหลังสีเข้ม (โดยค่าเริ่มต้นgit guiมีพื้นหลังสีขาว)



2

git-meld-index - ข้อความจากเว็บไซต์:

git-meld-index ทำงาน meld - หรือ git difftool อื่น ๆ (kdiff3, diffuse, อื่น ๆ ) - เพื่อให้คุณทำการสเตจแบบโต้ตอบกับการเปลี่ยนแปลงดัชนี git (หรือเรียกอีกอย่างว่าพื้นที่ git staging)

ซึ่งคล้ายกับการทำงานของ git add -p และ git add - แบบโต้ตอบ ในบางกรณี meld นั้นง่ายกว่า / เร็วกว่าการใช้ git add -p นั่นเป็นเพราะ meld อนุญาตให้คุณตัวอย่างเช่นไปที่:

  • ดูบริบทเพิ่มเติม
  • เห็นความแตกต่างภายในบรรทัด
  • แก้ไขด้วยมือและดูการอัปเดต diff แบบสด (อัปเดตทุกครั้งหลังจากกดปุ่ม)
  • นำทางไปสู่การเปลี่ยนแปลงโดยไม่พูด 'n' กับการเปลี่ยนแปลงทุกอย่างที่คุณต้องการข้าม

การใช้

ในที่เก็บ git ให้รัน:

git meld-index

คุณจะเห็น Meld (หรือ Git difftool ที่กำหนดค่าไว้) ปรากฏขึ้นพร้อมกับ:

ซ้าย : คัดลอกไฟล์ต่อจากไดเรกทอรีทำงานชั่วคราวของคุณ

RIGHT : ไดเร็กทอรีชั่วคราวพร้อมเนื้อหาของดัชนี ซึ่งรวมถึงไฟล์ที่ยังไม่ได้อยู่ในดัชนี แต่มีการแก้ไขหรือไม่ได้ติดตามในสำเนาการทำงาน - ในกรณีนี้คุณจะเห็นเนื้อหาไฟล์จาก HEAD

แก้ไขดัชนี (ด้านขวา) จนกว่าจะมีความสุข อย่าลืมบันทึกเมื่อจำเป็น

เมื่อเสร็จแล้วให้ปิด meld และ git-meld-index จะอัปเดตดัชนีให้ตรงกับเนื้อหาของไดเรกทอรีชั่วคราวทางด้านขวามือของ meld ที่คุณเพิ่งแก้ไข


2

ถ้าอยู่บนWindowsแพลตฟอร์มฉันคิดว่าgit guiเป็นเครื่องมือที่ดีมากในการstage/ commitไม่กี่บรรทัดจากunstagedไฟล์

1. ก้อนใหญ่ฉลาด:

  • เลือกไฟล์จากunstagged Changesส่วน
  • คลิกขวาที่โค้ดขนาดใหญ่ซึ่งจำเป็นต้องจัดฉาก
  • เลือก Stage Hunk for commit

2. สายฉลาด:

  • เลือกไฟล์จากunstagged Changesส่วน
  • เลือกบรรทัด / บรรทัดที่จะจัดฉาก
  • คลิกขวาและเลือก Stage Lines for commit

3. ถ้าคุณต้องการจัดไฟล์ที่สมบูรณ์ยกเว้นสองสามบรรทัด:

  • เลือกไฟล์จากunstagged Changesส่วน
  • กด Ctrl+T (Stage file to commit)
  • ไฟล์ที่เลือกจะย้ายไปที่Staged Changesส่วน
  • เลือกบรรทัด / เส้นที่ถูกจัดฉาก
  • คลิกขวาและเลือก UnStage Lines for commit

1

ในฐานะที่เป็นหนึ่งคำตอบข้างต้นแสดงว่าคุณสามารถใช้ git add --patch filename.txt

หรือแบบสั้น git add -p filename.txt

... แต่สำหรับไฟล์ที่มีอยู่แล้วในที่เก็บของคุณมีอยู่ในนั้นดีกว่ามากโดยใช้ --patch flag บนคำสั่ง commit โดยตรง (ถ้าคุณใช้ git เวอร์ชันที่เพียงพอล่าสุด): git commit --patch filename.txt

... หรืออีกแบบสั้น git commit -p filename.txt

... และจากนั้นใช้ปุ่มที่กล่าวถึง (y / n ฯลฯ ) สำหรับการเลือกบรรทัดที่จะรวมในการกระทำ


สิ่งใดที่ให้คุณมากกว่า " git add -p filename.txt" นอกเหนือจากที่ว่างน้อยลงสำหรับข้อผิดพลาด? หากคุณเลอะการเปลี่ยนแปลงไฟล์บางส่วนการเลิกทำการเพิ่มดีกว่าการเลิกคอมมิท
CTMacUser

ฉันไม่รู้ว่าทำไม แต่เมื่อฉันพูดว่า 'n' บรรทัดจะถูกรวม .... และเมื่อฉันพูดว่า 'y' ในก้อนที่ 2 มันก็จะถูกรวมด้วย
chovy

1

git-colaเป็น GUI ที่ยอดเยี่ยมและมีคุณสมบัตินี้ในตัว Sเพียงแค่เลือกเส้นที่ขึ้นมาบนเวทีและกด ถ้าไม่มีการเลือกก้อนใหญ่จะถูกจัดฉาก

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