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


115

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

นี่คือสิ่งที่ฉันกำลังทำอยู่:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

ฉันคิดว่าในขณะที่ใช้กิ่งไม้ไม่ว่าคุณจะทำอะไรในสาขาหนึ่งสาขาอื่น ๆ ทั้งหมดจะมองไม่เห็น นั่นไม่ใช่เหตุผลของการสร้างกิ่งก้าน?

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

คำตอบ:


142

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


10
git stash pop จะดีกว่าเว้นแต่ว่าคุณต้องการสร้างกองซ้อนจำนวนมาก
siride

7
@JPZ: git stash เกี่ยวข้องกับไฟล์ที่ติดตามเท่านั้น ไฟล์ใหม่จะไม่ถูกติดตามดังนั้นจึงไม่ถูกซ่อน
siride

2
@JPZ: หากคุณต้องการซ่อนไฟล์ที่ไม่ได้ติดตามสิ่งที่ต้องทำคือgit addพวกเขาก่อนที่จะเก็บ ที่กล่าวว่าฉันไม่แน่ใจว่าคุณต้องการซ่อนไว้ที่นี่จริง ๆ - หากคุณตั้งใจให้การเปลี่ยนแปลงเหล่านั้นเป็นส่วนหนึ่งของสาขาที่คุณเปลี่ยนไปให้ยอมรับ (หากคุณตั้งใจที่จะเปลี่ยนกลับไปที่สาขานั้นและดำเนินการกับการเปลี่ยนแปลงให้มากขึ้นก่อนที่จะดำเนินการstashอาจเป็นเครื่องมือที่เหมาะสมสำหรับงานนั้น)
Cascabel

16
"การเปลี่ยนสาขาจะทำให้เกิดการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดกับคุณ" - สิ่งนี้สมเหตุสมผลและอาจเป็นแนวคิดการออกแบบที่แย่ที่สุด อะไรคือจุดสำคัญในการมีสาขาหากคุณไม่สามารถทำงานแบบโดดเดี่ยว !!!
nehem

1
ในกรณีของฉันฉันมีสาขาคุณลักษณะหนึ่งสาขาจากสาขาการพัฒนา ฉันยอมรับในสาขาคุณลักษณะ แต่แสดงการเปลี่ยนแปลงเมื่อฉันชำระเงินสาขาการพัฒนาเช่นกัน
Hitesh Garg

31

คำตอบสั้น ๆ : ใช่คุณต้องกระทำ ตรวจสอบให้แน่ใจว่าคุณทำในสาขาที่ถูกต้อง แต่!

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

ดังนั้นหากคุณมีการเปลี่ยนแปลงที่คุณไม่ได้กระทำการเปลี่ยนแปลงเหล่านี้จะไม่ได้รับผลกระทบจากการเปลี่ยนสาขา แน่นอนว่าหากการเปลี่ยนสาขาเข้ากันไม่ได้กับการเปลี่ยนแปลงของคุณgit checkoutก็จะปฏิเสธที่จะทำ

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

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