วิธีดูไฟล์ต่าง ๆ ในคอมไพล์ก่อนคอมมิท


443

สิ่งนี้มักจะเกิดขึ้นกับฉัน:

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

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

สิ่งที่ต้องการ:

git diff --changed /myfile.txt

และมันจะพิมพ์ออกมาเช่น:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

ด้วยวิธีนี้ฉันสามารถเห็นสิ่งที่ฉันทำในไฟล์นั้นได้อย่างรวดเร็วตั้งแต่มีการเช็คอินครั้งล่าสุด

คำตอบ:


732

หากคุณต้องการดูสิ่งที่คุณยังไม่ได้git addแก้ไข:

git diff myfile.txt

หรือถ้าคุณต้องการที่จะเห็นการเปลี่ยนแปลงเพิ่มแล้ว

git diff --cached myfile.txt

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

2
คุณจะออกจากไฟล์ได้อย่างไร
Kick Buttowski

3
@Kick ลองกดq
wjandrea

นอกจากนี้ถ้าคุณต้องการที่จะลบโง่ 'A /' และ 'b /' คำนำหน้าในผล diff git config --global diff.noprefix trueคุณสามารถตั้งค่า
เหลียง

64
git diff HEAD file

จะแสดงการเปลี่ยนแปลงที่คุณเพิ่มใน worktree ของคุณจากการส่งครั้งล่าสุด การเปลี่ยนแปลงทั้งหมด (ฉากหรือฉากไม่) จะปรากฏขึ้น


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

17

วิธีตรวจสอบความแตกต่างในท้องถิ่น:

git diff myfile.txt

หรือคุณสามารถใช้เครื่องมือ diff (ในกรณีที่คุณต้องการยกเลิกการเปลี่ยนแปลงบางส่วน):

git difftool myfile.txt

หากต้องการใช้git difftoolอย่างมีประสิทธิภาพยิ่งขึ้นให้ติดตั้งและใช้เครื่องมือ GUI ที่คุณโปรดปรานเช่น Meld, DiffMerge หรือ OpenDiff

หมายเหตุ: คุณยังสามารถใช้.(แทนชื่อไฟล์) เพื่อดูการเปลี่ยนแปลง dir ปัจจุบัน

ในการตรวจสอบการเปลี่ยนแปลงในแต่ละบรรทัดให้ใช้: git blameซึ่งจะแสดงว่ามีการผูกสายใดในการคอมมิท


หากต้องการดูไฟล์จริงก่อนการส่งมอบ ( masterให้สาขาของคุณอยู่ที่ไหน) ให้รัน:

git show master:path/my_file

15

คุณลองตัวเลือก-v(หรือ--verbose) เพื่อgit commitหรือยัง มันเพิ่มความแตกต่างของความมุ่งมั่นในการแก้ไขข้อความ


คำตอบที่ดี. สิ่งนี้สามารถให้ข้อมูลในการแก้ไขการกระทำทำให้ฉันกระทำได้ง่ายขึ้น มีวิธีใดในการปิดพื้นที่ข้อมูลChanges not staged for commit:ซึ่งสามารถทำให้ตัวแก้ไขคอมมิทต์สะอาดขึ้น
Radian Jheng

15

อีกเทคนิคที่ควรพิจารณาหากคุณต้องการเปรียบเทียบไฟล์กับการคอมมิทล่าสุดซึ่งมีความหมายมากขึ้น:

git diff master myfile.txt

ข้อดีของเทคนิคนี้คือคุณสามารถเปรียบเทียบกับการกระทำครั้งสุดท้ายด้วย:

git diff master^ myfile.txt

และหนึ่งก่อนหน้านั้น:

git diff master^^ myfile.txt

นอกจากนี้คุณสามารถแทนที่ '~' สำหรับตัวอักษรคาเร็ต '^' และ 'คุณสาขาชื่อ' สำหรับ 'ต้นแบบ' หากคุณไม่ได้อยู่ในสาขาหลัก


14

ฉันคิดว่านี่เป็นกรณีการใช้งานที่สมบูรณ์แบบที่รับประกัน GUI - แม้ว่าฉันเข้าใจว่ามันสามารถทำได้ดีพอในบรรทัดคำสั่ง

โดยส่วนตัวแล้วฉันจะทำทุกอย่างจาก git-gui ซึ่งฉันสามารถสร้างพันธะอะตอมหลายอันด้วยการแยก hunks / บรรทัดถ้ามันเหมาะสมที่จะทำ

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


ฉันเห็นด้วย - มันยังช่วยให้คุณแก้ไขข้อความยืนยันในขณะที่ดูต่าง
François

เป็นการดีที่จะรู้ แต่ฉันต้องการที่จะยึดติดกับ CLI ฉันใช้แพ็กเกจคู่ที่มี แต่ฉันย้ายไปที่ terminal / vim อย่างเคร่งครัดสำหรับเวิร์กโฟลว์ของฉัน ขอบคุณแม้ว่า
Sauce McBoss

ใช่ถ้าคุณใช้ GUI มีคุณสมบัติเจ๋ง ๆ มากมายgit bisectที่ไม่สามารถเข้าถึงได้จริงๆ
NoBugs

2
ฉันเห็นด้วย - มีตัวเลือกมากมายซึ่งเร็วกว่ามากและสมเหตุสมผลกว่าที่จะใช้บรรทัดคำสั่ง อย่างไรก็ตามการดูตัวอย่างการเปลี่ยนแปลงไม่ใช่หนึ่งในนั้น
VitalyB

นอกจากนี้ยังมีส่วนต่อประสานข้อความผู้ใช้ที่ทำงานในเทอร์มินัล สิ่งที่ควรค่าแก่การตรวจสอบคือtig"อินเตอร์เฟสโหมดข้อความสำหรับ Git"
smido

10

บน macOS ไปที่ไดเรกทอรีราก git และป้อน git diff *


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

4

วิธีที่ดีที่สุดที่ฉันค้นพบนอกเหนือจากการใช้ GUI การมอบหมายเฉพาะคือการใช้git difftool -d- นี่เป็นการเปิดเครื่องมือ diff ของคุณในโหมดการเปรียบเทียบไดเรกทอรีเปรียบเทียบ HEAD กับโฟลเดอร์สกปรกปัจจุบัน


สิ่งที่ฉันต้องการ ขอบคุณ
Ivan Ferrer Villa

3
git difftool -d HEAD filename.txt

สิ่งนี้แสดงการเปรียบเทียบโดยใช้หน้าต่างช่องแยก VI ในเทอร์มินัล

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