รีเซ็ตสาขาอื่นเป็นปัจจุบันโดยไม่ต้องชำระเงิน


110

ฉันกำลังเขียนสคริปต์สำหรับเวิร์กโฟลว์ Git ของฉัน

ฉันต้องการรีเซ็ตสาขาอื่น (ที่มีอยู่) เป็นสาขาปัจจุบันโดยไม่ต้องชำระเงิน

ก่อน:

 CurrentBranch: commit A
 OtherBranch: commit B

หลังจาก:

 CurrentBranch: commit A
 OtherBranch: commit A

เทียบเท่ากับ

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(บันทึก --soft : ฉันไม่ต้องการที่จะส่งผลกระทบต่อการทำงานต้นไม้.)

เป็นไปได้หรือไม่


ไม่มีใครรู้ว่าสิ่งนี้เป็นไปได้ใน Egit หรือไม่?
zedoo

คำตอบ:


84

เวิร์กโฟลว์ที่คุณอธิบายไม่เทียบเท่า: เมื่อคุณดำเนินการreset --hardคุณสูญเสียการเปลี่ยนแปลงทั้งหมดในโครงสร้างการทำงาน (คุณอาจต้องการทำให้reset --soft )

สิ่งที่คุณต้องการคือ

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch

3
ผู้ชายฉันหวังว่าสิ่งนี้จะได้ผลโดยไม่ต้องฟุ่มเฟือยrefs/heads/
ELLIOTTCABLE

41
git push . current:otherวิธีที่ดีกว่ามากที่จะทำเช่นนี้คือ ใช้งานได้โดยไม่มีrefs/heads(/ cc @elliottcable) และยังป้องกันไม่ให้คุณอัปเดตสาขาที่เช็คเอาต์ โปรดทราบว่าคุณอาจต้องผ่าน -f (หรือใช้+current:other) หากการอัปเดตไม่ใช่การกรอไปข้างหน้า
Lily Ballard

4
คุณยังสามารถใช้-m 'some text'อาร์กิวเมนต์เพื่อบันทึกเหตุผลของการปรับปรุงอ้างอิงที่จะแสดงโดยgit reflog OtherBranchคำสั่งเช่น "ซิงค์กับ CurrentBranch" อาจเป็นประโยชน์ในการจำสาเหตุที่คุณทำในภายหลัง
Levi Haskell

18
ทำไมคุณถึงใช้git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchหรือgit push . CurrentBranch OtherBranchเมื่อคุณสามารถใช้ตัวทำความสะอาดมาก (IMO) git branch -f OtherBranch CurrentBranchแทน (ดูคำตอบของฉันใน git branch -fด้านล่าง)
Colin D Bennett

1
@BenHymers ดังนั้นหน้าคนสำหรับ "git push" จึงเป็นเรื่องโกหก มันอธิบายคำสั่งว่า "Update remote refs ... " เมื่อในความเป็นจริงมันสามารถอัปเดตการอ้างอิงในท้องถิ่นได้ดี
Kaz

228

ชุด otherbranchให้ชี้ไปที่คอมมิตเดียวกับการcurrentbranchรัน

git branch -f otherbranch currentbranch

-f(แรง) ตัวเลือกที่บอกgit branch ใช่ฉันหมายความว่าจริงๆจะเขียนทับใด ๆ ที่มีotherbranchการอ้างอิงด้วยใหม่

จากเอกสารประกอบ :

-f
--force

รีเซ็ตเป็นถ้ามีอยู่แล้ว ไม่มี -f git branch ปฏิเสธที่จะเปลี่ยนสาขาที่มีอยู่


6
นี่คือคำตอบที่ง่ายที่สุด ขอบคุณ!
Robert Karl

ฉันได้รับfatal: Cannot force update the current branch.เมื่อพยายามทำสิ่งนี้
Fuad Saud

4
@FuadSaud นั่นเป็นเพราะคุณได้otherbranchเช็คเอาต์แล้ว คำถาม SO นี้เป็นคำถามเฉพาะเกี่ยวกับการรีเซ็ตสาขาอื่นเป็นคอมมิตอื่น (เช่นไม่รีเซ็ตสาขาที่เช็คเอาต์) สิ่งที่คุณต้องการจะทำคือการตั้งค่าสาขาในปัจจุบันที่มีการบังคับให้สาขาในปัจจุบันที่จะชี้ไปที่git reset targetbranch targetbranchเพิ่ม--hardยังบังคับต้นไม้งานกับเนื้อหานั้น หรือ--softจะปล่อยให้ดัชนีอยู่คนเดียวและเปลี่ยนสาขาเท่านั้นเอง
Colin D Bennett

ใช่ฉันรู้เกี่ยวกับการรีเซ็ต สิ่งที่ฉันกำลังมองหาคือวิธีที่ภายในงานประจำมักจะชี้ให้นายท้องถิ่นไปที่ต้นน้ำ / ต้นแบบโดยไม่ขึ้นกับสิ่งที่เช็คเอาต์ ฉันคิดว่าbranch -fสามารถทำได้
Fuad Saud

9
Imo นี่ควรเป็นคำตอบที่ยอมรับได้ สิ่งนี้ทำให้ขั้นตอนการทำงานของฉันดีขึ้นมาก!
กีตาร์สุด

23

คุณสามารถซิงค์กับคำสั่งนี้สาขาของคุณได้ตลอดเวลา

$ git push . CurrentBranch:OtherBranch -f

นอกจากนี้หากไม่มี -f จะแทนที่ชุดคำสั่งนี้

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

จะมีประโยชน์เมื่อคุณไม่ต้องการคอมมิตไฟล์ทั้งหมดใน CurrentBranch ดังนั้นคุณจึงไม่สามารถเปลี่ยนไปใช้สาขาอื่นได้


อาจทำให้เกิด "remote: error:
denying

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