ฉันจะฟอร์แมตปะกับสิ่งที่ฉันซ่อนอยู่ได้อย่างไร


140

ในคอมไพล์ฉันซ่อนการเปลี่ยนแปลงของฉัน เป็นไปได้หรือไม่ที่ฉันจะสร้างแพตช์ด้วยสิ่งที่ฉันซ่อนเร้น? แล้วใช้ชุดข้อมูลแก้ไขนั้นในที่เก็บอื่น (เพื่อนร่วมงานของฉัน) บ้างไหม?

ฉันรู้git format-patch -1แต่ฉันคิดว่ามันเป็นสิ่งที่ฉันมุ่งมั่น แต่ฉันกำลังมองหาสิ่งเดียวกันสำหรับการเปลี่ยนแปลงที่ฉันเก็บไว้

และฉันจะใช้โปรแกรมแก้ไขในที่เก็บอื่นได้อย่างไร

คำตอบ:


156

แน่นอนว่าgit stash showรองรับสิ่งนี้:

git stash show -p

ดังนั้นใช้

git stash list

เพื่อหาจำนวนของที่เก็บที่คุณต้องการส่งออกเป็นแพตช์แล้ว

git stash show -p stash@{<number>} > <name>.patch

เพื่อส่งออก

ตัวอย่างเช่น:

git stash show -p stash@{3} > third_stash.patch

1
ฉันมีคำถามที่เกี่ยวข้องเกี่ยวกับการใช้โปรแกรมแก้ไข สมมติว่าโปรแกรมปะแก้ของฉันมีหลายไฟล์ มีวิธีใช้แพตช์ 'แบบโต้ตอบ' หรือไม่? เลือกไฟล์ของแพทช์ที่ฉันควรใช้กับตัวแก้ไข? ฉันจะทำสิ่งนั้นได้ไหม
silverburgh

1
@silverburgh: ฉันได้ดูอย่างรวดเร็วman patchและฉันไม่เห็นตัวเลือกใด ๆ สำหรับแอปพลิเคชันแพทช์แบบโต้ตอบ patchอย่างไรก็ตามเนื่องจากไฟล์แพทช์เป็นไฟล์ข้อความธรรมดาตัวเองมักจะสิ่งหนึ่งจะทำคือการแก้ไขแพทช์ในตัวแก้ไขข้อความคลิปออกชิ้นส่วนที่เกี่ยวข้องเพื่อนำไปใช้กับ อีกวิธีหนึ่งคือถ้าคุณกำลังใช้แพทช์ไปยังอีกพื้นที่เก็บข้อมูล Git คุณสามารถใช้มันทั้งหมดแล้วเลือกที่git checkoutไฟล์ที่คุณไม่ต้องการที่จะเปลี่ยนแปลง ( git checkoutที่มีชื่อไฟล์ที่พ่นออกไปเปลี่ยนแปลง unstaged)
Greg Hewgill

1
@Silverburgh คุณสามารถ จำกัด ชุดของไฟล์ที่ถูกปะแก้โดยใช้ "--exclude" และ "- รวม" params of git ที่ใช้
เคลวิน

@Silverburgh คุณสามารถทำสิ่งต่อไปนี้ได้ว่าคุณมีโปรแกรมปะแก้ ใช้แพทช์อย่างเต็มที่จากนั้นทำgit add --interactive ${YOUR_FILES}และมันจะทำให้คุณมีโอกาสที่จะกระทำบางส่วน
อเล็กซ์

15
ขอบคุณ สิ่งนี้ใช้ได้กับฉัน:git stash show -p stash@{1} > patch.txt
Ryan

63

คำตอบนี้ให้ข้อมูลเกี่ยวกับทั้งการบันทึกแพตช์และนำไปใช้ในตำแหน่งที่คุณต้องการใช้

หากต้องการซ่อนเอาต์พุตในไฟล์:

 git stash show -p --color=never > my-patch-name.patch

ตรวจสอบว่าแพทช์ดูดี:

git apply --stat my-patch-name.patch

ยืนยันว่าไม่มีข้อผิดพลาด:

git apply --check my-patch-name.patch

ใช้โปรแกรมปะแก้

git apply my-patch-name.patch

อันนี้ใช้ได้กับฉันด้วยไฟล์รหัสข้อความธรรมดา แต่ฉันต้องคำนึงถึงพื้นที่สีขาว ตรวจสอบว่า patch ดูดี: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch ใช้ patch: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland

คำอธิบายที่ดีและรัดกุม เพื่อให้สามารถใช้งานได้ฉันต้องอยู่ในราก repo เมื่อใช้แพทช์อื่น ๆgit applyก็ไม่ได้รับความแตกต่าง
สูงสุด

16

ใช้

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

เพื่อรับรายการสิ่งที่คุณเพิ่งเก็บไป Git สร้างวัตถุการกระทำเมื่อคุณซ่อน

พวกเขามุ่งมั่นเหมือนทุกสิ่งทุกอย่าง คุณสามารถตรวจสอบพวกเขาในสาขา:

$> git checkout -b with_stash stash@{0}

จากนั้นคุณสามารถเผยแพร่สาขานี้และเพื่อนร่วมงานของคุณสามารถผสานหรือเลือกเชอร์รี่ที่กระทำ


13

วิธีแก้ปัญหาข้างต้นจะไม่ทำงานสำหรับข้อมูลไบนารี เพิ่มการสนับสนุนต่อไปนี้สำหรับมัน:

git stash show stash@{0} -p --binary

แก้ไข

หมายเหตุ: ฉันแค่ต้องการเพิ่มความคิดเห็นในการตอบกลับข้างต้น แต่ชื่อเสียงของฉันไม่เพียงพอ


3

ฉันเชื่อว่านี่อาจเป็นหนึ่งใน udpates จาก Git เมื่อเร็ว ๆ นี้ คุณไม่ต้องแก้ไขการเปลี่ยนแปลงที่คุณเก็บไว้อีกต่อไป คุณสามารถใช้การเปลี่ยนแปลงที่เก็บไว้ในสาขาหนึ่งกับสาขาอื่น

พูดกับสาขา A ว่าคุณได้ทำการเปลี่ยนแปลงบางอย่างแล้วโดยเรียกว่า stash @ {1}

ตอนนี้คุณเปลี่ยนเป็นสาขา B. คุณทำได้:

$git stash apply stash@{1}

สิ่งนี้ใช้การเปลี่ยนแปลงสาขา A กับสาขา B

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