การใช้งาน git reset - soft?


136

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

git commit --amendฉันเข้าใจว่าฉันสามารถใช้ซอฟต์รีเซ็ตเพื่อแก้ไขกระทำโดยไม่ต้องเปลี่ยนดัชนีหรือไดเรกทอรีการทำงานที่ผมจะมี

คำสั่งทั้งสองนี้เหมือนกันจริงหรือไม่( reset --softvs commit --amend)? เหตุผลใดที่จะใช้อย่างใดอย่างหนึ่งในทางปฏิบัติ? และที่สำคัญมีการใช้งานอื่น ๆreset --softนอกเหนือจากการแก้ไขข้อตกลงหรือไม่?

คำตอบ:


110

git resetคือทั้งหมดที่เกี่ยวกับการย้ายHEAD, และโดยทั่วไปสาขาเตะ
คำถาม: โครงสร้างและดัชนีการทำงานเป็นอย่างไร?
เมื่อการจ้างงานกับ--soft, การเคลื่อนไหวHEADHEADส่วนใหญ่มักจะอัปเดตเตะสาขาและมีเพียง
สิ่งนี้แตกต่างจากcommit --amend:

  • มันไม่ได้สร้างคอมมิตใหม่
  • มันสามารถย้าย HEAD ไปยังคอมมิตใด ๆ ได้ (เช่นcommit --amendเดียวกับการไม่ย้าย HEAD ในขณะที่อนุญาตให้ทำการคอมมิตปัจจุบันซ้ำ)

เพิ่งพบตัวอย่างของการรวม:

  • การผสานแบบคลาสสิก
  • การผสานทรีย่อย

ทั้งหมดเป็นหนึ่งเดียว (ปลาหมึกยักษ์เนื่องจากมีการรวมสาขามากกว่าสองสาขา) ทำการผสาน

Tomas "wereHamster" Carneckyอธิบายในบทความ "Subtree Octopus merge" :

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

ปัญหาคือคุณสามารถเลือกกลยุทธ์เดียวเท่านั้น แต่ฉันต้องการรวมทั้งสองเข้าด้วยกันเพื่อให้ได้ประวัติที่สะอาดซึ่งที่เก็บทั้งหมดได้รับการอัปเดตแบบอะตอมเป็นเวอร์ชันใหม่

ฉันมีซูเปอร์โปรเจ็กต์ขอเรียกมันว่าprojectAและโปรเจ็กต์ย่อยprojectBที่ฉันรวมเป็นไดเร็กทอรีย่อยของprojectA.

(นั่นคือส่วนที่ผสานทรีย่อย)

ฉันยังคงรักษาความมุ่งมั่นในท้องถิ่นไว้เล็กน้อย
ProjectAมีการปรับปรุงอย่างสม่ำเสมอมีรุ่นใหม่ทุกสองสามวันหรือสัปดาห์และมักจะขึ้นอยู่กับรุ่นเฉพาะของ projectBprojectA

เมื่อฉันตัดสินใจที่จะปรับปรุงโครงการทั้งสองผมไม่เพียงดึงจากprojectAและเป็นที่จะสร้างสองกระทำในสิ่งที่ควรจะมีการปรับปรุงอะตอมของโครงการทั้งหมดprojectB
แต่ฉันจะสร้างการผสานเดียวกระทำซึ่งรวมprojectA,projectBและกระทำท้องถิ่นของฉัน
ส่วนที่ยุ่งยากที่นี่เป็นที่นี่คือการผสานปลาหมึก (สามหัว) แต่projectBจะต้องมีการควบรวมกิจการกับกลยุทธ์ของทรีย่อย นี่คือสิ่งที่ฉันทำ:

# Merge projectA with the default strategy:
git merge projectA/master

# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master

ที่นี่ผู้เขียนใช้ a reset --hardและจากนั้นread-treeเพื่อเรียกคืนสิ่งที่การผสานสองครั้งแรกได้ทำกับแผนผังการทำงานและดัชนี แต่นั่นคือสิ่งที่reset --softสามารถช่วยได้:
ฉันจะทำซ้ำการผสานทั้งสองนี้ซึ่งได้ผลเช่นแผนผังการทำงานและดัชนีของฉันคือ สบายดี แต่ไม่ต้องบันทึกการกระทำทั้งสองนี้?

# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}

ตอนนี้เราสามารถดำเนินการแก้ปัญหาของ Tomas ต่อได้:

# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD

# And finally do the commit:
git commit

ดังนั้นทุกครั้ง:

  • คุณพอใจกับสิ่งที่คุณจบลง (ในแง่ของโครงสร้างการทำงานและดัชนี)
  • คุณไม่พอใจกับการกระทำทั้งหมดที่พาคุณไปที่นั่น:

git reset --soft คือคำตอบ


8
หมายเหตุถึงตัวเอง: ตัวอย่างง่ายๆของ squashing ด้วยgit reset --soft: stackoverflow.com/questions/6869705/…
VonC

3
นอกจากนี้ยังมีประโยชน์หากคุณทำผิดสาขา การเปลี่ยนแปลงทั้งหมดจะกลับไปที่พื้นที่จัดเตรียมและย้ายไปพร้อมกับคุณในขณะที่คุณชำระเงินในสาขาที่ถูกต้อง
smoebody

44

Use Case - รวมชุดของการกระทำในพื้นที่

"อ๊ะการกระทำทั้งสามอาจเป็นเพียงหนึ่งเดียว"

ดังนั้นให้ยกเลิกการคอมมิต 3 ครั้งสุดท้าย (หรืออะไรก็ตาม) (โดยไม่ส่งผลกระทบต่อดัชนีหรือไดเร็กทอรีการทำงาน) จากนั้นทำการเปลี่ยนแปลงทั้งหมดเป็นหนึ่งเดียว

เช่น

> git add -A; git commit -m "Start here."
> git add -A; git commit -m "One"
> git add -A; git commit -m "Two"
> git add -A' git commit -m "Three"
> git log --oneline --graph -4 --decorate

> * da883dc (HEAD, master) Three
> * 92d3eb7 Two
> * c6e82d3 One
> * e1e8042 Start here.

> git reset --soft HEAD~3
> git log --oneline --graph -1 --decorate

> * e1e8042 Start here.

ตอนนี้การเปลี่ยนแปลงทั้งหมดของคุณได้รับการเก็บรักษาและพร้อมที่จะมุ่งมั่นเป็นหนึ่งเดียว

คำตอบสั้น ๆ สำหรับคำถามของคุณ

คำสั่งทั้งสองนี้เหมือนกันจริงหรือไม่( reset --softvs commit --amend)?

  • เลขที่

เหตุผลใดที่จะใช้อย่างใดอย่างหนึ่งในทางปฏิบัติ?

  • commit --amend เพื่อเพิ่ม / rm ไฟล์จากการกระทำสุดท้ายหรือเพื่อเปลี่ยนข้อความ
  • reset --soft <commit> เพื่อรวมการคอมมิตตามลำดับหลายรายการเข้าด้วยกันใหม่

และที่สำคัญมีการใช้งานอื่น ๆreset --softนอกเหนือจากการแก้ไขข้อตกลงหรือไม่?

  • ดูคำตอบอื่น ๆ :)

2
ดูคำตอบอื่น ๆ สำหรับ "มีการใช้งานอื่นใดreset --softนอกเหนือจากการแก้ไขข้อตกลง - ไม่"
Antony Hatchkins

ในการตอบกลับความคิดเห็นล่าสุด - เห็นด้วยบางส่วน แต่ฉันขอบอกว่าการแก้ไขข้อตกลงเดียวนั้นเจาะจงเกินไป ตัวอย่างเช่นคุณอาจต้องการเมื่อเขียนคุณลักษณะแล้วให้บีบทุกอย่างและสร้างคำมั่นสัญญาใหม่ที่มีประโยชน์มากขึ้นสำหรับผู้ตรวจสอบ ฉันจะบอกว่าซอฟต์รีเซ็ต (รวมถึงแบบธรรมดาgit reset) นั้นดีเมื่อคุณ (ก) ต้องการเขียนประวัติศาสตร์ซ้ำ (ข) ไม่สนใจเกี่ยวกับข้อตกลงเก่า ๆ (ดังนั้นคุณสามารถหลีกเลี่ยงความยุ่งยากในการรีเบสแบบโต้ตอบ) และ (c) มีการเปลี่ยนแปลงมากกว่าหนึ่งข้อตกลง (มิฉะนั้นcommit --amendจะง่ายกว่า)
johncip

18

ฉันใช้มันเพื่อแก้ไขมากกว่าการคอมมิตสุดท้าย

สมมติว่าฉันทำผิดในการคอมมิต A แล้วทำการคอมมิต B ตอนนี้ฉันแก้ไขได้แค่ B ดังนั้นฉันทำgit reset --soft HEAD^^ฉันแก้ไขและคอมมิต A ใหม่แล้วจึงคอมมิต B อีกครั้ง

แน่นอนว่ามันไม่สะดวกสำหรับการคอมมิทจำนวนมาก… แต่คุณไม่ควรทำการคอมมิตจำนวนมากอยู่ดี ;-)


3
git commit --fixup HEAD^^ git rebase --autosquash HEAD~Xทำงานได้ดีเช่นกัน
Niklas

3
git rebase --interactive HEAD^^ที่คุณเลือกแก้ไขทั้งสองคอมมิต A และ B วิธีนี้จะเก็บข้อความคอมมิตของ A และ B ไว้หากจำเป็นคุณก็ยังสามารถแก้ไขได้เช่นกัน
Paul Pladijs

2
ฉันจะทำการคอมมิต B ซ้ำได้อย่างไรหลังจากรีเซ็ตเป็น A แล้ว?
northben

1
อีกวิธีหนึ่งที่อาจทำงานน้อยลง: ตรวจสอบบันทึกการคอมไพล์ของคุณได้รับกระทำกัญชาของ B แล้วให้และเพิ่มการเปลี่ยนแปลงgit reset A , git commit --amendgit cherry-pick <B-commit-hash>
naught101

15

การใช้งานที่เป็นไปได้อีกอย่างหนึ่งคือทางเลือกอื่นในการซ่อน (ซึ่งบางคนไม่ชอบดูเช่นhttps://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-consถือว่า-harmful / )

ตัวอย่างเช่นหากฉันทำงานในสาขาและต้องการแก้ไขบางอย่างอย่างเร่งด่วนในระดับปริญญาโทฉันสามารถทำได้:

git commit -am "In progress."

จากนั้นชำระเงินหลักและทำการแก้ไข เมื่อฉันทำเสร็จแล้วฉันก็กลับไปที่สาขาและทำ

git reset --soft HEAD~1

เพื่อทำงานต่อจากจุดที่ฉันค้างไว้


3
อัปเดต (ตอนนี้ฉันเข้าใจคอมไพล์ดีขึ้นแล้ว): --softไม่จำเป็นจริงๆที่นี่เว้นแต่คุณจะสนใจที่จะให้การเปลี่ยนแปลงถูกจัดฉากทันที ตอนนี้ฉันเพิ่งใช้git reset HEAD~เมื่อทำสิ่งนี้ ถ้ามีการเปลี่ยนแปลงบางอย่างฉากเมื่อฉันต้องสลับสาขาและต้องการที่จะให้มันเป็นอย่างนั้นแล้วฉันจะgit commit -m "staged changes"แล้วgit commit -am "unstaged changes"หลังจากนั้นgit reset HEAD~ตามด้วยgit reset --soft HEAD~ที่จะสมบูรณ์เรียกคืนการทำงานของรัฐ แม้ว่าตามจริงแล้วฉันทำทั้งสองสิ่งนี้น้อยลงมากในตอนนี้ที่ฉันรู้git-worktree:)
deltacrux

7

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

ดูคำตอบนี้โดย VonC สำหรับตัวอย่างที่ใช้ได้จริง: Squash สองข้อแรกกระทำใน Git?


นั่นเป็นคำถามที่ดีที่ฉันไม่เคยพบมาก่อน แต่ฉันไม่แน่ใจว่าฉันสามารถดูวิธีการเปลี่ยนแปลงในสาขาอื่นโดยใช้ซอฟต์รีเซ็ต ดังนั้นฉันมีสาขาการชำระเงินแล้วฉันใช้git reset --soft anotherBranchแล้วตกลงที่นั่น? แต่คุณไม่ได้เปลี่ยนสาขา ckeckout จริงๆดังนั้นคุณจะผูกมัดกับสาขาหรือสาขาอื่น ?
AJJ

เมื่อทำเช่นนี้สิ่งสำคัญคือคุณอย่าใช้ git checkout เพราะจะทำให้ต้นไม้ของคุณเปลี่ยนไป คิดว่าการรีเซ็ตคอมไพล์ - ซอฟต์เป็นวิธีจัดการกับการแก้ไข HEAD ชี้ไปที่
Johannes Rudolph

7

การใช้งานที่เป็นไปได้อย่างหนึ่งคือเมื่อคุณต้องการทำงานต่อในเครื่องอื่น มันจะทำงานดังนี้:

  1. ชำระเงินสาขาใหม่ที่มีชื่อเหมือนที่ซ่อน

    git checkout -b <branchname>_stash
    
  2. ดันสาขาที่เก็บของคุณขึ้น

    git push -u origin <branchname>_stash
    
  3. เปลี่ยนไปใช้เครื่องอื่นของคุณ

  4. ดึงทั้งที่เก็บของและกิ่งไม้ที่มีอยู่

    git checkout <branchname>_stash; git checkout <branchname>
    
  5. ตอนนี้คุณควรอยู่ในสาขาที่มีอยู่แล้ว รวมการเปลี่ยนแปลงจากสาขาที่เก็บไว้

    git merge <branchname>_stash
    
  6. ซอฟต์รีเซ็ตสาขาที่มีอยู่ของคุณเป็น 1 ก่อนที่คุณจะรวม

    git reset --soft HEAD^
    
  7. ลบสาขาที่เก็บของคุณ

    git branch -d <branchname>_stash
    
  8. ลบสาขาที่เก็บของคุณออกจากแหล่งกำเนิดด้วย

    git push origin :<branchname>_stash
    
  9. ดำเนินการกับการเปลี่ยนแปลงของคุณต่อไปราวกับว่าคุณเก็บไว้ตามปกติ

ฉันคิดว่าในอนาคต GitHub และ บริษัท ร่วม ควรนำเสนอฟังก์ชัน "ที่เก็บระยะไกล" นี้ในขั้นตอนน้อยลง


2
ฉันต้องการชี้ให้เห็นว่าการเก็บถาวรและป๊อปอัปครั้งแรกในเครื่องแรกของคุณไม่จำเป็นโดยสิ้นเชิงคุณสามารถสร้างสาขาใหม่ได้โดยตรงจากสำเนาการทำงานที่สกปรกคอมมิตจากนั้นกดการเปลี่ยนแปลงขึ้นไปที่รีโมท

7

การใช้งานจริงอย่างหนึ่งคือถ้าคุณได้มุ่งมั่นที่จะ repo ในเครื่องของคุณแล้ว (เช่น. คอมมิต -m) คุณสามารถย้อนกลับการกระทำครั้งสุดท้ายโดยทำการรีเซ็ตคอมไพล์ --soft HEAD ~ 1

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

สุดท้ายรีเซ็ตคอมไพล์ - ฮาร์ดเช็ดทุกอย่างรวมถึงการเปลี่ยนแปลงในเครื่องของคุณ ส่วนหัว ~ after จะบอกคุณว่าต้องไปจากด้านบนกี่ครั้ง


1
git reset --soft HEAD ~1ให้ฉันfatal: Cannot do soft reset with paths.ฉันคิดว่าเราต้องลบช่องว่างหลัง HEAD ดังนั้นมันจะเป็นgit reset --soft HEAD~1
Andrew Lohr

6

เหตุผลที่ดีในการใช้ " git reset --soft <sha1>" คือการย้ายไปHEADที่ repo แบบเปลือย

หากคุณพยายามใช้ตัวเลือก--mixedหรือ--hardคุณจะได้รับข้อผิดพลาดเนื่องจากคุณพยายามแก้ไขและทำงานโครงสร้างและ / หรือดัชนีที่ไม่มีอยู่

หมายเหตุ: คุณจะต้องดำเนินการนี้โดยตรงจาก repo เปล่า

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


1
ดังที่ได้กล่าวไว้ในคำตอบก่อนหน้าของคุณ ( stackoverflow.com/questions/4624881/… ) สิ่งนี้จะเป็นจริงเมื่อคุณมีสิทธิ์เข้าถึง repo เปล่าโดยตรง (ซึ่งคุณกล่าวถึงที่นี่) +1 แม้ว่า
VonC

@VonC ใช่ถูกต้องแน่นอนและขอบคุณที่เพิ่มหมายเหตุ! ฉันลืมที่จะเพิ่มไปเรื่อย ๆ เนื่องจากฉันสมมติว่าการรีเซ็ตเสร็จสิ้นโดยตรงจาก repo นอกจากนี้ฉันสมมติว่าสาขาที่บุคคลต้องการรีเซ็ตใน repo เปล่าเป็นสาขาที่ใช้งานอยู่ หากสาขาไม่ใช่สาขาที่ใช้งานอยู่จำเป็นต้องอัปเดตตามคำตอบของคุณ ( stackoverflow.com/questions/3301956/… ) เกี่ยวกับวิธีการอัปเดตสาขาที่ใช้งานอยู่สำหรับ repos เปล่า ฉันจะอัปเดตคำตอบพร้อมข้อมูลสาขาที่ใช้งานอยู่ด้วย ขอบคุณอีกครั้ง!!!
Hazok

2

SourceTree เป็น git GUI ซึ่งมีอินเทอร์เฟซที่ค่อนข้างสะดวกสำหรับการจัดเตรียมบิตที่คุณต้องการ ไม่มีสิ่งใดที่คล้ายคลึงกันจากระยะไกลสำหรับการแก้ไขปรับปรุงที่เหมาะสม

ดังนั้นจึงgit reset --soft HEAD~1มีประโยชน์มากกว่าcommit --amendในสถานการณ์นี้ ฉันสามารถยกเลิกการคอมมิตรับการเปลี่ยนแปลงทั้งหมดกลับเข้าไปในพื้นที่จัดเตรียมและดำเนินการปรับแต่งบิตที่จัดฉากโดยใช้ SourceTree

สำหรับฉันแล้วดูเหมือนว่าcommit --amendเป็นคำสั่งที่ซ้ำซ้อนมากกว่าของทั้งสอง แต่ git คือ git และไม่อายที่จะใช้คำสั่งที่คล้ายกันซึ่งทำสิ่งที่แตกต่างกันเล็กน้อย


1

ในขณะที่ฉันชอบคำตอบในชุดข้อความนี้ แต่ฉันใช้git reset --softเพื่อความแตกต่างเล็กน้อย แต่เป็นสถานการณ์ที่ใช้งานได้จริง

ฉันใช้ IDE สำหรับการพัฒนาซึ่งมีเครื่องมือที่แตกต่างที่ดีสำหรับการแสดงการเปลี่ยนแปลง (จัดฉากและไม่มีขั้นตอน) หลังจากการกระทำครั้งสุดท้ายของฉัน ตอนนี้งานส่วนใหญ่ของฉันเกี่ยวข้องกับการกระทำหลายอย่าง ตัวอย่างเช่นสมมติว่าฉันทำ 5 ข้อเพื่อทำงานหนึ่ง ๆ ให้เสร็จ ฉันใช้เครื่องมือ diff ใน IDE ระหว่างทุกๆการคอมมิตที่เพิ่มขึ้นตั้งแต่ 1-5 เพื่อดูการเปลี่ยนแปลงของฉันจากคอมมิตสุดท้าย ฉันพบว่าเป็นวิธีที่มีประโยชน์มากในการตรวจสอบการเปลี่ยนแปลงก่อนที่จะดำเนินการ

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

ผมจึงใช้git reset --soft HEAD~4การกลับไป 4 คอมมิต สิ่งนี้ทำให้ฉันเห็นการเปลี่ยนแปลงทั้งหมดด้วยกัน เมื่อฉันมั่นใจในการเปลี่ยนแปลงของฉันฉันก็สามารถทำgit reset HEAD@{1}และผลักมันไปที่ระยะไกลได้อย่างมั่นใจ


1
... แล้วทำgit add --patchและgit commitซ้ำ ๆ เพื่อสร้างชุดการกระทำที่คุณต้องการได้สร้างถ้าคุณรู้ว่าสิ่งที่คุณทำมาตลอด ความมุ่งมั่นครั้งแรกของคุณก็เหมือนกับบันทึกบนโต๊ะทำงานหรือร่างแรกของบันทึกช่วยจำพวกเขาอยู่ที่นั่นเพื่อจัดระเบียบความคิดของคุณไม่ใช่เพื่อการตีพิมพ์
jthill

เฮ้ฉันไม่ค่อยเข้าใจในสิ่งที่คุณแนะนำ
Swanky Coder

1
แทนที่จะทำgit reset @{1}เพื่อกู้คืนซีรีส์ฉบับร่างแรกของคุณคุณสามารถสร้างซีรีส์สำหรับเผยแพร่จากgit add -pและgit commitแทนได้
jthill

ใช่ถูกต้อง. อีกวิธีหนึ่งคือ (วิธีที่ฉันมักจะทำตาม) เพื่อสร้างฐานข้อมูลใหม่บนต้นน้ำ / ต้นแบบและสควอชให้เป็นหนึ่งเดียว
Swanky Coder

1

การใช้งานอีกกรณีหนึ่งคือเมื่อคุณต้องการแทนที่สาขาอื่นด้วยของคุณในคำขอดึงตัวอย่างเช่นสมมติว่าคุณมีซอฟต์แวร์ที่มีคุณสมบัติ A, B, C ที่กำลังพัฒนา

คุณกำลังพัฒนาด้วยเวอร์ชันถัดไปและคุณ:

  • คุณลักษณะที่ถูกลบ B

  • เพิ่มคุณสมบัติ D

ในกระบวนการพัฒนาเพิ่งเพิ่มโปรแกรมแก้ไขด่วนสำหรับคุณลักษณะ B

คุณสามารถรวมการพัฒนาเป็นลำดับถัดไป แต่บางครั้งอาจยุ่งเหยิง แต่คุณยังสามารถใช้git reset --soft origin/developและสร้างข้อตกลงกับการเปลี่ยนแปลงของคุณได้และสามารถรวมสาขาได้โดยไม่มีข้อขัดแย้งและเก็บการเปลี่ยนแปลงของคุณไว้

ปรากฎว่าgit reset --softเป็นคำสั่งที่มีประโยชน์ โดยส่วนตัวแล้วฉันใช้มันมากในการทำสควอชที่ไม่มี "งานที่เสร็จสมบูรณ์" เหมือน "WIP" ดังนั้นเมื่อฉันเปิดคำขอดึงข้อตกลงทั้งหมดของฉันก็เข้าใจได้

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