Git ผสานรายงาน“ ทันสมัยแล้ว” ถึงแม้ว่าจะมีความแตกต่าง


286

ฉันมีที่เก็บคอมไพล์ด้วย 2 สาขา: มาสเตอร์และทดสอบ

มีความแตกต่างระหว่างต้นแบบและสาขาทดสอบ

ทั้งสองสาขามีการเปลี่ยนแปลงทั้งหมดที่ทำไว้

ถ้าฉันทำ:

git หลักการชำระเงิน
การทดสอบ diff git

หน้าจอเต็มไปด้วยการเปลี่ยนแปลงปรากฏขึ้นแสดงความแตกต่าง ฉันต้องการที่จะรวมการเปลี่ยนแปลงในสาขาการทดสอบและทำ:

การทดสอบแบบคอมไพล์

แต่ได้รับข้อความ "ทันสมัยแล้ว"

อย่างไรก็ตามการตรวจสอบไฟล์ภายใต้แต่ละสาขาจะแสดงความแตกต่างอย่างชัดเจน

มีปัญหาอะไรที่นี่และฉันจะแก้ไขได้อย่างไร


คุณมีรหัสที่ไม่ได้แก้ไขหรือไม่?
ozma

คำตอบ:


146

ข้อความ“ ทันสมัยแล้ว” หมายความว่าการเปลี่ยนแปลงทั้งหมดจากสาขาที่คุณกำลังพยายามผสานได้ถูกรวมเข้ากับสาขาที่คุณอยู่ในปัจจุบัน โดยเฉพาะอย่างยิ่งก็หมายความว่าสาขาที่คุณกำลังพยายามที่จะผสานเป็นแม่ของสาขาในปัจจุบันของคุณ ขอแสดงความยินดีนั่นเป็นการรวมที่ง่ายที่สุดที่คุณจะทำได้ :)

ใช้gitkเพื่อดูที่เก็บของคุณ เลเบลสำหรับสาขา "ทดสอบ" ควรอยู่ใต้เลเบลสาขา "มาสเตอร์" ของคุณ

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

แก้ไข 10/12/2019:

ต่อ Charles Drake ในความคิดเห็นคำตอบนี้ทางออกหนึ่งในการแก้ไขปัญหาคือ:

git checkout master
git reset --hard test

วิธีนี้จะนำมันกลับไปที่ระดับ 'ทดสอบ'

จากนั้นทำ:

git push --force origin master

เพื่อบังคับให้มีการเปลี่ยนแปลงกลับไปที่ repo ส่วนกลาง


2
cr ศักดิ์สิทธิ์ * p! คุณถูก! ฉันคิดว่าสิ่งที่เกิดขึ้นคือมีการรวมสาขาอื่น (การพัฒนาที่ไม่เสถียร) เข้ากับเจ้านายอย่างไม่ถูกต้องและสาขาการทดสอบนั้นเป็นกลุ่มย่อยที่ไม่เสถียร การผสานที่ฉันพยายามทำคือการนำต้นแบบกลับสู่ระดับ 'ทดสอบ'
39820 Charles Darke

2
ขวา. การดำเนินการนั้นจะไม่สมเหตุสมผลดังนั้น Git ปฏิเสธที่จะทำอะไร :)
Bombe

24
สิ่งที่ฉันทำตอนนี้คือ: git checkout master; git reset - การทดสอบฮาร์ด วิธีนี้จะนำมันกลับไปที่ระดับ 'ทดสอบ' จากนั้นฉันก็ทำ "git push --force master master" เพื่อบังคับให้เปลี่ยนกลับไปเป็น repo ส่วนกลาง
46420 Charles Darke

22
คงจะดีถ้า git มีคำเตือนให้พูดว่า "พยายามรวมกับผู้ปกครอง"
46420 Charles Darke

1
การผลักสาขาที่ไม่ใช่ลูกหลานของสาขาที่มีอยู่แล้วในด้านระยะไกลถือเป็นสิ่งที่ไม่ดี: ดูการอภิปรายในหน้าคนสำหรับ git-push และ git-pull
Bombe

131

git merge masterนี้มักจะเกิดขึ้นกับฉันเมื่อฉันรู้ว่ามีการเปลี่ยนแปลงในระยะไกลต้นแบบดังนั้นฉันพยายามที่จะตัดพวกเขาใช้ อย่างไรก็ตามสิ่งนี้จะไม่รวมกับต้นแบบจากระยะไกล แต่รวมกับเจ้านายในพื้นที่ของคุณ

ดังนั้นก่อนที่จะทำการรวมให้ชำระเงินหลักแล้วgit pullมี จากนั้นคุณจะสามารถรวมการเปลี่ยนแปลงใหม่เข้ากับสาขาของคุณ


7
มีวิธีใดบ้างที่สามารถหลีกเลี่ยงการสลับกิ่งก้านสาขาได้บ้างเช่นดึงกิ่งก้านสาขามารวมกันในขณะที่ยังคงอยู่ที่กิ่งก้านสาขาที่จะผสานเข้าด้วยกันแล้วผสาน?
Japheth Ongeri - inkalimeva

อ่าเป็นคนดี ฉันคิดว่าgit fetchจะอัปเดตสาขาหลักแม้ว่าฉันจะอยู่ในสาขาอื่น ปรากฎว่ามันไม่ได้ ขอบคุณ! ฉันค่อนข้างมั่นใจว่ามีตัวเลือกสำหรับfetchให้คุณระบุสาขาที่จะได้รับ
Raik

1
@Raik คุณสามารถทำได้git fetch --allแต่เพียงดึงสาขาเท่านั้นมันไม่ดึงพวกเขา
Ingo Bürk

6
@ JaphethOngeri-inkalimeva git fetch --all && git merge origin/masterคุณก็สามารถทำ ไม่จำเป็นต้องอัพเดตโลคัลของคุณmasterเพื่อรวมการเปลี่ยนแปลงรีโมต
Ingo Bürk

@ IngoBürkผมมี 2 สาขาการปรับปรุง 1 git merge masterและ git merge origin/master1 ฉันเช็คเอาท์masterและgit pullก่อนที่จะอัพเดท 2 สาขา แม้ว่าพวกเขาจะแบ่งปันเนื้อหาเดียวกัน แต่การสร้าง PR ระหว่าง 2 กิ่งแสดงไฟล์ที่แตกต่างกัน ฉันแก้ไขโดยgit pullสาขาเป้าหมายเป็นสาขาคุณลักษณะซึ่งแสดง: Already up to date! Merge made by the 'recursive' strategy.สิ่งนี้ทำให้เกิดการรวมการกระทำโดยไม่มีการเปลี่ยนแปลง แต่ลบไฟล์ diff ที่ไม่คาดคิดออกจาก PR มีความคิดใดบ้างว่าทำไมจึงมีความแตกต่างระหว่างการรวมสาขา "ที่เทียบเท่า" ในพื้นที่และระยะไกล
wrapperapps

45

สมมติว่าคุณมีสาขาที่masterมีประวัติความเป็นมาดังต่อไปนี้:

A -- B -- C -- D

ตอนนี้คุณสร้างการทดสอบสาขาทำงานและทำ 4 คอมมิชชัน:


                 E -- F -- G -- H
                /
A -- B -- C -- D

masterหัวชี้ไปที่ D และtestหัวชี้ไปที่ H

ข้อความ "ทันสมัยแล้ว" จะปรากฏขึ้นเมื่อหัวหน้าของสาขาที่คุณกำลังรวมเข้าเป็นพ่อแม่ของสายโซ่ของการกระทำของสาขาที่คุณต้องการผสาน นั่นเป็นกรณีที่นี่: เป็นแม่ของDE

ไม่มีอะไรที่จะผสานจากtestเป็นmasterเพราะไม่มีอะไรเปลี่ยนแปลงmasterตั้งแต่นั้นมา สิ่งที่คุณต้องการทำที่นี่คือการบอกให้ Git มีmasterหัวชี้ไปที่ H ดังนั้นสาขาของอาจารย์มีประวัติการกระทำดังต่อไปนี้:

A -- B -- C -- D -- E -- F -- G -- H

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

git reset --hard H

3
ฉันได้รับแจ้งในอดีตว่าการใช้git reset --hardเป็นเรื่องค่อนข้างรุนแรงที่ต้องทำ มีวิธีที่ปลอดภัยกว่าในการเปลี่ยนแปลงเหล่านี้หรืออันตรายจากการgit reset --hardพูดเกินจริงหรือไม่?
เกรแฮมอาร์อาร์มสตรอง

1
คำสั่งนี้มีสติไม่ต้องกังวล ฉันจะบอกสิ่งเดียวที่ให้ความสนใจกับ--hardตัวเลือกคือความจริงที่ว่ามันปรับเปลี่ยนไดเรกทอรีการทำงานของคุณและเป็นผลให้คุณสูญเสียการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด โดยส่วนตัวฉันทำgit statusก่อนและหลังทุกคำสั่ง git ที่รันด้วยตนเองเพื่อให้แน่ใจว่า repo ของฉันสะอาดหรืออยู่ในสถานะที่คาดหวัง
Marek Stanley

สิ่งนี้จะสร้างข้อความสถานะ "สาขาและ 'ต้นกำเนิด / หลัก' ของคุณแยกจากกัน" ฉันจะแก้ไขได้อย่างไร
Eido95

1
ฉันหวังว่าฉันจะให้คุณมากกว่าหนึ่ง upvote ขอบคุณ!
KMC

จำเป็นต้องมี--hardตัวเลือกหรือไม่? --hardฉันได้รับในสถานการณ์เช่นนี้สองสามครั้งในขณะนี้และมักจะตั้งค่าได้โดยไม่ต้อง มันใช้งานได้ดีโดยไม่มีความเสี่ยงที่จะสูญเสียการเปลี่ยนแปลงใด ๆ
เมียร์

16

อะไรที่เหมาะกับฉันสมมติว่าคุณมี branch1 และคุณต้องการรวมมันเข้ากับ branch2

คุณเปิดบรรทัดคำสั่ง git ไปที่โฟลเดอร์ root ของ branch2 และพิมพ์:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

หากคุณมี comflicts คุณไม่จำเป็นต้องทำการ git push แต่ก่อนอื่นให้แก้ปัญหา conflits แล้วทำการ push


6

การผสานจะอยู่ระหว่าง HEAD ปัจจุบันและหนึ่งคอมมิชชันหรือมากกว่า (โดยปกติคือ head head หรือแท็ก)
และไฟล์ดัชนีจะต้องตรงกับแผนผังของ HEAD commit (เช่นเนื้อหาของการคอมมิทล่าสุด) เมื่อมันเริ่มต้น
กล่าวอีกนัยหนึ่งgit diff --cached HEADต้องรายงานการเปลี่ยนแปลง

HEADรวมกระทำที่มีอยู่แล้วใน นี่เป็นกรณีที่ง่ายที่สุดที่เรียกว่า "ทันสมัยแล้ว"

นั่นควรหมายความว่าคอมมิชชันในการทดสอบนั้นถูกรวมเข้ากับมาสเตอร์แล้ว แต่เนื่องจากคอมมิทอื่น ๆ ที่ทำบนมาสเตอร์นั้นgit diff testจะยังคงให้ความแตกต่างอยู่บ้าง


6

สิ่งนี้เกิดขึ้นเพราะสำเนาสาขาในพื้นที่ที่คุณต้องการผสานล้าสมัย ฉันมีสาขาแล้วMyBranchและฉันต้องการรวมมันเข้าProjectMasterด้วยกัน

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

แต่ฉันรู้ว่ามีการเปลี่ยนแปลงที่ต้องรวมเข้าด้วยกัน!

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

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

อ๋อ! สำเนาในเครื่องของฉันเก่าเกินไป 85 คอมมิทที่อธิบายทุกอย่าง! ตอนนี้ฉันPullลงการเปลี่ยนแปลงที่ฉันหายไปจากนั้นข้ามไปที่MyBranchและลองผสานอีกครั้ง

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

และตอนนี้ฉันมีปัญหาอื่นที่จะแก้ไข ...


5

สิ่งนี้เกิดขึ้นกับฉันเพราะ GIT แปลก ๆ คิดว่าสาขาในท้องถิ่นนั้นแตกต่างจากสาขาที่อยู่ห่างไกล สามารถมองเห็นได้ในกราฟสาขา: มันแสดงสองสาขาที่แตกต่างกัน: รีโมท / แหล่งกำเนิด / branch_name และ branch_name

การแก้ปัญหาคือเพียงแค่ลบ repo ในพื้นที่และทำการโคลนซ้ำจากระยะไกล GIT วิธีนี้จะเข้าใจว่ารีโมท / กำเนิด / branch_name> และ branch_name git merge branch_nameแน่นอนเดียวกันและฉันจะออก

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>

นี่ไม่ใช่คำตอบเดียวกับของ Acarter ใช่ไหม
Andrew C

ฉันคิดว่า Acarter พลาดจุดนี้จริงๆ - ไม่มีการเปลี่ยนแปลงใด ๆ ในรีโมท - นั่นไม่ใช่ปัญหาเลย ฉันจำเป็นต้อง "ปรมาจารย์การชำระเงิน git" แล้ว "git ผสาน <branch_name>" เพื่อบังคับให้ผสานการกรอไปข้างหน้า อีกวิธีหนึ่งที่ไม่ได้ทำอะไรเลยตั้งแต่สาขาอยู่ข้างหน้าของเจ้านาย คำตอบของ Bombe เป็นคำอธิบายที่ดี แต่ไม่เคยตอบ "ฉันจะแก้ไขได้อย่างไร" ส่วนหนึ่งของคำถาม
MrMas

5

git merge origin/mastergit merge masterทำงานแทนฉัน ดังนั้นในการรวมต้นแบบเข้ากับสาขาคุณลักษณะคุณอาจใช้:

git checkout feature_branch
git merge origin/master

5

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

จากนั้นเช็คเอาต์กลับไปที่สาขาที่คุณต้องการทำการผสานและการผสานคอมไพล์ของคุณควรทำงาน


1
นี่เป็นของฉัน - ฉันทำได้ดีในขณะที่อยู่ในระดับสูง ได้รู้ว่าฉันได้รับภาระผูกพันใหม่ใน "สาขา" พยายามรวม "สาขา" เป็นหลัก - "ทันสมัยแล้ว" ทำการเช็คเอาต์ "สาขา" - ได้รับ "สาขาของคุณอยู่ด้านหลัง ... และสามารถส่งต่อได้อย่างรวดเร็ว" ซึ่งหมายความว่าฉันต้องการอัปเดต "สาขา" โดยทำงานgit pullในขณะที่อยู่ใน "สาขา"
sdbbs

3

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

ดังนั้นก่อนหน้านี้ฉันได้รวมเข้าด้วยกัน แต่ฉันตั้งใจแยกการเปลี่ยนแปลงเฉพาะบางอย่างระหว่างการผสานนั้นดังนั้นจึงมีความแตกต่างระหว่างกิ่งอย่างชัดเจน ฉันพยายามผสานอีกครั้งเพราะฉันตระหนัก / ลืมว่าฉันควรมีและต้องการเพิ่มการเปลี่ยนแปลง / ไฟล์ที่ฉันได้ยกเว้นไว้ก่อนหน้านี้และฉันหวังว่าถ้าฉันรวมอีกครั้งจะแสดงการเปลี่ยนแปลงทั้งหมดที่ฉันยกเว้นก่อน แต่ฉันผิดและฉันได้รับข้อความ "ทันสมัยแล้ว" แทน

เมื่ออ่านข้อคิดเห็น / คำตอบของ @ Bombe เขาพูดถูกและฉันคิดว่ามันทำงานแบบนั้นดังนั้นสิ่งที่ฉันทำคือทำสำรองไฟล์อย่างหนักในสาขาทดสอบจากนั้นชำระเงินที่สาขาหลักและวางแฟ้มในนั้นด้วยตนเอง ราวกับว่ามันเป็นการเปลี่ยนแปลงใหม่

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


สถานการณ์เดียวกันที่นี่ สถานการณ์คือฉันต้องการแยกสาขา "รวม" กลับไปเป็นสาขา "คุณสมบัติ" หลายรายการ
Yadli

2
git checkout srcBranch -- path/to/fileแทนการวางตนเองคุณสามารถเช็คเอาไฟล์ได้โดยตรงจากสาขาหนึ่งไปยังสาขาในปัจจุบัน: สามารถใช้ไฟล์ globs ด้วย
ทอดด์

ขอบคุณฉันใช้วิธีการเช็คเอาต์ของคุณ แต่ฉันใส่checkout srcBranch -- *แล้วดู diffs ของฉัน
portforwardpodcast

2

หากการรวมสาขา A เข้ากับสาขา B รายงานว่า "ทันสมัยแล้ว" การกลับรายการไม่เป็นความจริงเสมอไป มันจะเป็นจริงเฉพาะในกรณีที่สาขา B เป็นผู้สืบทอดของสาขา A มิฉะนั้นสาขา B ก็สามารถมีการเปลี่ยนแปลงที่ไม่ได้อยู่ใน A

ตัวอย่าง:

  1. คุณสร้าง branch A และ B off master
  2. คุณทำการเปลี่ยนแปลงบางอย่างในต้นแบบและผสานการเปลี่ยนแปลงเหล่านี้เข้ากับสาขา B เท่านั้น (ไม่อัปเดตหรือลืมอัปเดตสาขา A)
  3. คุณทำการเปลี่ยนแปลงบางอย่างในสาขา A และรวม A ถึง B

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


2

ประสบกับสถานการณ์นี้โดยใช้ Git Bash

ที่เก็บของเรามีหลายสาขาและแต่ละสาขามีวัฏจักรการมอบหมายที่แตกต่างกันและการผสานเกิดขึ้นเป็นครั้งคราว Old_Branch ถูกใช้เป็นพาเรนต์สำหรับ New_Branch

Old_Branch ได้รับการอัปเดตเมื่อมีการเปลี่ยนแปลงบางอย่างซึ่งจำเป็นต้องรวมเข้ากับ New_Branch

ใช้คำสั่ง pull ด้านล่างโดยไม่มีสาขาใด ๆ เพื่อรับแหล่งทั้งหมดจากทุกสาขา

คอมไพล์ดึงต้นกำเนิด

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

ดังนั้นเพื่อแก้ไขปัญหานี้ได้ตรวจสอบ Old_Branch ดึงการใช้ล่าสุด

git checkout Old_Branch

คอมไพล์ดึงต้นกำเนิด Old_Branch

ตอนนี้เช็คเอาท์ New_Branch

git checkout New_Branch

ดึงมันให้แน่ใจ

git pull ต้นกำเนิด New_Branch

คอมไพล์ผสาน Old_Branch

และวิโอลามีข้อขัดแย้งในการแก้ไขจาก Old_Branch ถึง New_Branch :) ซึ่งคาดว่า


0

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


0

ผมมีปัญหาเหมือนกัน. ฉันมีการเปลี่ยนแปลงในระยะไกลและมันก็ยังคงแสดง "ทันสมัยแล้ว" การรวบรวมที่เก็บใหม่แก้ไขปัญหาให้ฉันได้


0

โง่ แต่มันอาจเกิดขึ้น สมมติว่าชื่อสาขาของคุณนำหน้าด้วยการอ้างอิงปัญหา (ตัวอย่างเช่น#91-fix-html-markup ) หากคุณทำการผสานนี้:

$ git merge #91-fix-html-markup

มันจะไม่ทำงานตามที่ตั้งใจเพราะทุกอย่างหลังจากที่#ถูกเพิกเฉยเพราะ#เริ่มแสดงความคิดเห็นแบบอินไลน์

ในกรณีนี้คุณสามารถเปลี่ยนชื่อถนัดสาขาหรือใช้ราคาเดียวที่จะล้อมรอบชื่อสาขา:#git merge '#91-fix-html-markup'

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