จะจัดการกับมันได้อย่างไรในทันใดนั้นความมุ่งมั่นที่กำลังดำเนินอยู่ดูเหมือนจะขึ้นกับสิ่งที่ยังไม่ได้ทำ?


13

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

เมื่อฉันโค้ดจะมีวิธีการจากบนลงล่างตามธรรมชาติ (เพราะฉันไม่รู้อนาคต) และมีธีมที่ทำให้เกิดปัญหาซ้ำ:

ฉันทำงานบางอย่าง
ฉันพบว่าเพื่อให้งานของฉันเป็นเรื่องที่ "ยอมรับได้" ฉันต้องทำงานอื่น
งานอื่น ๆ สมควรได้รับมันเป็นความมุ่งมั่นของตัวเอง

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

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


1
ฉันพบว่าตัวเองอยู่ในสถานการณ์เดียวกันบ่อยครั้งเมื่อเพิ่มไลบรารีและการกำหนดค่า ฉันแค่ใช้git statusเพื่อดูไฟล์ที่ถูกเปลี่ยนทั้งหมดและทำคอมมิทตั้งแต่สองไฟล์ขึ้นไปโดยใช้git addกับไฟล์เฉพาะ (แทนgit add --all) และคอมเม้นท์ทีละชิ้น
Chris Cirefice

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

คำตอบ:


17

มีหลายวิธีในการแก้ปัญหานี้

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

อีกวิธีหนึ่งคือทำการเปลี่ยนแปลงที่จำเป็นทั้งหมดแล้วสร้างการผูกมัดสองครั้งซึ่งมีส่วนหนึ่งของงานของคุณ ในการทำเช่นนั้นคุณสามารถใช้ดัชนี (หรือเรียกอีกอย่างว่าพื้นที่จัดเตรียม) โดย git นี่เป็นพื้นที่พิเศษที่คุณสามารถใช้เพื่อเตรียมความพร้อม git addสมมติว่าคุณมีการเปลี่ยนแปลงหลายไฟล์คุณสามารถเพิ่มแต่ละของพวกเขาที่จะใช้ดัชนี เมื่อทำgit commitไฟล์ที่เพิ่มเข้ากับดัชนีจะได้รับการคอมมิต git statusจะแสดงให้คุณเห็นว่าส่วนใดของการเปลี่ยนแปลงที่คุณทำไว้ ตัวอย่างเช่นจะมีลักษณะเช่นนี้หลังจากเปลี่ยนไฟล์ a.txt, b.txt และ c.txt และหลังจากนั้นgit add a.txt:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

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:   b.txt
        modified:   c.txt

เมื่อคุณทำgit commitในสถานะนี้เฉพาะการเปลี่ยนแปลง a.txt เท่านั้นที่จะถูกเพิ่มในการกระทำของคุณ

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

หากหนึ่งไฟล์มีการเปลี่ยนแปลงสำหรับการกระทำทั้งสองคุณสามารถเพิ่มเฉพาะบางส่วนของมันลงในดัชนีโดยใช้ "git add --patch b.txt" git จะให้โหมดโต้ตอบซึ่งจะถามคุณเกี่ยวกับการเปลี่ยนแปลงในไฟล์ที่กำหนดหากควรจะเพิ่มในดัชนี สิ่งนี้อาจยากขึ้นหากคุณมีการเปลี่ยนแปลงในบรรทัดที่อยู่ติดกันซึ่งต้องแยกออกเป็นสองส่วน แต่ก็มีวิธีแก้ไขเช่นกัน

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับพื้นที่การแสดงละครคุณอาจต้องการอ่านสิ่งนี้: http://gitready.com/beginner/2009/01/18/the-staging-area.html

คุณอาจต้องการอ่านเพิ่มเติมเกี่ยวกับการเพิ่มเชิงโต้ตอบที่นี่: http://nuclearsquid.com/writings/git-add/


5

หากคุณใช้ GUI สำหรับ Git เช่น SourceTree โดย Atlassian หรือgit guiคุณสามารถส่งไฟล์บางส่วนและปล่อยให้ส่วนอื่น ๆ ปราศจากข้อผูกมัด ในความเป็นจริงคุณสามารถส่งรหัสแต่ละบรรทัดได้

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

คุณสามารถทำได้จากบรรทัดคำสั่ง แต่มันค่อนข้างงุ่มง่าม

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


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