มีวิธีดูไฟล์ที่มีการเปลี่ยนแปลงในสาขาหรือไม่?
มีวิธีดูไฟล์ที่มีการเปลี่ยนแปลงในสาขาหรือไม่?
คำตอบ:
ทางเลือกอื่นสำหรับคำตอบโดย @Marco Ponti และหลีกเลี่ยงการชำระเงิน:
git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
หากเชลล์เฉพาะของคุณไม่เข้าใจโครงสร้าง $ () ให้ใช้เครื่องหมายขีดแทน
git diff --name-only <some-other-branch>
<some-other-branch>
จะแสดงสิ่งที่ไฟล์ที่แตกต่างกันระหว่างสาขาปัจจุบันของคุณและ ดังนั้นมันเป็นหลักคำสั่งเดียวกัน แต่ทราบว่าคุณสามารถใช้ในการค้นหาไฟล์ที่มีความแตกต่างกันระหว่างใด ๆสองสาขาถึงแม้ว่าพวกเขาจะไม่ได้เกี่ยวข้องกับระยะไกล ไม่ว่าการเปรียบเทียบนั้นจะมีประโยชน์หรือไม่ขึ้นอยู่กับโทโพโลยีของสาขาของคุณ ... นอกจากนี้โปรดทราบว่า<some-other-branch>
จริงๆแล้วอาจมีการกระทำใด ๆ หรือสิ่งใดก็ตามที่สามารถแก้ไขให้เป็นหนึ่ง
<notMainDev>
และ<MY_CURRENT_CO_BRANCH>
เมื่อเร็ว ๆ นี้มีบรรพบุรุษร่วมกันและเปรียบเทียบ<notMainDev>
กับบรรพบุรุษที่ คุณจะต้องระบุชื่อสาขาปัจจุบันของคุณตามที่git merge-base
คาดไว้สองอาร์กิวเมนต์ - ไม่มีทางลัดอย่างน้อยในเวอร์ชันปัจจุบัน
git branch | grep '\*' | awk '{print $2}'
ที่จะได้รับการยอมรับสำหรับสาขาระหว่าง <notMainDev> และสาขาปัจจุบันของฉัน แล้วฉันจะทำคอมไพล์ diff --name เท่านั้น <notMainDev> $ (คอมไพล์ผสานฐาน <notMainDev> git branch | grep '\*' | awk '{print $2}'
)
สิ่งที่คุณต้องทำคือ:
git checkout <notMainDev>
git diff --name-only <mainDev>
นี่จะแสดงเฉพาะชื่อไฟล์ที่แตกต่างระหว่างสองกิ่ง
<mainDev>
ตั้งแต่กิ่งก้านสาขาแตกต่างกันไป คุณอาจต้องการใช้git diff --name-only <sha-of-branch-point>
แทนหรือดูคำตอบอื่นที่ฉันโพสต์ไว้เพื่อหลีกเลี่ยงการชำระเงิน
notMainDev
จะได้รับการปรับปรุงด้วย mainDev มุ่งมั่น ... ฉันมักจะพบว่ามีประโยชน์ในการเห็นความแตกต่างเหล่านั้นเช่นกัน
<sha-of-branch-point>
พร้อมกับgit rev-parse <branch-name>
ประหลาดใจที่เรื่องนี้ยังไม่ได้รับการกล่าวถึง!
git diff master...branch
ดังนั้นดูการเปลี่ยนแปลงเฉพาะใน branch
เพื่อตรวจสอบการใช้งานสาขาปัจจุบัน
git diff master...
ขอบคุณ jqr
นี่คือมือสั้น ๆ สำหรับ
git diff $(git merge-base master branch) branch
ดังนั้นฐานการผสาน (การคอมมิชชันล่าสุดระหว่างกิ่ง) และปลายกิ่ง
การใช้ Origin / Master แทน Master เพียงอย่างเดียวจะช่วยในกรณีที่ Master ท้องถิ่นของคุณลงวันที่
git diff --name-only master..
หากคุณต้องการชื่อไฟล์ที่แตกต่างระหว่างสองสาขา
ฉันไม่อยากจะเชื่อว่ามีหลายวิธีในการทำเช่นนี้ ฉันใช้ whatchanged เป็นคนที่โพสต์ก่อนหน้านี้ด้วยข้อโต้แย้งต่อไปนี้:
git whatchanged --name-only --pretty="" origin..HEAD
นี่เป็นเพียงรายการชื่อไฟล์และมีเพียงชื่อที่เปลี่ยนแปลงในสาขาปัจจุบัน
ฉันชอบคำตอบของ @ twalberg แต่ฉันไม่ต้องการพิมพ์ชื่อสาขาปัจจุบันตลอดเวลา ดังนั้นฉันใช้สิ่งนี้:
git diff --name-only $(git merge-base master HEAD)
git diff master... --name-only
เมื่อทำงานในสาขาเป้าหมายและได้รับผลลัพธ์เดียวกัน คุณจะกรุณาแสดงความเห็นต่อสิ่งที่ดีหรือไม่ดีระหว่างคำตอบของคุณกับคำสั่งที่ฉันให้ไว้ได้ไหม
git diff master.. --name-only
(หมายเหตุมีเพียง 2 จุดแทน 3) เพื่อให้เข้าใจความหมายของจุดต่าง ๆ ให้ดูคำตอบนี้
git diff --name-only master...branch-name
ที่เราต้องการเปรียบเทียบ
ถ้ามันง่ายอย่างนี้ล่ะ?
git changed
หากคุณยินดีที่จะสมมติว่าสาขาหลักเรียกว่า "master" และคุณสร้างสาขาอื่นจากต้นแบบคุณสามารถเพิ่มนามแฝงนี้ใน~/.gitconfig
ไฟล์ของคุณเพื่อให้ง่าย:
cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"
สมมติฐานเหล่านั้นจะทำงานสำหรับคนส่วนใหญ่ในสถานการณ์ส่วนใหญ่ แต่คุณต้องระวังว่าคุณกำลังทำพวกเขา
$()
นอกจากนี้คุณต้องใช้เปลือกที่สนับสนุน มันมีโอกาสมากที่เปลือกของคุณสนับสนุนนี้
git show --stat origin/branch_name
นี่จะให้รายการของไฟล์ที่ถูกเพิ่มหรือแก้ไขภายใต้สาขานี้
git-tree
ด้วยเหตุผลบางอย่างที่ไม่มีใครกล่าวถึง ดูhttps://stackoverflow.com/a/424142/1657819
git-tree
เป็นที่ต้องการเพราะมันเป็นคำสั่งการประปา ; ตั้งใจจะเขียนโปรแกรม (และสมมุติเร็วกว่า)
(สมมติว่าเป็นสาขาฐานmaster
)
git diff-tree --no-commit-id --name-only -r master..branch-name
อย่างไรก็ตามสิ่งนี้จะแสดงไฟล์ทั้งหมดที่ได้รับผลกระทบในสาขาหากคุณต้องการดูไฟล์ที่แก้ไขอย่างชัดเจนเท่านั้นคุณสามารถใช้--diff-filter
:
git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M
นอกจากนี้ยังสามารถใช้--name-status
แทน--name-only
เพื่อดูสถานะของไฟล์ ( A
/ M
/ D
และอื่น ๆ )
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
คำตอบที่ยอมรับ - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
- อยู่ใกล้มาก แต่ฉันสังเกตเห็นว่ามันมีสถานะไม่ถูกต้องสำหรับการลบ ฉันเพิ่มไฟล์ในสาขา แต่คำสั่งนี้ (โดยใช้--name-status
) ให้ไฟล์ที่ฉันลบสถานะ "A" และไฟล์ที่ฉันเพิ่ม "D"
ฉันต้องใช้คำสั่งนี้แทน:
git diff --name-only $(git merge-base <notMainDev> <mainDev>)
การตัดออกจากสิ่งที่ @twalberg และ @iconoclast หากคุณใช้ cmd ด้วยเหตุผลใดก็ตามคุณสามารถใช้:
FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y
ไฟล์แบตช์ต่อไปนี้ขึ้นอยู่กับคำตอบของ twalberg แต่จะใช้ได้ใน Windows:
@ECHO OFF
C: :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE
ด้านบนจะถือว่าสาขาหลักคือ Origin / master และ Git bash นั้นถูกรวมไว้เมื่อติดตั้ง Git (และตำแหน่งของมันอยู่ในสภาพแวดล้อมของพา ธ ) ฉันต้องการแสดงความแตกต่างที่เกิดขึ้นจริงโดยใช้เครื่องมือ diff ที่กำหนดค่าไว้ (kdiff3) เพื่อแทนที่คำสั่ง bash ต่อไปนี้ด้านบน:
bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"
ฉันใช้grepดังนั้นฉันจะได้รับบรรทัดที่มีdiff --gitซึ่งเป็นเส้นทางของไฟล์:
git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json