ฉันมีสองสาขาemail
และstaging
. staging
เป็นรุ่นล่าสุดและฉันไม่ต้องการการเปลี่ยนแปลงเก่าในemail
สาขาอีกต่อไปแต่ฉันไม่ต้องการลบ
ดังนั้นฉันต้องการทิ้งเนื้อหาทั้งหมดของstaging
ลงในemail
เพื่อให้พวกเขาทั้งสองชี้ไปที่กระทำเดียวกัน เป็นไปได้ไหม
ฉันมีสองสาขาemail
และstaging
. staging
เป็นรุ่นล่าสุดและฉันไม่ต้องการการเปลี่ยนแปลงเก่าในemail
สาขาอีกต่อไปแต่ฉันไม่ต้องการลบ
ดังนั้นฉันต้องการทิ้งเนื้อหาทั้งหมดของstaging
ลงในemail
เพื่อให้พวกเขาทั้งสองชี้ไปที่กระทำเดียวกัน เป็นไปได้ไหม
คำตอบ:
คุณสามารถใช้กลยุทธ์การผสาน 'ของเรา':
$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head
;
ตอนท้ายของแต่ละคำสั่ง? ฉันไม่ได้ทำ;
และดูเหมือนว่าจะทำงานได้ ด้วยคำตอบนี้ไม่สมบูรณ์ขั้นตอนที่สามคือเช็คเอาต์สาขาเก่า (อีเมล) แล้วรวมกับการจัดเตรียมอีกครั้ง
git rebase -s theirs <oldbranc> <newbranch>
ทำงานได้ดี (ไม่ว่าคุณจะสาขาไหน) โปรดทราบว่าในการ rebase 'พวกเขา' เป็นจริงสาขาใหม่เพราะ 'ของเรา' เป็นหัวหน้าเรากำลังใช้ความมุ่งมั่นในการ
หากคุณต้องการให้ 'อีเมล' ทั้งสองสาขาและ 'จัดเตรียม' เป็นสาขาเดียวกันคุณสามารถติดแท็กสาขา 'อีเมล' จากนั้นรีเซ็ตสาขา 'อีเมล' เป็น 'จัดเตรียม' หนึ่งรายการ:
$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging
นอกจากนี้คุณยังสามารถรีบูตสาขา 'การจัดเตรียม' ในสาขา 'อีเมล' แต่ผลลัพธ์จะมีการแก้ไขทั้งสองสาขา
git checkout
, git check
ไม่ได้อยู่เพื่อความรู้ของฉัน
email
หัวของสาขาควรชี้ไปที่หัวเดียวกันstaging
และพวกเขาทั้งสองจะมีความมุ่งมั่นเหมือนกันประวัติศาสตร์เดียวกัน
ฉันเห็นคำตอบหลายข้อและเป็นขั้นตอนเดียวที่ให้ฉันแก้ไขได้โดยไม่มีข้อขัดแย้งใด ๆ
หากคุณต้องการการเปลี่ยนแปลงทั้งหมดจาก branch_new ใน branch_old ดังนั้น:
git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new
เมื่อใช้คำสั่งทั้งสี่แล้วคุณสามารถกด branch_old ได้โดยไม่มีปัญหาใด ๆ
คำตอบอื่นให้ฉันเบาะแสที่ถูกต้อง แต่พวกเขาไม่ได้ช่วยอย่างสมบูรณ์
$ git checkout email
$ git tag old-email-branch # This is optional
$ git reset --hard staging
$
$ # Using a custom commit message for the merge below
$ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email
$ git push origin email
หากไม่มีขั้นตอนที่สี่ของการรวมเข้ากับกลยุทธ์ของเราการผลักดันจะถือว่าเป็นการอัปเดตที่ไม่ส่งต่ออย่างรวดเร็วและจะถูกปฏิเสธ (โดย GitHub)
merge -m 'This is not my beautiful house.' -s ours origin/email
เพียงแค่แก้ไขการกระทำหรือการใช้งาน
หากคุณเป็นเหมือนฉันและคุณไม่ต้องการจัดการกับการรวมคุณสามารถทำตามขั้นตอนข้างต้นยกเว้นใช้แรงแทนการผสานเพราะมันจะสร้างเส้นทางกระดาษบันทึกที่เบี่ยงเบนความสนใจ:
git checkout email
git reset --hard staging
git push origin email --force
หมายเหตุ: นี่คือเมื่อคุณจริงๆไม่ต้องการเห็นเนื้อหาในอีเมลอีกครั้ง
ฉันต้องการรวมสองสาขาเพื่อให้เนื้อหาทั้งหมดold_branch
ได้รับการอัปเดตด้วยเนื้อหาจากnew_branch
สำหรับฉันมันใช้งานได้เหมือนมีเสน่ห์:
$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch
เกี่ยวกับ:
git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease
คำตอบอื่น ๆ ดูไม่สมบูรณ์
ฉันลองด้านล่างเต็มแล้วและใช้งานได้ดี
หมายเหตุ:
1. ทำสำเนาที่เก็บของคุณก่อนที่คุณจะลองด้านล่างเพื่อให้ปลอดภัย
รายละเอียด:
1. การพัฒนาทั้งหมดเกิดขึ้นในสาขา dev
2. สาขาqa เป็นเพียงสำเนาเดียวกันของ dev
3. เวลารหัส dev จำเป็นต้องย้าย / เขียนทับไปยังสาขา qa
ดังนั้นเราต้องเขียนทับ qa branch จาก dev dev
ตอนที่ 1:
ด้วยคำสั่งด้านล่าง qa เก่าได้รับการอัพเดตเป็น dev ใหม่กว่า:
git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push
ความคิดเห็นอัตโนมัติสำหรับการกดครั้งสุดท้ายให้ด้านล่าง:
// Output:
// *<MYNAME> Merge branch 'qa' into dev,*
ความคิดเห็นนี้ดูย้อนกลับเพราะลำดับข้างต้นก็ดูย้อนกลับ
ส่วนที่ 2:
ด้านล่างเป็นสิ่งที่คาดไม่ถึงการที่คนท้องถิ่นมุ่งมั่นในการพัฒนาสิ่งที่ไม่จำเป็น
ดังนั้นเราต้องทิ้งและทำให้ผู้พัฒนาไม่มีใครแตะต้อง
git checkout dev
// Output:
// Switched to branch 'dev'
// Your branch is ahead of 'origin/dev' by 15 commits.
// (use "git push" to publish your local commits)
git reset --hard origin/dev
// Now we threw away the unexpected commits
ตอนที่ 3:
ตรวจสอบทุกอย่างตามที่คาดไว้:
git status
// Output:
// *On branch dev
// Your branch is up-to-date with 'origin/dev'.
// nothing to commit, working tree clean*
นั่นคือทั้งหมดที่
1. qa เก่าถูกเขียนทับโดยรหัสสาขา dev ใหม่
2. local is clean (แหล่งกำเนิดระยะไกล / dev ไม่มีการแตะต้อง)
วิธีที่ง่ายที่สุดที่จะทำ:
//the branch you want to overwrite
git checkout email
//reset to the new branch
git reset --hard origin/staging
// push to remote
git push -f
ตอนนี้สาขาอีเมลและการจัดเตรียมเหมือนกัน
email
สาขา มันเหมือนกับการลบemail
สาขาและสร้างใหม่ที่หัวstaging
สาขา
git checkout email
git merge -m "Making email same as staging disregarding any conflicts from email in the process" -s recursive -X theirs staging
สาขานี้ไม่ได้ดัดแปลงสาขาที่ใหม่กว่าเดิมและเปิดโอกาสให้คุณทำการแก้ไขเพิ่มเติมก่อนที่จะยอมรับขั้นสุดท้าย
git checkout new -b tmp
git merge -s ours old -m 'irrelevant'
git checkout old
git merge --squash tmp
git branch -D tmp
#do any other stuff you want
git add -A; git commit -m 'foo' #commit (or however you like)