ข้อผิดพลาด: ไม่สามารถดึงด้วย rebase: คุณมีการเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้


139

ฉันได้เริ่มทำงานร่วมกับเพื่อนสองสามคนในโครงการและพวกเขาใช้ที่เก็บ git ของ heroku

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

ฉันรันgit pull --rebaseคำสั่งตามที่ระบุไว้ที่นี่ (วิธีนี้เป็นวิธีที่ถูกต้องหรือไม่): https://devcenter.heroku.com/articles/sharing#merging-code-changes

ฉันได้รับข้อผิดพลาดต่อไปนี้:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

ฉันเดาว่าฉันยุ่งกับรหัสและตอนนี้มันต้องการให้ฉันยอมรับหรือทิ้ง (ซ่อนหมายถึงอะไร?) การเปลี่ยนแปลง นี่คือสิ่งที่เกิดขึ้นหรือไม่? หากเป็นกรณีนี้ฉันต้องการยกเลิกการเปลี่ยนแปลงใด ๆ ที่ฉันอาจทำและรับโค้ดที่อัปเดตจากที่เก็บ git

มีความคิดว่าฉันจะทำอะไรได้บ้าง?

คำตอบ:


174

Do git statusนี้จะแสดงให้คุณเห็นว่าอะไรเป็นไฟล์ที่มีการเปลี่ยนแปลง เนื่องจากคุณระบุว่าคุณไม่ต้องการเก็บการเปลี่ยนแปลงที่คุณสามารถทำได้git checkout -- <file name>หรือgit reset --hardเพื่อกำจัดการเปลี่ยนแปลง

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

git status นอกจากนี้ยังมีวิธีกำจัดการเปลี่ยนแปลงขึ้นอยู่กับว่าไฟล์นั้นถูกจัดเตรียมสำหรับการคอมมิตหรือไม่


1
ดูเหมือนว่าจะได้ผล แต่ตอนนี้ฉันพบข้อผิดพลาดอีกครั้ง (เริ่มคำถามใหม่เพื่อไม่ให้สับสนกับผู้เข้าชมในอนาคต): stackoverflow.com/questions/23518247/…
user3597950

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

@KarmaBlackshaw คุณไม่จำเป็นต้องบังคับผลักดัน หากคุณต้องออกแรงผลักนั่นหมายความว่าประวัติท้องถิ่นของคุณและประวัติระยะไกลนั้นแตกต่างกันและนั่นเป็นคำถามที่แตกต่างจากที่คำตอบนี้ครอบคลุม
Schleis

มันแตกต่างกันที่ขอบเขตของคำถามนี้ให้ไว้ แต่ฉันพบวิธีโดยการลบสาขาปัจจุบันและสร้างสาขาใหม่จากการพัฒนา ฉันเดาว่าเป็นสาขาของฉันที่มีการกำหนดค่าบางอย่างผิดพลาด
Karma Blackshaw

91

หากคุณต้องการที่จะให้มีการเปลี่ยนแปลงการทำงานของคุณในขณะที่ประสิทธิภาพ rebase --autostashคุณสามารถใช้ จากเอกสารประกอบ :

ก่อนที่จะเริ่ม rebase ให้ซ่อนการแก้ไขในเครื่อง (ดูgit-stash [1] ) หากจำเป็นและใช้ที่เก็บเมื่อเสร็จสิ้น

ตัวอย่างเช่น:

git pull --rebase --autostash

7
นี่คือคำตอบที่ทันสมัย
adl

13
หากคุณต้องการให้การตั้งค่าอัตโนมัติเป็นพฤติกรรมเริ่มต้นคุณสามารถตั้งค่าได้git config --global rebase.autoStash true จากนั้นคุณไม่จำเป็นต้องผ่านสวิตช์
Zoredache

1
นี่คือสิ่งที่ฉันกำลังมองหา! (โปรดทราบว่าสวิตช์บรรทัดคำสั่งพร้อมใช้งานจาก git 2.9 แต่ตัวเลือกrebase.autostashสามารถใช้ได้จาก 2.6)
jjmontes

มันใช้งานได้ดีgit rebase --interactiveเช่นกัน!
Dan Dascalescu

6
เหตุใดจึงไม่เป็นค่าเริ่มต้น
Nick

49

การดึงด้วย rebase เป็นแนวทางปฏิบัติที่ดีโดยทั่วไป

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

คุณสามารถแก้ปัญหานี้ได้โดยสมมติว่าคุณต้องการเก็บการเปลี่ยนแปลงของคุณ:

  1. ซ่อนการเปลี่ยนแปลงของคุณด้วย: git stash
  2. ดึงจากต้นแบบด้วย rebase
  3. นำการเปลี่ยนแปลงที่คุณซ่อนไว้ใน (1) มาใช้ใหม่ด้วย: git stash apply stash@{0}หรือวิธีที่ง่ายกว่าgit stash pop

1
ดูเหมือนว่าจะได้ผล แต่ตอนนี้ฉันพบข้อผิดพลาดอื่น (เริ่มคำถามใหม่เพื่อไม่ให้สับสนกับผู้เข้าชมในอนาคต): stackoverflow.com/questions/23518247/…
user3597950

6
@nehemiahjacob นอกจากนี้คุณยังสามารถgit stash popที่จะนำการเปลี่ยนแปลง stashed ที่สุดเมื่อเร็ว ๆ apply stash@{0}นี้และเพื่อหลีกเลี่ยงการจำอีกต่อไป
Kostas Rousis

ฉันต้องทำแบบนี้ตลอดเวลา วิธีที่ง่ายกว่านี้ไหม
Alper

โดยปกติแล้วคุณจะทำงานในสาขา (ฟีเจอร์) อื่น จากประสบการณ์ของฉันฉันดึงข้อมูลและต่อต้านมาสเตอร์หลังจากที่ฉันทำงานของฉันเสร็จแล้วเท่านั้นดังนั้นจึงไม่จำเป็นต้องซ่อน / ป๊อป หากคุณพบว่าตัวเองทำเช่นนั้นบ่อยครั้งในระหว่างขั้นตอนการพัฒนาคุณสามารถสร้างนามแฝงใน.bashrc(หรืออะไรก็ได้ที่คุณใช้):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@KostasRousis ฉันมีนามแฝงที่แน่นอนฮ่า ๆ ฉันเรียกมันว่า 'sppgit'
luizfls

30

เริ่มต้นด้วยไฟล์ git status

ดูว่าคุณมีการเปลี่ยนแปลงที่รอดำเนินการอยู่หรือไม่ หากต้องการทิ้งให้เรียกใช้

git reset --hard

ดูเหมือนว่าจะได้ผล แต่ตอนนี้ฉันพบข้อผิดพลาดอีกครั้ง (เริ่มคำถามใหม่เพื่อไม่ให้สับสนกับผู้เข้าชมในอนาคต): stackoverflow.com/questions/23518247/…
user3597950

16

สิ่งนี้ใช้ได้กับฉัน:

git fetch
git rebase --autostash FETCH_HEAD

1
อ่า autostash นั่นช่วยฉันได้อีกสองคำสั่ง นี่ควรเป็นคำตอบที่ถูกต้อง IMO
Erik Berkun-Drevnig

10

คุณสามารถทำได้เสมอ

git fetch && git merge --ff-only origin/master

และคุณจะได้รับ (a) ไม่มีการเปลี่ยนแปลงหากคุณมีการเปลี่ยนแปลงที่ไม่ได้กำหนดไว้ซึ่งขัดแย้งกับการเปลี่ยนแปลงต้นน้ำหรือ (b) ผลเช่นเดียวกับการเก็บ / ดึง / ใช้: ฐานข้อมูลใหม่ที่จะนำคุณไปสู่การเปลี่ยนแปลงล่าสุดจาก HEAD และการเปลี่ยนแปลงที่ไม่ได้กำหนดไว้ของคุณทิ้งไว้ อย่างที่เป็น.


6

เมื่อการเปลี่ยนแปลงที่ไม่มีขั้นตอนเป็นเพราะ git กำลังพยายามแก้ไขข้อตกลง eol ในไฟล์ (เช่นเดียวกับกรณีของฉันเสมอ) จำนวนการเก็บรักษาหรือการเช็คเอาต์หรือการรีเซ็ตจะทำให้หายไป

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

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! มันยังไม่ทำให้ฉันล้มเหลว


2

หากคุณต้องการซ่อนการเปลี่ยนแปลงของคุณโดยอัตโนมัติและยกเลิกการเก็บข้อมูลสำหรับทุก rebase คุณสามารถทำได้:

git config --global rebase.autoStash true

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