ฉันย้ายไฟล์โดยใช้git mv
. ตอนนี้ฉันต้องการสร้างความแตกต่างในไฟล์ใหม่เพื่อเปรียบเทียบกับไฟล์เก่า (ด้วยชื่อเก่าตอนนี้ไม่มีอยู่จริง)
ฉันต้องทำอย่างไร
ฉันย้ายไฟล์โดยใช้git mv
. ตอนนี้ฉันต้องการสร้างความแตกต่างในไฟล์ใหม่เพื่อเปรียบเทียบกับไฟล์เก่า (ด้วยชื่อเก่าตอนนี้ไม่มีอยู่จริง)
ฉันต้องทำอย่างไร
คำตอบ:
คุณต้องใช้ -M เพื่อให้ git ตรวจหาไฟล์ที่ย้ายโดยอัตโนมัติเมื่อแตกต่างกัน การใช้git diff
knittl ที่กล่าวถึงไม่ได้ผลสำหรับฉัน
เพียงแค่: git diff -M
ควรทำ
เอกสารสำหรับสวิตช์นี้คือ:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
หรือไม่?
git diff
การตรวจสอบการเปลี่ยนชื่อที่ใช้งานได้เฉพาะเมื่อทั้งสองไฟล์เก่าและใหม่ปรากฏในคอลเลกชันของไฟล์ที่ประมวลผลโดย การเรียกใช้git diff -M
ไฟล์เดียว (เปลี่ยนชื่อ) จะไม่รายงานการเปลี่ยนชื่อ
git log --follow -- file_after_move.txt
ใช้ได้ผลดี จะแสดงประวัติทั้งหมดรวมทั้งก่อนการย้าย ความคิดใด ๆ ? git version 2.11.0.windows.1
ฉันกำลังทำงาน
-C
ตัวเลือกสำหรับการตรวจสอบสำเนาเป็นประโยชน์และที่คล้ายกัน ฉันใช้กับ-M
เพื่อดูความแตกต่างที่ฉันได้ refactored หนึ่งไฟล์เป็นสองไฟล์ (โดยที่ชื่อไม่ตรงกับต้นฉบับ)
นอกจากสิ่งที่knittl เขียนแล้วคุณยังสามารถใช้:
git diff HEAD:./oldfilename newfilename
โดยที่HEAD:./oldfilename
หมายถึง oldfilename ในการกระทำสุดท้าย (ใน HEAD) สัมพันธ์กับไดเร็กทอรีปัจจุบัน
หากคุณไม่มีคอมไพล์ใหม่เพียงพอคุณจะต้องใช้แทน:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
ไปที่ไดเร็กทอรีและไม่ต้องเพิ่ม--
ก่อนcommit:path
คู่ Git ดูเหมือนจะจู้จี้จุกจิกมากกับไวยากรณ์ที่นี่
<commit-ish>:<pathname>
ไวยากรณ์คือตัวระบุวัตถุบางอย่าง Git-ish; หลังจาก--
Git ต้องการชื่อไฟล์เท่านั้น
ด้วย git 2.9 (มิถุนายน 2016) คุณจะไม่ต้องเพิ่ม-M
อีกต่อไป git diff
ใช้-M
โดยค่าเริ่มต้น
ดูกระทำ 5404c11 , กระทำ 9501d19 , กระทำ a9276a6 , กระทำ f07fc9e , กระทำ 62df1e6 (25 กุมภาพันธ์ 2016) โดยMatthieu Moy (moy
)
(รวมโดยJunio C Hamano - gitster
-ในการกระทำ 5d2a30d , 3 เมษายน 2016)
diff
: เปิดใช้งานdiff.renames
ตามค่าเริ่มต้นการตรวจจับการเปลี่ยนชื่อเป็นคุณสมบัติที่สะดวกมากและผู้ใช้ใหม่ไม่ควรขุดเอกสารเพื่อใช้ประโยชน์จากมัน
การคัดค้านที่อาจเกิดขึ้นในการเปิดใช้งานการตรวจจับการเปลี่ยนชื่อคือบางครั้งอาจล้มเหลวและบางครั้งก็ช้า แต่การตรวจจับการเปลี่ยนชื่อจะเปิดใช้งานโดยค่าเริ่มต้นแล้วในหลายกรณีเช่น "
git status
" และ "git merge
" ดังนั้นการเปิดใช้งานจึงdiff.renames
ไม่ได้เปลี่ยนสถานการณ์โดยพื้นฐาน เมื่อการตรวจจับการเปลี่ยนชื่อล้มเหลวตอนนี้จะล้มเหลวอย่างต่อเนื่องระหว่าง "git diff
" และ "git status
"การตั้งค่านี้ไม่มีผลต่อคำสั่งเกี่ยวกับระบบประปาดังนั้นสคริปต์ที่เขียนอย่างดีจะไม่ได้รับผลกระทบ
git diff -M
เปิดใช้งานการตรวจจับการเปลี่ยนชื่อตามที่คนอื่นพูด (และตามที่ @VonC ชี้ให้เห็นจะเปิดใช้งานตามค่าเริ่มต้นจาก git 2.9) แต่ถ้าคุณมีชุดการเปลี่ยนแปลงขนาดใหญ่การตรวจจับการเปลี่ยนชื่อที่ไม่แน่นอนอาจยังคงถูกปิดอีกครั้ง Git จะแสดงคำเตือนดังต่อไปนี้ซึ่งง่ายต่อการพลาดท่ามกลางความแตกต่างที่คุณกำลังรับชม:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
ในกรณีนั้นให้ตั้งค่าตัวเลือกการกำหนดค่าตามที่คอมไพล์แนะนำเช่น
git config diff.renamelimit 450
และรันคำสั่ง diff ของคุณอีกครั้ง
ไม่ว่าด้วยเหตุผลใดก็ตามการใช้HEAD:./oldfilename
(หรือเส้นทางสัมบูรณ์) ไม่ได้ผลสำหรับฉัน แต่HEAD:oldfilename
ทำ (ขอบคุณ cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
เพียงแค่เรียกใช้git diff
โดยไม่มีข้อโต้แย้งใด ๆ หรือgit diff -- newfilename
. git ฉลาดพอที่จะเปรียบเทียบไฟล์ / เนื้อหาที่เหมาะสม (เช่นเนื้อหาต้นฉบับก่อนเปลี่ยนชื่อด้วยเนื้อหาที่เปลี่ยนแปลงหลังจากเปลี่ยนชื่อ)
git mv
ตั้งไฟล์เดียวแล้วเปรียบเทียบสถานะการจัดฉากกับสาขาอื่นที่เหมือนกันจะทำให้เกิดความแตกต่าง "ทุกอย่างถูกลบและสร้างขึ้นใหม่อีกครั้ง" เว้นแต่-M
จะใช้
git diff -- yourRenamedFile
ก็เพียงพอแล้ว ดูคำตอบของฉันด้านล่าง