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


129

คำถามนี้คล้ายกับคำถามนี้แต่เจาะจงมากกว่า

ฉันมีโครงการที่มีสองสาขา ( stagingและbeta)

ฉันพัฒนาstagingและใช้masterสาขาเพื่อแก้ไขข้อบกพร่อง ดังนั้นหากฉันกำลังดำเนินการจัดเตรียมและฉันเห็นข้อผิดพลาดฉันเปลี่ยนเป็นmasterสาขา:

git checkout master

และทำสิ่งต่างๆ:

git add fileToAdd
git commit -m "bug fixed"

จากนั้นฉันรวมกับทั้งสองสาขา:

git checkout staging
git merge master
git checkout beta
git merge beta

และไม่สำคัญว่าจะมีไฟล์อื่นอยู่บนแผนผังการทำงานหรือไม่

แต่ตอนนี้เมื่อฉันพยายามเปลี่ยนเป็นmasterสาขาฉันได้รับข้อผิดพลาด :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

ฉันคิดว่าฉันควรลบไฟล์ออกจากพื้นที่จัดเตรียม:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

แต่ฉันได้รับข้อผิดพลาดเดียวกัน ถ้าgit statusฉันได้รับNo changes to commit


4
คุณลองแล้วreset --hardหรือยัง? หากคุณแน่ใจจริงๆว่าต้องการยกเลิกการเปลี่ยนแปลงของคุณ หรือใช้ที่ซ่อนถ้าคุณไม่ทำ
keltar

@keltar - ไม่ฉันไม่ต้องการทิ้งการเปลี่ยนแปลงของฉัน เพียงแค่ให้พวกเขาอยู่บนโครงสร้างการทำงานสำหรับการกระทำในภายหลัง
Manolo

1
ฉันไม่คิดว่าคุณสามารถเปลี่ยนสาขาได้ในขณะที่รักษาการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด แต่ฉันอาจคิดผิดได้ง่าย ๆ ไม่ใช่สาขาของฉันจริงๆ พยายามgit add your-fileและมุ่งมั่น
keltar

@keltar - ฉันเคยทำงานด้วยวิธีนี้มาก่อน ฉันไม่ต้องการเปลี่ยนแปลงใด ๆ ในstagingตอนนี้
Manolo

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

คำตอบ:


128

ข้อผิดพลาดของคุณจะปรากฏขึ้นเมื่อคุณแก้ไขไฟล์และสาขาที่คุณกำลังเปลี่ยนไปมีการเปลี่ยนแปลงสำหรับไฟล์นี้ด้วย (จากจุดผสานล่าสุด)

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

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

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


3
ขอบคุณ. แน่ใจหรือว่าสิ่งนี้จะไม่ทำการเปลี่ยนแปลงใด ๆ กับโครงสร้างการทำงานของฉัน (ไม่ได้เพิ่มไฟล์) ฉันไม่ต้องการที่จะสูญเสียการเปลี่ยนแปลงของฉัน: - /
Manolo

อ๊ะพิมพ์ผิดaddเมื่อเป็นจริงsave.. อัพเดทแล้ว คุณหมายถึงไฟล์อื่น ๆ ? git stash saveโดยไม่มีพารามิเตอร์ชื่อไฟล์จะบันทึกไฟล์ที่แก้ไขทั้งหมดหากคุณต้องการ (และเปลี่ยนกลับเป็นสถานะที่คอมมิตล่าสุด) และการมีสำเนาไดเร็กทอรีเพิ่มเติมไม่เคยทำให้เจ็บ แต่ฉันมักจะหวาดระแวงกับมัน
keltar

สิ่งนี้จะบันทึกไฟล์ที่แก้ไขทั้งหมดยกเว้นไฟล์ที่ฉันต้องการเพิ่มในmasterสาขา นอกจากนี้ตัวเลือกจะเป็นการpopเปลี่ยนแปลงในสาขาอื่นหรือไม่?
Manolo

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ใช่คุณสามารถใช้ที่ซ่อนในสาขาอื่นได้ แต่จะแทนที่เนื้อหาของไฟล์เท่านั้นไม่ใช่รวมเข้าด้วยกัน
keltar

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

152

ฉันพบปัญหาเดียวกันและแก้ไขได้โดย

git checkout -f branch

และสเปคของมันค่อนข้างชัดเจน

-f, - บังคับ

เมื่อเปลี่ยนสาขาให้ดำเนินการต่อแม้ว่าดัชนีหรือโครงสร้างการทำงานจะแตกต่างจาก HEAD สิ่งนี้ใช้เพื่อละทิ้งการเปลี่ยนแปลงในท้องถิ่น

เมื่อตรวจสอบเส้นทางจากดัชนีอย่าล้มเหลวในรายการที่ไม่ได้ผสาน แทนที่รายการที่ไม่ได้ผสานจะถูกละเว้น


7
เมื่อคอมไพล์ของฉันติดขัด (ไม่มีการเปลี่ยนแปลงในเครื่อง แต่ยังคงมีข้อผิดพลาดนั้นอยู่) วิธีนี้ช่วยฉันได้!
lukyer

6
ขอบคุณคุณช่วยหน้าจอของฉันไม่ให้ผ่านมันไปได้
นกฮูก

3
ฉันสูญเสียการเปลี่ยนแปลงในลักษณะนั้น
Jacek Dziurdzikowski

1
ใช่คุณจะสูญเสียการเปลี่ยนแปลงโดยการทำเช่นนี้สิ่งนี้ควรมาพร้อมกับข้อแม้ที่ยิ่งใหญ่
Alexander Mills

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

12

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

git checkout -f branch_name

1
sudoไม่จำเป็นก็จะทำลายสิทธิ์ของแฟ้ม มันเป็นคำสั่ง git เดียวกับที่โพสต์โดย@kiki_yu เมื่อหนึ่งปีก่อน แต่มันแย่กว่านั้น
kenorb

2
ฉันสูญเสียการเปลี่ยนแปลงในลักษณะนั้น
Jacek Dziurdzikowski

2
@JacekDziurdzikowski คุณสูญเสียการเปลี่ยนแปลงไปสองครั้ง (ดูความคิดเห็นเกี่ยวกับคำตอบของ kiki_yu) ทั้งโดยใช้วิธีแก้ปัญหาที่กล่าวถึงอย่างชัดเจนว่าการละทิ้งการเปลี่ยนแปลงในท้องถิ่นเป็นจุดประสงค์ที่ดี เครื่องตรวจจับถากถางของฉันเสียหรือ ... คุณจริงจัง?
RomainValeri

@RomainValeri อืมฉันเดาว่านั่นเป็นวิธีของฉันในการเตือนคนอื่น ๆ ที่เป็นคนขอทานด้วยคอมไพล์ (พวกเขาต้องเป็นมือใหม่ถ้าอ่านโพสต์นี้) เพื่อพร้อมที่จะบอกลาการเปลี่ยนแปลงใด ๆ ที่พวกเขาทำ ฉันคิดว่าเวลาที่การเปลี่ยนแปลงในสาขาหนึ่งควรจะอยู่ในสาขานั้นจนกว่าฉันจะชำระเงินอีกครั้ง คำแนะนำสำหรับผู้มาใหม่ที่คิดแบบนั้นเช่นกัน: ใช้ git stash :)
Jacek Dziurdzikowski

คำตอบซ้ำโดยไม่มีเหตุผล คำตอบแรกมีข้อมูลเพิ่มเติม
MAChitgarha

9

ฉันพบปัญหาเดียวกันและแก้ไขได้โดย

git checkout -f branch

ระวัง-fสวิตช์ด้วย คุณจะสูญเสียการเปลี่ยนแปลงที่ไม่ได้ผูกมัดหากคุณใช้-fสวิตช์ แม้ว่าอาจมีบางกรณีการใช้งานที่เป็นประโยชน์ในการใช้งาน-fแต่ในกรณีส่วนใหญ่คุณอาจต้องการstashเปลี่ยนแปลงแล้วจึงswitchแยกสาขา stashingขั้นตอนจะมีการอธิบายข้างต้น


0

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


จะมีประโยชน์มากขึ้นหากคุณให้คำอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้
MAChitgarha

-1

หากคุณได้รับสิ่งนี้เมื่อพยายามตรวจสอบสาขาอื่น:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

ซึ่งหมายความว่าคุณมีการเปลี่ยนแปลงบางอย่างที่คุณต้องดำเนินการในสาขาที่คุณได้ชำระเงินหรือคุณจำเป็นต้องล้างหรือซ่อนไว้ตามที่ส่วนใหญ่ชี้ไปข้างต้น 19 จาก 20 ครั้งฉันมีแนวโน้มที่จะยอมรับการเปลี่ยนแปลงของฉันมากกว่า

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

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

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

ตรวจสอบให้แน่ใจว่าคุณอยู่ในสาขาที่ถูกต้องและกดไปยังสาขาที่ถูกต้องเมื่อคุณเรียกใช้คำสั่ง git push origin $ {branch} หมายเหตุ: หากคุณมีโครงการของคุณเชื่อมต่อกับ Intellij โดยตรงคุณจะเห็นว่าคุณเปลี่ยนสาขาของคุณที่มุมล่างขวาของหน้าต่างหลัก

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