git: สลับแบรนช์และไม่สนใจการเปลี่ยนแปลงใด ๆ


318

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

ข้อผิดพลาด: คุณมีการเปลี่ยนแปลงในท้องถิ่นเป็น "X"; ไม่สามารถสลับสาขาได้

ฉันสามารถเปลี่ยนสาขาได้โดยไม่ต้องทำอะไร? ถ้าเป็นเช่นนั้นฉันจะตั้งค่านี้ได้อย่างไร ถ้าไม่ฉันจะออกจากปัญหานี้ได้อย่างไร ฉันต้องการเพิกเฉยต่อการเปลี่ยนแปลงเล็กน้อยโดยไม่ยอมรับและเพียงเปลี่ยนสาขา


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

1
สวัสดี Jeremy คุณหมายถึงอะไร 'staged'? การบังคับให้ผู้ใช้ทำการส่งไฟล์ก่อนที่การเปลี่ยนแปลงสาขาจะไม่เหมือนกับเวิร์กโฟลว์ที่ยอดเยี่ยม ตัวอย่างเช่นถ้าฉันอยู่ในที่เก็บข้อมูลหลักและต้องการตรวจสอบบางอย่างในสาขาอย่างรวดเร็ว ฉันต้องคอมมิทโค้ดให้กับมาสเตอร์ก่อนแม้ว่ามันจะเขียนโค้ดได้ครึ่งนึงก็ตาม! คุณกำลังบอกว่าจริง ๆ แล้วมันควรจะเป็นไปได้ที่จะชำระเงินสาขาในสถานการณ์นี้?
Daniel Farrell

@boyfarrell คุณสามารถใช้ 'Git stash' เพื่อบันทึกการเปลี่ยนแปลงชั่วคราวโดยไม่ต้องมีคำสั่ง
Howiecamp


1
เมื่อคุณเปลี่ยนเป็นสาขาโดยไม่ยอมรับการเปลี่ยนแปลงในสาขาเก่า git พยายามที่จะรวมการเปลี่ยนแปลงกับไฟล์ในสาขาใหม่ หากการผสานเสร็จสิ้นโดยไม่มีข้อขัดแย้งใด ๆ กิ่งก้านสาขาจะประสบความสำเร็จและคุณสามารถเห็นการเปลี่ยนแปลงในสาขาใหม่ได้ แต่หากมีข้อขัดแย้งเกิดขึ้นคุณจะได้รับerror: You have local changes to '<filename>'; cannot switch branches.และสาขาจะไม่เปลี่ยนแปลง คุณสามารถทำได้git checkout -m <branch-name>เพื่อรวมความขัดแย้งและเช็คเอาต์เข้ากับสาขาและแก้ไขข้อขัดแย้งด้วยตัวคุณเองหรือgit checkout -f <branch-name>เพื่อละเว้นการเปลี่ยนแปลง
samad montazeri

คำตอบ:


400

คุณต้องมีสถานะที่สะอาดเพื่อเปลี่ยนสาขา เช็คเอาต์สาขาจะได้รับอนุญาตหากไม่มีผลกับ 'ไฟล์สกปรก' (ตามที่Charles Baileyพูดในความคิดเห็น)

มิฉะนั้นคุณควร:

  • ซ่อนการเปลี่ยนแปลงปัจจุบันของคุณหรือ
  • reset --hard HEAD (ถ้าคุณไม่รังเกียจที่จะสูญเสียการเปลี่ยนแปลงเล็กน้อย) หรือ
  • checkout -f (เมื่อสลับสาขาให้ดำเนินการต่อแม้ว่าดัชนีหรือแผนผังการทำงานจะแตกต่างจาก HEAD ซึ่งจะใช้เพื่อเปลี่ยนแปลงการเปลี่ยนแปลงในท้องถิ่น)

หรืออีกไม่นาน:

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

สิ่งนี้แตกต่างจากgit switch -m <branch-name>สิ่งที่ทำให้เกิดการรวมสามทางระหว่างสาขาปัจจุบันเนื้อหาต้นไม้ทำงานของคุณและสาขาใหม่เสร็จสิ้น: คุณจะไม่ทำให้งานของคุณคืบหน้าไปในทางนั้น


34
"คุณต้องมีสถานะที่สะอาดเพื่อเปลี่ยนสาขา" จะเป็นจริงเฉพาะในกรณีที่การเปลี่ยนแปลงสาขามีผลต่อ 'ไฟล์สกปรก'
CB Bailey

10
สำหรับวิธีการสะสมฉันพิมพ์ "git stash save", "git checkout otherbranch" และสุดท้าย "git stash pop"
Venkat D.

1
ขณะนี้ฉันไม่เห็นข้อความแสดงข้อผิดพลาดนี้และการเปลี่ยนแปลงที่ฉันทำในสาขาหนึ่งจะปรากฏขึ้นที่อื่นเมื่อฉัน "สถานะ git" มีอะไรเปลี่ยนแปลงบ้างไหม?
Senthil A Kumar

2
ขอบคุณ เช็คเอาท์ -f คือสิ่งที่ฉันต้องการ ฉันได้ตั้งค่า git - ฮาร์ด git สะอาด -f ชำระเงิน git mybranch -f
nologo

1
นี่คือสิ่งที่ยอดเยี่ยม Git ผิดทั้งหมดโดยการละเมิดคำจำกัดความพื้นฐานของสาขา ซึ่งแตกต่างจากสาขา git หมายถึงสองพื้นที่ทำงานที่แตกต่างกันโดยสิ้นเชิงแยกจากพื้นที่เก็บข้อมูล
nehem

125

หากคุณต้องการยกเลิกการเปลี่ยนแปลง

git checkout -- <file>
git checkout branch

หากคุณต้องการเปลี่ยนแปลง

git stash save
git checkout branch
git stash pop

10
อันที่จริงสิ่งที่ Romerun กล่าวว่า (จะเสร็จสมบูรณ์): git stash save(เมื่ออยู่ใน branchy ทำงาน) แล้วgit checkout branchXทำอะไรบางอย่างgit add/commit -mฯลฯgit checkout branchYและgit stash popที่จะได้รับกลับมาสะสม
Highmastdon

2
อาจจะเป็นเช่นนั้น ฉันมีสถานการณ์ แต่ที่ฉันต้องการทำสิ่งที่คำตอบบอกว่าถ้าฉันเข้าใจถูกต้อง: เปลี่ยนการเปลี่ยนแปลงเปลี่ยนจาก Y เป็น X จากนั้นป๊อปการเปลี่ยนแปลงและกระทำพวกเขาใน X
Ben Klein

1
โปรดทราบว่าgit stash saveขณะนี้เลิกใช้แล้วgit stash push
Argento

นามแฝงนี้ทำให้กรณีของการเปลี่ยนแปลงง่ายขึ้นเมื่อเปลี่ยนสาขา
Tom Hale

62

ก็ควรจะเป็น

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
ใช่สะสมเป็นสากลไม่เฉพาะสาขาถ้าฉันซ่อนป๊อปหลังจากเปลี่ยนสาขาฉันจะได้รับสะสมเดียวกับสาขาอื่น ๆ
Aditya Mittal

6
ควรระบุว่าgit stashจะใช้ค่าเริ่มต้นเป็นgit stash save
Charlie-Greenman

ขอบคุณมันมีประโยชน์มากสำหรับฉัน
Govind Kumar


16

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

git reset --hard origin/HEAD

HEAD เพียงอย่างเดียวจะอ้างถึงการกระทำในท้องถิ่น / ผสาน - หลายครั้งที่ฉันลืมว่าเมื่อรีเซ็ตและจบด้วย "พื้นที่เก็บข้อมูลของคุณคือ X มุ่งมั่นที่จะไปข้างหน้า .. " เมื่อฉันตั้งใจอย่างเต็มที่ที่จะทำให้การเปลี่ยนแปลง / กระทำทั้งหมด .


9

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

git reset --hard HEAD

จากนั้นคุณจะสามารถสลับสาขาได้


9

ไม่มีคำตอบใด ๆ ที่ช่วยฉันได้เพราะฉันยังมีไฟล์ที่ไม่ได้ติดตามแม้หลังจากรีเซ็ตและซ่อนแล้ว ฉันต้องทำ:

git reset --hard HEAD
git clean -d -f

4

เปลี่ยนเป็นสาขาใหม่ที่สูญเสียการเปลี่ยนแปลง:

git checkout -b YOUR_NEW_BRANCH_NAME --force

เปลี่ยนเป็นสาขาเดิมที่มีการสูญเสียการเปลี่ยนแปลง:

git checkout YOUR_BRANCH --force

4

คำตอบง่าย ๆ :

คือบังคับให้ชำระเงินที่สาขา

git checkout -f <branch_name>

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

หรือในกรณีที่คุณกำลังตรวจสอบการกระทำ

git checkout -f <commit-hash>


"คิดว่าฉันสามารถเปลี่ยนสาขาได้โดยไม่ต้องทำอะไรถ้าเป็นเช่นนั้นฉันจะตั้งได้อย่างไรถ้าไม่ฉันจะออกจากปัญหานี้ได้อย่างไร"

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


คุณตัดสินใจที่จะเปลี่ยนแปลงหรือไม่

จากนั้นซ่อนไว้โดยใช้

git stash

จากนั้นเมื่อต้องการยกเลิกการเปลี่ยนแปลงการเปลี่ยนแปลงในสาขาที่ต้องการให้ใช้

git stash apply

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

git stash pop

นั่นเทียบเท่าapplyแล้วdrop


2

ปิดเทอร์มินัลลบโฟลเดอร์ที่โครงการของคุณเป็นอยู่จากนั้นโคลนโครงการของคุณและvoiláอีกครั้ง


2
git ไม่ได้ออกแบบมาเพื่อผลักดันให้คุณลบโครงการและโคลนอีกครั้ง! หากคุณต้องการได้รับเวอร์ชั่นล่าสุดจากแหล่งกำเนิดคุณก็แค่reset --hard!
Ahmed Nour Jamal El-Din

2

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

git stash && git checkout <branch_name> && git stash pop

1

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

ฉันสร้าง.gitconfigนามแฝงสำหรับสิ่งนี้:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

หากต้องการเปลี่ยนเป็นnew-branch-nameใช้:

git spcosp new-branch-name

และการเปลี่ยนแปลงไฟล์และดัชนีที่ไม่ได้ทำไว้จะถูกเก็บไว้


1

git checkout -f your_branch_name

git checkout -f your_branch_name

หากคุณมีปัญหาในการคืนค่าการเปลี่ยนแปลง:

git checkout .

หากคุณต้องการลบไดเรกทอรีและไฟล์ที่ไม่ได้ติดตาม:

git clean -fd

0

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

git checkout -f Branch-name

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