กดมุ่งมั่นที่จะสาขาอื่น


384

เป็นไปได้ไหมที่จะคอมมิทและผลักดันการเปลี่ยนแปลงจากสาขาหนึ่งไปอีกสาขาหนึ่ง

สมมติผมมุ่งมั่นที่เปลี่ยนแปลงในBRANCH1และต้องการที่จะผลักดันให้BRANCH2

จากBRANCH1จะสามารถทำได้:

git push origin **BRANCH2**

แล้วรีเซ็ต BRANCH1 หรือไม่

คำตอบ:


710

เกือบจะได้ผล

เมื่อกดไปที่สาขาที่ไม่ใช่ค่าเริ่มต้นคุณจะต้องระบุแหล่งอ้างอิงและการอ้างอิงเป้าหมาย:

git push origin branch1:branch2

หรือ

git push <remote> <branch with new changes>:<branch you are pushing to> 

26
ทำทั้งสองอย่างbranch1และbranch2จำเป็นต้องอยู่บนรีโมทหรือไม่? เกิดอะไรขึ้นถ้าคุณต้องการที่จะผลักดันจากท้องถิ่นbranch1ไปยังระยะไกลorigin branch2?
orad

11
@orad: ไม่ได้ส่วนแรกเป็นเพียงตัวระบุสำหรับการส่งข้อมูลภายใน มันไม่จำเป็นต้องเป็นสาขาด้วยซ้ำ
SLaks

6
@abhisekp: ใช้ไวยากรณ์เดียวกัน หากต้องการอ้างถึงสาขาต้นทางให้ใช้<remote>/<branch>
SLaks

4
@abhisekp: ทำสิ่งที่ฉันพูด สาขาปัจจุบันไม่เกี่ยวข้องอย่างสมบูรณ์
Slaks

20
ระวังทุกคนที่ถูกล่อลวง (เช่นตัวเอง) git push origin :branch2คิดว่ามันจะผลักสาขาท้องถิ่นปัจจุบันไปที่รีโมตbranch2แทนมันจะลบรีโมตแทนbranch2! git push origin HEAD:branch2วิธีที่ถูกต้องคือ
Helder Pereira

72

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

git push <remote> <source branch>:<dest branch> 

ดูคำอธิบายของ "refspec" บนหน้าgit push manสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงาน นอกจากนี้โปรดทราบว่าทั้งการกดปุ่มบังคับและการรีเซ็ตเป็นการดำเนินการที่ "เขียนประวัติศาสตร์" และไม่ควรพยายามด้วยความกระวนกระวายใจเว้นแต่คุณจะแน่ใจอย่างแน่นอนว่าคุณรู้ว่าคุณกำลังทำอะไรกับที่เก็บข้อมูลระยะไกลและอื่น ๆ ผู้ที่มีส้อม / โคลนของโครงการเดียวกัน


6
ขอบคุณ! git push --force remote local-branch:remote-branchฉันเพิ่งจะเพิ่มที่คุณสามารถบังคับกับ
Ferran Maylinch

16

มันง่ายมาก สมมติว่าคุณได้ทำการเปลี่ยนแปลงสาขาของคุณซึ่งอยู่ในสถานที่ทั้งในประเทศและจากระยะไกล แต่คุณต้องการที่จะผลักดันการเปลี่ยนแปลงเหล่านี้สาขาBซึ่งไม่มีที่ใดก็ได้

Step-01:สร้างและเปลี่ยนเป็นสาขาใหม่B

git checkout -b B

ขั้นตอนที่ 02:เพิ่มการเปลี่ยนแปลงในสาขาท้องถิ่นใหม่

คอมไพล์เพิ่ม // หรือไฟล์เฉพาะ

Step-03:ยืนยันการเปลี่ยนแปลง

คอมไพล์กระทำ -m "commit_message"

ขั้นตอนที่ 04:การผลักดันการเปลี่ยนแปลงไปยังสาขาใหม่B คำสั่งด้านล่างจะสร้างสาขาใหม่ Bจากระยะไกล

git push กำเนิด B

ตอนนี้คุณสามารถตรวจสอบได้จาก bitbucket ว่าสาขาBจะมีอีกหนึ่งกระทำกว่าสาขา และเมื่อคุณจะชำระเงินสาขาAการเปลี่ยนแปลงเหล่านี้จะไม่อยู่ที่นั่นเนื่องจากสิ่งเหล่านี้ได้ถูกผลักเข้าสู่สาขา B

หมายเหตุ:หากคุณยอมรับการเปลี่ยนแปลงในสาขาAและหลังจากนั้นคุณต้องการเปลี่ยนการเปลี่ยนแปลงเหล่านั้นไปยังสาขาใหม่Bคุณจะต้องรีเซ็ตการเปลี่ยนแปลงเหล่านั้นก่อน #HappyLearning


2

ในกรณีของฉันฉันมีความมุ่งมั่นในท้องถิ่นซึ่งไม่ได้ถูกผลักไปorigin\masterแต่มุ่งมั่นที่จะทำในท้องถิ่นของฉันmasterสาขาความมุ่งมั่นในท้องถิ่นนี้ควรผลักไปที่สาขาอื่น

ด้วยGit Extensionsคุณสามารถทำสิ่งนี้:

  • (สร้างหากไม่มีอยู่แล้ว) เช็คเอาท์สาขาใหม่ที่ที่คุณต้องการส่งการกระทำของคุณ
  • เลือกการส่งมอบจากประวัติซึ่งควรจะได้รับการยอมรับ & ผลักดันไปยังสาขานี้
  • คลิกขวาและเลือกCherry pick commitเชอร์รี่เลือกกระทำ
  • กดเลือกเชอร์รี่หลังจากนั้น
  • การรับข้อมูลที่เลือกใช้กับสาขาที่คุณเช็คเอาต์ ตอนนี้กระทำและผลักดันมัน
  • ตรวจสอบสาขาเก่าของคุณด้วยการกระทำผิดพลาด
  • ฮาร์ดรีเซ็ตสาขานี้เป็นคอมมิชชันสุดท้ายที่สองที่ทุกอย่างโอเค (ระวังให้ดีคุณกำลังทำอะไรที่นี่!) คุณสามารถทำผ่านคลิกขวาที่วินาทีสุดท้ายกระทำและเลือกสาขาปัจจุบันรีเซ็ตที่นี่ ยืนยันการต่อต้านถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่

นอกจากนี้คุณยังสามารถดำเนินการได้ในบรรทัดคำสั่ง GIT ตัวอย่างที่คัดลอกมาจากDavid Christensen :

ฉันคิดว่าคุณจะพบว่าgit cherry-pick+ git resetเป็นขั้นตอนการทำงานที่เร็วกว่ามาก:

การใช้สถานการณ์เดียวกันของคุณด้วย "ฟีเจอร์" ที่เป็นสาขาที่มีการคอมมิชชันสูงสุดไม่ถูกต้องการทำเช่นนี้จะทำได้ง่ายกว่ามาก:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

บันทึกงานค่อนข้างน้อยและเป็นสถานการณ์ที่git cherry-pick ออกแบบมาเพื่อจัดการ

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

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history


2

ฉันได้ผลลัพธ์ที่ไม่ดีพร้อมgit push origin branch1:branch2คำสั่ง:

ในกรณีของฉันbranch2ถูกลบและbranch1ได้รับการปรับปรุงด้วยการเปลี่ยนแปลงใหม่

ดังนั้นหากคุณต้องการเพียงการเปลี่ยนแปลงที่ผลักดันbranch2จากให้branch1ลองขั้นตอนด้านล่าง:

  • เปิดbranch1:git add .
  • เปิดbranch1:git commit -m 'comments'
  • เปิดbranch1:git push origin branch1

  • เปิดbranch2:git pull origin branch1

  • เปิดbranch1: เปลี่ยนกลับเป็นการกระทำก่อนหน้า


0

คุณสามารถทำสิ่งนี้ได้อย่างง่ายดาย

git status
git add .
git commit -m "any commit"
git pull origin (branch name, master in my case)
git push origin current branch(master):branch 2(development)(in which you want to push changes)

-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  


1
โปรดเพิ่มคำอธิบายของรหัส
Nakx

-4

คุณมีความมุ่งมั่นที่จะ BRANCH1 และต้องการที่จะกำจัดการกระทำนี้โดยไม่สูญเสียการเปลี่ยนแปลง? git resetคือสิ่งที่คุณต้องการ ทำ:

git branch BRANCH2

ถ้าคุณต้องการให้ BRANCH2 เป็นสาขาใหม่ คุณสามารถรวมสาขานี้กับสาขาอื่นหากต้องการ หาก BRANCH2 มีอยู่แล้วให้ออกจากขั้นตอนนี้

จากนั้นทำ:

git reset --hard HEAD~3

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

จากนั้นทำสิ่งต่อไปนี้เพื่อนำการตั้งค่าใหม่ไปที่ BRANCH2

git checkout BRANCH2

แหล่งข้อมูลนี้มีประโยชน์: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

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