ฉันจะดูสิ่งที่เปลี่ยนแปลงในไฟล์ก่อนที่จะคอมไพล์ git ได้อย่างไร?


351

ฉันสังเกตเห็นว่าในขณะที่ทำงานกับตั๋วหนึ่งหรือสองใบถ้าฉันก้าวออกไปฉันไม่แน่ใจว่าฉันทำอะไรอยู่สิ่งที่เปลี่ยนแปลงไป ฯลฯ

มีวิธีดูการเปลี่ยนแปลงที่ทำสำหรับไฟล์ที่กำหนดก่อนที่จะเพิ่มคอมไพล์แล้วคอมไพล์กระทำหรือไม่?

คำตอบ:


525

git diffคุณกำลังมองหา ขึ้นอยู่กับสถานการณ์ที่แน่นอนของคุณมีสามวิธีที่เป็นประโยชน์ในการใช้งาน:

# show differences between index and working tree
# that is, changes you haven't staged to commit
git diff [filename]
# show differences between current commit and index
# that is, what you're about to commit
# --staged does exactly the same thing, use what you like
git diff --cached [filename]
# show differences between current commit and working tree
git diff HEAD [filename]

มันจะทำงานซ้ำในไดเรกทอรีและหากไม่มีเส้นทางที่กำหนดก็จะแสดงการเปลี่ยนแปลงทั้งหมด


1
@ sveilleux2 ไม่เพียงแค่เรียกใช้คอมไพล์โดยไม่มีข้อโต้แย้งใด ๆ - ตามประโยคสุดท้ายของคำตอบที่กล่าวว่าหากไม่มีการกำหนดพา ธ มันจะแสดงการเปลี่ยนแปลงทั้งหมด (วงเล็บเปิด[filename]แสดงอาร์กิวเมนต์ที่เป็นทางเลือก) เมื่อ*คุณให้เชลล์แสดงรายการไฟล์ทั้งหมดดังนั้นหากคุณอยู่ในไดเรกทอรีย่อยคุณจะได้รับสิ่งต่าง ๆ ในไดเรกทอรีย่อยนั้นเท่านั้น (ไม่ใช่ repo ทั้งหมด) และคุณ ' จะพลาดการเปลี่ยนแปลงในไฟล์ที่ซ่อนอยู่
Cascabel

# แสดงความแตกต่างระหว่างการกระทำปัจจุบันและดัชนี # นั่นคือสิ่งที่คุณกำลังจะยอมรับคอมไพล์ diff - แคช [ชื่อไฟล์] คุณไม่ได้หมายถึง: # แสดงความแตกต่างระหว่างการกระทำปัจจุบันและดัชนี # นั่นคือสิ่งที่คุณกำลัง ที่จะผลักดัน ? git diff --cached [filename]
ofarooq

3
หากต้องการดูความแตกต่างที่เกิดขึ้นหลังจากการเพิ่มไฟล์ (เช่นหลังจาก "git add") ให้ทำ "git diff --staged [ชื่อไฟล์]"
Sidtharthan

โอ้ทำไมมันซับซ้อนจัง! จะเป็นอย่างไรถ้าเรามีไฟล์สองถึงสิบไฟล์? .. แค่บ่นกับคอมไพล์อินเตอร์เฟส ... ใช่ดูเหมือนgit add -pจะเป็นทางเลือกในการตรวจสอบไฟล์ทั้งหมด
เคอร์บี้

@Jefromi - โปรดพิจารณาการเพิ่มgit diff --staged [filename]คำตอบหลักของคุณเนื่องจากเป็นสถานการณ์ที่จำเป็นมากกว่า
Lazarus Thurston



8

สำหรับฉันgit add -pเป็นวิธีที่มีประโยชน์มากที่สุด (และฉันคิดว่าโดยนักพัฒนาคอมไพล์?) เพื่อตรวจสอบการเปลี่ยนแปลงที่ไม่มีการจัดทำทั้งหมด (มันแสดงให้เห็นถึงความแตกต่างสำหรับแต่ละไฟล์) ให้เลือกชุดการเปลี่ยนแปลงที่ดี จัดฉากทั้งหมดจากนั้นใช้git commitและทำซ้ำสำหรับการส่งครั้งต่อไป จากนั้นคุณสามารถทำให้การคอมมิชชันแต่ละครั้งเป็นชุดการเปลี่ยนแปลงที่มีประโยชน์หรือมีความหมาย ฉันขอแนะนำให้สร้างสาขาใหม่สำหรับแต่ละตั๋วหรือกิจกรรมที่คล้ายกันและสลับไปมาระหว่างสาขาเหล่านั้นโดยใช้checkout(อาจใช้git stashถ้าคุณไม่ต้องการคอมมิทก่อนเปลี่ยน) แม้ว่าคุณจะทำการเปลี่ยนแปลงอย่างรวดเร็วหลายครั้งก็ตาม อย่าลืมที่จะรวมบ่อยครั้ง


ดังนั้นแทนที่จะใช้ชื่อไฟล์ git add ใช้ git add -p?
ทิโมธีต.

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

5

git diff

แสดงการเปลี่ยนแปลงระหว่างแผนผังการทำงานกับดัชนีหรือแผนผังการเปลี่ยนแปลงระหว่างดัชนีและแผนผังการเปลี่ยนแปลงระหว่างต้นไม้สองต้นหรือการเปลี่ยนแปลงระหว่างสองไฟล์บนดิสก์


ใบเสนอราคาค่อนข้างมาก - โดยค่าเริ่มต้นจะทำการเปรียบเทียบครั้งแรก: ระหว่างแผนผังการทำงานและดัชนี
Cascabel

4

จำไว้ว่าคุณกำลังทำการเปลี่ยนแปลงไม่ใช่ไฟล์

ด้วยเหตุนี้มันหายากมากที่ฉันไม่ได้ใช้git add -p(หรือผู้ที่เทียบเท่า magit) เพื่อเพิ่มการเปลี่ยนแปลงของฉัน


2
คอมไพล์ไม่ได้จัดการกับการเปลี่ยนแปลง - พยายามที่จะคิดเกี่ยวกับมันราวกับว่ามันเป็นแหล่งที่มาหลักของความสับสนและความผิดพลาด คอมไพล์ git กับ snapshots
Chris Dodd

3
git diff <path>/filename

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


2

กรณีของฉันเมื่อคุณไม่ต้องการที่จะดูแลเกี่ยวกับรายการไฟล์ เพียงแสดงให้พวกเขาทั้งหมด

เมื่อคุณรันgit addรายการไฟล์แล้ว:

$ git diff --cached $(git diff --cached --name-only)

ในรุ่นล่าสุดของgitคุณสามารถใช้ยังซึ่งเป็นไวพจน์ของ--staged--cached

สามารถใช้ไฟล์เดียวกันกับที่ยังไม่ได้เพิ่มไฟล์ แต่ไม่มี--cachedตัวเลือก

$ git diff $(git diff --name-only)

นามแฝงคำสั่ง Git สำหรับตัวเลือก "แคช":

$ git config --global alias.diff-cached '!git diff --cached $(git diff --cached --name-only)'

3
ขอบคุณสำหรับรายละเอียด git diff --cached --name-only คือคำสั่งที่ฉันกำลังมองหา ....
Doogle

1

ไปที่ repo git ที่เกี่ยวข้องจากนั้นเรียกใช้คำสั่งด้านล่าง:

ชื่อไฟล์คอมไพล์ git

มันจะเปิดไฟล์ที่มีการเปลี่ยนแปลงที่ทำเครื่องหมายไว้ให้กดปุ่ม return / enter เพื่อเลื่อนลงไฟล์

ชื่อไฟล์ PS ควรมีเส้นทางแบบเต็มของไฟล์หรืออื่น ๆ ที่คุณสามารถเรียกใช้โดยไม่ต้องใช้เส้นทางไฟล์แบบเต็มโดยไปที่ไดเรกทอรี / โฟลเดอร์ของไฟล์นั้น ๆ


0

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

แก้ไขข้อความที่ดีที่จะเรียนรู้ก็GitHub ของ Atom 1.0

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