วิธีการกรอสาขาไปข้างหน้าอย่างรวดเร็ว?


249

ฉันเปลี่ยนมาเป็นอาจารย์หลังจากพัฒนาสาขาเป็นเวลานาน บันทึกแสดง:

สาขาของคุณอยู่ด้านหลัง 'ที่มา / มาสเตอร์' โดย 167 คอมมิทและสามารถส่งต่อได้อย่างรวดเร็ว

ฉันเหนื่อย:

git checkout HEAD

มันไม่มีผลกระทบ นี่เป็นเพราะฉันได้ชำระเงินระดับกลางส่งมอบให้กับมาสเตอร์แล้ว

วิธีที่จะทำให้เจ้านายอยู่บนหัว?


6
git checkout HEADไม่เคยทำอะไรเลย HEADหมายถึงการกระทำที่ได้ชำระเงินแล้ว
Emre Tapcı

คำตอบ:


244

การทำ:

git checkout master
git pull origin

จะดึงข้อมูลและรวมorigin/masterสาขา (คุณอาจบอกว่าgit pullต้นกำเนิดเป็นค่าเริ่มต้น)


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

353

ลองgit merge origin/masterดู หากคุณต้องการให้แน่ใจว่าจะส่งต่ออย่างรวดเร็วเท่านั้นคุณสามารถพูดgit merge --ff-only origin/masterได้


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

30
--ff-onlyมีประโยชน์อย่างมาก
ลุค

4
ผมไม่ทราบว่าถ้าorigin/masterส่วนที่จำเป็นต้องใช้หรือถ้ามันสมเหตุสมผลค่าเริ่มต้น แต่ผมพบว่ามันมีประโยชน์เพื่อให้นามแฝงสำหรับข้างหน้าอย่างรวดเร็วดังนั้นผมอยากจะให้แน่ใจว่าสาขาต้นน้ำถูกนำมาใช้แทนฮาร์ดเข้ารหัสมันorigin/master: ff = merge --ff-only @{u}( @{u}คือต้นน้ำ) .
Thor84no

2
ดีกว่าคำตอบที่แนะนำถ้าคุณออฟไลน์
Jacek Pietal

1
คุณช่วยอธิบายได้หรือไม่ว่าทำไมการดึงอย่างง่ายไม่ได้ทำแบบเดียวกัน นอกจากนี้ยังจำเป็นต้องดึงถ้าเราทำเช่นนี้?
Zuzu Corneliu

40

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

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean

1
และมีประโยชน์มากสำหรับฉันเพราะเราไม่ควรใช้ git pull!
Stefan

แม้ว่าคุณจะมีการเปลี่ยนแปลงบางอย่างที่รอดำเนินการคุณสามารถซ่อนและปฏิเสธได้ฉันไม่ทราบว่านี่เป็นวิธีที่ 'เหมาะสม' แต่ใช้งานได้อย่างมหัศจรรย์
fn

28
git checkout master
git pull

ควรทำงาน

คุณจะได้รับข้อความ "สาขาของคุณอยู่ข้างหลัง" ทุกครั้งเมื่อคุณทำงานในสาขาที่แตกต่างจากต้นแบบมีคนเปลี่ยนเจ้านายและดึงคุณออก

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

ขณะนี้การดึงที่อ้างอิงต้นฉบับ / ต้นแบบ แต่ต้นแบบของคุณไม่ได้รวมเข้าด้วยกัน

(branch) $ git checkout master
(master) $ 

ตอนนี้อาจารย์อยู่เบื้องหลังที่มา / ต้นแบบและสามารถส่งต่อได้อย่างรวดเร็ว

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

ตอนนี้ต้นแบบและที่มา / ต้นแบบของคุณกำลังซิงค์กัน


13

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

git checkout -B master origin/master


9

สำหรับผู้ที่ต้องการ Fast Forward พวกเขาไม่ได้อยู่ในสาขาระยะไกลอื่น (รวมถึงตัวเอง) โดยไม่ต้องตรวจสอบจากสาขานั้นคุณสามารถทำได้:

git fetch origin master:other

สิ่งนี้จะส่งต่อดัชนีotherไปโดยเร็วorigin/masterหากคุณไม่ได้อยู่ในotherสาขา คุณสามารถส่งต่อสาขาอย่างรวดเร็วด้วยวิธีนี้

หากคุณทำงานในสาขาอื่นบางครั้งและต้องการอัปเดตสาขาเก่าจากระยะไกลเป็นหัวหน้าของพวกเขา:

git fetch origin master:master other:other etc:etc

2

ไม่จำเป็นต้องมีความซับซ้อนเพียงแค่ยืนที่สาขาของคุณและดึงคอมไพล์ มันได้ผลสำหรับฉัน

หรือในฐานะที่เป็นลองครั้งที่สองลองใช้git pull master master เฉพาะในกรณีที่คุณโชคร้ายด้วยคำสั่งแรก


0

เพื่อrebase ปัจจุบันท้องถิ่นติดตามสาขาการเคลื่อนย้ายการเปลี่ยนแปลงในด้านบนของรัฐระยะไกลล่าสุด:

$ git fetch && git rebase

โดยทั่วไปแล้วหากต้องการกรอไปข้างหน้าและวางการเปลี่ยนแปลงในเครื่อง ( ฮาร์ดรีเซ็ต ) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

เพื่อกรอไปข้างหน้าและรักษาการเปลี่ยนแปลงในระบบ ( rebase ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - เพื่อยกเลิกการเปลี่ยนแปลงที่เกิดจากการรีเซ็ตฮาร์ดโดยไม่ตั้งใจก่อนgit reflogซึ่งจะแสดงสถานะของ HEAD ตามลำดับย้อนกลับค้นหาแฮช HEAD ที่ชี้ไปก่อนการดำเนินการรีเซ็ต (ปกติชัดเจน) และฮาร์ดรีเซ็ตสาขาเป็นแฮชนั้น


0

ในกรณีของคุณหากต้องการเดินหน้าอย่างรวดเร็วให้ทำดังนี้

$ git merge --ff-only origin/master

วิธีนี้ใช้--ff-onlyตัวเลือกgit mergeเนื่องจากเป็นคำถามที่ถามถึง "การกรอไปข้างหน้า" โดยเฉพาะ

นี่คือข้อความที่ตัดตอนมาจากgit-merge(1)ที่แสดงตัวเลือกไปข้างหน้าอย่างรวดเร็วมากขึ้น:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

ฉันกรอไปข้างหน้าบ่อยพอที่จะรับประกันนามแฝง:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

ตอนนี้ฉันสามารถเรียกใช้เพื่อกรอไปข้างหน้า:

$ git ff

-2

ย้ายตัวชี้สาขาของคุณไปที่ HEAD:

git branch -f master

สาขาของคุณmasterมีอยู่แล้วดังนั้นคอมไพล์จะไม่อนุญาตให้คุณเขียนทับเว้นแต่คุณจะใช้ ... -f(อาร์กิวเมนต์นี้ใช้แทน--force)

หรือคุณสามารถใช้ rebase:

git rebase HEAD master

ทำด้วยความเสี่ยงของคุณเอง;)


1
อย่าลองสิ่งนี้ หากคุณมีสถานการณ์ต่อไปนี้สิ่งเลวร้ายจะเกิดขึ้น: C0 --- C1 --- C2 --- C3 --- C4 (หลัก) C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) ถ้าหัวหน้าของคุณอยู่ที่ B3 (dev) และคุณทำสาขา git -f master คุณจะต้องจบด้วย C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (หลัก) C3 --- C4 ไม่สามารถเข้าถึงได้จากสาขาใด ๆ และในที่สุดจะถูกเก็บรวบรวมขยะ หากคุณพบว่าตัวเองอยู่ในสถานการณ์นี้ดู reflog และชำระเงิน C4 กระทำด้วยตัวเลือก -b <branch> เพื่อสร้างสาขาใหม่
A_P
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.