ฉันจะแก้ไข git ว่า "ยอมรับการเปลี่ยนแปลงของคุณหรือซ่อนพวกเขาก่อนที่จะผสาน"?


762

ฉันทำการอัปเดตบางอย่างในเครื่องท้องถิ่นของฉันผลักพวกเขาไปยังที่เก็บข้อมูลระยะไกลและตอนนี้ฉันกำลังพยายามดึงการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์และฉันได้รับข้อความ

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

wp-content / w3tc-config / master.php

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

ดังนั้นฉันวิ่ง

git checkout -- wp-content/w3tc-config/master.php

และลองอีกครั้งและฉันได้รับข้อความเดียวกัน ฉันสมมติว่าw3tcมีการเปลี่ยนแปลงบางอย่างในไฟล์กำหนดค่าบนเซิร์ฟเวอร์ ฉันไม่สนใจว่าสำเนาโลคัลหรือสำเนารีโมตจะทำงานบนเซิร์ฟเวอร์หรือไม่ (ฉันคิดว่ารีโมตนั้นดีที่สุด) ฉันต้องการรวมการเปลี่ยนแปลงที่เหลือ (การอัปเดตปลั๊กอิน)

ความคิดใด ๆ



11
นี่เป็นคำถามที่ชัดเจนยิ่งขึ้นพร้อมรายละเอียดเพิ่มเติมและคำตอบที่ดีกว่า ฉันคิดว่ามันมีค่าที่จะรักษาสิ่งนี้ ใช่คนอื่นถูกถามทางเทคนิคก่อน แต่การลบอันนี้ออกจะทำให้ผู้คนค้นหาคำตอบที่พวกเขาต้องการได้ยากขึ้น
Jo Sprague

คำตอบ:


1300

คุณไม่สามารถรวมกับการดัดแปลงในเครื่อง Git ปกป้องคุณจากการสูญเสียการเปลี่ยนแปลงที่สำคัญ

คุณมีสามตัวเลือก:

  • ยอมรับการเปลี่ยนแปลงโดยใช้

    git commit -m "My message"
    
  • สะสมไว้

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

    หากต้องการซ่อนให้พิมพ์

    git stash
    

    ทำการผสานแล้วดึงที่ซ่อน:

    git stash pop
    
  • ยกเลิกการเปลี่ยนแปลงในเครื่อง

    ใช้งานgit reset --hard
    หรือgit checkout -t -f remote/branch

    หรือ: ยกเลิกการเปลี่ยนแปลงในระบบสำหรับไฟล์ที่ต้องการ

    การใช้ git checkout filename


104
นอกจากนี้คุณยังสามารถละทิ้งการเปลี่ยนแปลงในท้องถิ่นสำหรับไฟล์ที่ระบุได้โดยทำ: git checkout ชื่อไฟล์
ckb

6
ขอบคุณ ฉันจะเพิ่มไปนี้ถ้าคุณทำgit reset --hardคุณอาจต้องการลบไฟล์ที่ไม่ได้ติดตามด้วยgit clean -dfx
Jo Sprague

13
โดยค่าเริ่มต้นgit stashจะไม่ซ่อนไฟล์ที่ไม่มีประวัติ ดังนั้นหากคุณมีไฟล์ที่คุณยังไม่ได้เพิ่ม แต่จะถูกเขียนทับหรือ "สร้าง" โดยการผสานแล้วการผสานจะยังคงปิดกั้น ในสถานการณ์เช่นนั้นคุณสามารถใช้git stash -uเพื่อซ่อนไฟล์ที่ไม่ได้รับอนุญาต หรือคุณสามารถลบได้!
joeytwiddle

25
การวิ่งgit clean -dfxเป็นความคิดที่แย่มาก ลบไฟล์. gitignored บางอันที่ฉันต้องการจริงๆ
ezuk

5
ฉันพบสถานการณ์ที่ผู้ใช้หลังจากดำเนินการgit reset --hardแล้วยังมีการเปลี่ยนแปลงที่ยังไม่ได้รวม!
Amedee Van Gasse

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

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

คำสั่งที่สองสลับสาขา

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


1
stackoverflow.com/questions/15286075/…สามารถเป็นประโยชน์ได้เช่นกัน
vikramvi

2
ที่จะอธิบาย @ จุด vikramvi: เรายังสามารถใช้แทนgit stash pop git stash applyอดีตลบมันออกจากที่ซ่อนในขณะที่คนหลังยังคงอยู่ที่นั่น
Anupam

27

คุณสามารถลองวิธีใดวิธีหนึ่งต่อไปนี้:

rebase

สำหรับการเปลี่ยนแปลงอย่างง่ายให้ลองรีบูตด้านบนขณะที่ดึงการเปลี่ยนแปลงเช่น

git pull origin master -r

ดังนั้นมันจะใช้สาขาปัจจุบันของคุณที่ด้านบนของสาขาอัปสตรีมหลังจากดึงข้อมูล

นี่เทียบเท่ากับ: checkout master, fetchและrebase origin/masterคำสั่ง git

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


เช็คเอาท์

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

git checkout origin/master -f
git checkout master -f

รีเซ็ต

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

git reset HEAD --hard

หากด้านบนไม่สามารถช่วยได้อาจเป็นกฎในไฟล์ git normalization ( .gitattributes) ของคุณดังนั้นจึงควรที่จะยอมรับสิ่งที่กล่าวไว้ หรือระบบไฟล์ของคุณไม่รองรับการอนุญาตดังนั้นคุณต้องปิดการใช้งานfilemodeในการกำหนดค่า git ของคุณ

ที่เกี่ยวข้อง: ฉันจะบังคับให้ "git pull" เขียนทับไฟล์ภายในเครื่องได้อย่างไร


1
ไม่ทำงาน: ฉันยังได้รับข้อความเดิมเช่น "ซ่อนการเปลี่ยนแปลงของคุณก่อน" เมื่อฉันพิมพ์ "git stash" แล้ว "git pull" -> "ข้อผิดพลาด: คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก .. ทำการซ่อนไว้ก่อน" สั้น ๆ ก่อนที่จะทำลายคอมพิวเตอร์ของฉัน
trinity420

@ trinity420 อาจเป็นสิทธิ์ไฟล์ของคุณตรวจสอบgit statusว่ามีการเปลี่ยนแปลงใดบ้างหลังจาก stashing หากไม่มีคำตอบให้ลองเพิ่มคำถามใหม่
kenorb

ขอบคุณ แต่ปัญหาของฉันได้รับการแก้ไขลองทุกอย่างที่นี่ไม่มีอะไรทำงานแล้วคลิก "กระทำการเปลี่ยนแปลง" "ผสาน" ใน PHPS รูปแบบจากนั้นฉันก็ปลดการเปลี่ยนแปลงและมันก็ทำงานได้ ..
trinity420


13

ดังนั้นสถานการณ์ที่ฉันพบคือ:

ข้อผิดพลาด: การเปลี่ยนแปลงในท้องถิ่นของคุณสำหรับไฟล์ต่อไปนี้จะถูกเขียนทับโดยการผสาน: wp-content / w3tc-config / master.php โปรดยอมรับการเปลี่ยนแปลงของคุณหรือซ่อนไว้ก่อนที่จะผสาน

ยกเว้นก่อนหน้านั้นเป็นระยะไกล: จริง ๆ แล้วนี่:

รีโมต: ข้อผิดพลาด: การเปลี่ยนแปลงในท้องถิ่นของคุณสำหรับไฟล์ต่อไปนี้จะถูกเขียนทับโดยการรวม: บางส่วน / file.ext โปรดยอมรับการเปลี่ยนแปลงของคุณหรือซ่อนการเปลี่ยนแปลงก่อนที่คุณจะสามารถผสาน

สิ่งที่เกิดขึ้นคือ (ฉันคิดว่าไม่ได้เป็นบวก 100%) ตะขอ git post ได้รับการเริ่มทำงานและเมามากขึ้นเนื่องจากการเปลี่ยนแปลงการเคลื่อนไหวในที่เก็บเซิร์ฟเวอร์ระยะไกลซึ่งในทางทฤษฎีไม่ควรได้รับการสัมผัส

ดังนั้นสิ่งที่ฉันลงเอยด้วยการติดตามผ่านตะขอหลังการรับและการค้นหาสิ่งนี้คือต้องไปที่พื้นที่เก็บข้อมูลระยะไกลบนเซิร์ฟเวอร์และมีการเปลี่ยนแปลง (ซึ่งไม่ได้อยู่ในพื้นที่เก็บข้อมูลท้องถิ่นของฉันซึ่งอันที่จริงแล้ว บอกว่ามันตรงกับที่ไม่มีการเปลี่ยนแปลงไม่มีอะไรที่จะกระทำทันสมัย ​​ฯลฯ ) ดังนั้นในขณะที่ในท้องถิ่นไม่มีการเปลี่ยนแปลงบนเซิร์ฟเวอร์ฉันทำgit checkout -- some/file.extแล้วจากนั้นที่เก็บข้อมูลในพื้นที่และระยะไกลจับคู่กันจริงและฉันสามารถ ยังคงทำงานและปรับใช้ ไม่แน่ใจทั้งหมดว่าสถานการณ์นี้เกิดขึ้นได้อย่างไรแม้ว่านักพัฒนาซอฟต์แวร์สักสิบสองคนรวมถึงการเปลี่ยนแปลงด้านไอทีอาจมีส่วนเกี่ยวข้องกับเรื่องนี้


2
มันเป็นคำถามหรือคำตอบ?
stdcall

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

7

คำเตือน: การดำเนินการนี้จะลบไฟล์ที่ไม่ได้ติดตามดังนั้นจึงไม่ใช่คำตอบที่ดีสำหรับคำถามนี้

ในกรณีของฉันฉันไม่ต้องการเก็บไฟล์ดังนั้นสิ่งนี้จึงใช้ได้สำหรับฉัน:

Git 2.11 และใหม่กว่า:

git clean  -d  -fx .

Git ที่เก่ากว่า:

git clean  -d  -fx ""

การอ้างอิง: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x หมายถึงไฟล์ที่ถูกละเว้นจะถูกลบเช่นเดียวกับไฟล์ที่ไม่รู้จัก git

  • -d หมายถึงลบไดเรกทอรีที่ไม่ได้ติดตามนอกเหนือจากไฟล์ที่ไม่ได้ติดตาม

  • -f จำเป็นต้องบังคับให้เรียกใช้


4

หากต้องการบันทึกไฟล์ที่สร้างขึ้นใหม่ของคุณในขณะที่แก้ไขปัญหานี้:

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

  1. จัดการการเปลี่ยนแปลงในพื้นที่ของคุณ (อย่ากระทำ) การจัดเตรียมเป็นสิ่งจำเป็นในการสร้างแพทช์ของไฟล์ที่สร้างขึ้นใหม่ (เนื่องจากยังไม่ได้ติดตาม)

git add .

  1. สร้างชุดข้อมูลแก้ไขเพื่อเก็บบันทึก

git diff --cached > mypatch.patch

  1. ยกเลิกการเปลี่ยนแปลงในเครื่องและลบไฟล์ในเครื่องใหม่

git reset --hard

  1. ดึงการเปลี่ยนแปลง

git pull

  1. ใช้แพทช์ของคุณ

git apply mypatch.patch

Git จะรวมการเปลี่ยนแปลงและสร้างไฟล์. rej สำหรับการเปลี่ยนแปลงที่ไม่ได้ผสาน

ตามที่ Anu แนะนำถ้าคุณมีปัญหาในการใช้โปรแกรมปะแก้ลอง:

git apply --reject --whitespace=fix mypatch.patch คำตอบนี้คอมไพล์ไม่ได้ใช้พูดถึงรายละเอียดเกี่ยวกับปัญหานี้

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


ฉันต้องการที่จะผลักดันส่วนของรหัสด้วยการเปลี่ยนแปลงใหม่ดังนั้นฉันจึงได้: 1. สร้างแพตช์ออกมาจากสาขา dev ในพื้นที่ของฉัน 2. ทำการฮาร์ดรีเซ็ต 3. ดึงการเปลี่ยนแปลงใหม่จากต้นแบบไปยัง dev (เพื่อหลีกเลี่ยงความขัดแย้งผสาน) . มีการเปลี่ยนแปลงเล็กน้อยใน dev ท้องถิ่นของฉัน 5. ถูกผลักไปยัง dev dev แบบรีโมต 6. นำ patch มาใช้แล้ว -> มีข้อผิดพลาด: error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyฉันยังมี mypatch.patch แต่ไม่รู้ว่าทำไมมันถึงไม่ได้ใช้และสูญเสียการเปลี่ยนแปลง !
Anu

ฉันเข้าใจแล้วคำสั่งที่ถูกต้องคือgit apply --reject --whitespace=fix mypatch.patchฉันได้รับการเปลี่ยนแปลงกลับมาแล้ว !!! [ขอบคุณที่] ( stackoverflow.com/a/15375869/6484358 )
Anu

1
อย่างไรก็ตาม, คำสั่ง git ใช้ mypatch.patch นั้นถูกต้องเพื่อใช้ patch นี่คือสิ่งที่ฉันใช้ตลอดเวลาอาจมีปัญหากับ patch ที่สร้างขึ้นเองและคุณจะไม่สูญเสียการเปลี่ยนแปลงหากคุณมี patch อยู่ในมือ มีการเปลี่ยนแปลงรวมทั้งหมด
Manpreet

2

ขอความมุ่งมั่นก่อนที่จะดึง

  • คอมไพล์สะสม
  • คอมไพล์ดึงต้นกำเนิด << branchname >>

หากมีความจำเป็น :

  • git stash นำไปใช้

1
ใช้ git stash เมื่อคุณต้องการบันทึกสถานะปัจจุบันของไดเรกทอรีทำงานและดัชนี แต่ต้องการกลับไปที่ไดเรกทอรีทำงานที่สะอาด คำสั่งบันทึกการแก้ไขโลคัลของคุณออกไปและแปลงไดเร็กทอรีทำงานให้ตรงกับ HEAD commit
Pushpak Sharma

2

สำหรับฉันgit reset --hardทำงานได้เท่านั้น

ความมุ่งมั่นไม่ใช่ทางเลือกเนื่องจากไม่มีอะไรจะกระทำ

การสะสมไม่ใช่ตัวเลือกเพราะไม่มีอะไรจะซ่อน

ดูเหมือนว่าจะเป็นไฟล์ที่ถูกแยกออก.git/info/excludeและมีgit update-index --assume-unchanged <file>บางไฟล์


0

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

จากนั้นฉันก็แทนที่ไฟล์คัดลอกกลับในเนื้อหาและดำเนินการต่อราวกับว่าไม่มีอะไรเกิดขึ้น



0

ฉันลองคำตอบแรก: git stashด้วยคะแนนสูงสุด แต่ข้อความแสดงข้อผิดพลาดยังคงปรากฏขึ้นจากนั้นฉันพบบทความนี้เพื่อยอมรับการเปลี่ยนแปลงแทนที่จะซ่อน'Reluctant Commit'

และข้อความแสดงข้อผิดพลาดหายไปในที่สุด:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

จากนั้นก็ใช้งานได้ หวังว่าคำตอบนี้จะช่วย :)


0

หากคุณใช้ส่วนขยาย Gitคุณควรจะสามารถค้นหาการเปลี่ยนแปลงในท้องถิ่นได้จากWorking directoryที่แสดงด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

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

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อคุณพบการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด

เลือกบรรทัดที่มีWorking directoryนำทางไปยังแท็บDiffคลิกขวาที่แถวที่มีไอคอนดินสอ (หรือ+หรือ-) เลือกรีเซ็ตเป็นกระทำครั้งแรกหรือกระทำหรือซ่อนหรือสิ่งที่คุณต้องการจะทำกับมัน


0

สำหรับฉันแล้วสิ่งนี้ได้ผล:

git reset --hard

แล้ว

git pull origin <*current branch>

หลังจากนั้น

git checkout <*branch>


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