ฉันจะเห็นการกระทำที่แตกต่างระหว่างกิ่งในคอมไพล์ได้อย่างไร?


341

ฉันอยู่ที่ branch-X และเพิ่มความมุ่งมั่นอีกสองสามข้อไว้บนนั้น ฉันต้องการเห็นความแตกต่างทั้งหมดระหว่าง MASTER และสาขาที่ฉันอยู่ในแง่ของความมุ่งมั่น ฉันสามารถทำ

git checkout master
git log

และจากนั้น

git checkout branch-X
git log

และมองเห็นสิ่งเหล่านี้แตกต่างกันไป แต่ฉันหวังว่าจะง่ายกว่าและมีข้อผิดพลาดน้อยลง


คำตอบ:


324

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

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X

13
นั่นจะไม่แสดงความแตกต่างระหว่างสาขาแม้ว่าจะเป็นสิ่งที่ถูกถาม
Pablo Fernandez heelhook

48
git log --oneline --graph --all --decorate --abbrev-commitจะให้ผลลัพธ์ที่คล้ายกันในคำสั่งสั้น / อ่านง่ายขึ้น
Pablo Fernandez heelhook

4
ฉันชอบสิ่งนี้:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
เอเวอรี่

6
ซับซ้อนมากเกินไป
Shawn Erquhart

12
git log --oneline --graph --all --decorateก็เพียงพอ--abbrev-commitไม่จำเป็นต้อง--onelineมีสั้นสำหรับ--pretty=oneline --abbrev-commit
avmohan

721

คุณสามารถทำเช่นนั้นได้อย่างง่ายดายด้วย

git log master..branch-X

นั่นจะแสดงว่าคุณยอมรับว่า branch-X มี แต่มาสเตอร์ไม่ได้


9
มีตัวเลือกหรือไม่หากสาขาทั้งสองมีข้อผูกพันที่อีกสาขาไม่ได้ทำ ตอนนี้คุณต้องพลิกอาร์กิวเมนต์และเรียกใช้ทั้งสองวิธีเพื่อดูความมุ่งมั่นที่สาขาอื่นไม่มี
Elliott Slaughter

38
หากคุณได้เปลี่ยนไปใช้branch-Xคุณสามารถใช้git log master..
Dave

8
@ElliottSlaughter: หากคุณต้องการค้นหาการคอมมิชชันที่เป็นทั้ง master หรือ branch-X แต่ไม่ใช่ทั้งสองอย่างคุณสามารถใช้git log master...branch-X(สามจุดแทนสอง) ดูman gitrevisionsข้อมูลเพิ่มเติม
Xavier T.

3
คำตอบเพียงครึ่งเดียวเท่านั้นจริงๆ ความมุ่งมั่นในปริญญาโทที่ทำให้สาขาแตกต่างจะไม่ปรากฏขึ้น
jterm

9
หากคอมมิชชันถูกเลือกโดยเชอร์รี่จากสาขา -X เพื่อเป็นหลักสิ่งนี้จะไม่กรองออก พวกเขาจะยังคงอยู่ในรายชื่อของความมุ่งมั่น "ในสาขา -X แต่ไม่ได้อยู่ในระดับปริญญาโท" แม้ว่าพวกเขาจะอยู่ในทั้งสอง ..
Tuffwer

88

ฉันคิดว่ามันเป็นเรื่องของการเลือกและบริบทฉันชอบที่จะใช้

git log origin/master..origin/develop --oneline --no-merges

มันจะแสดงความมุ่งมั่นในการพัฒนาที่ไม่ได้อยู่ในสาขาต้นแบบ

หากคุณต้องการดูว่าไฟล์ใดที่มีการแก้ไขการใช้งานจริง

git diff --stat origin/master..origin/develop --no-merges

หากคุณไม่ได้ระบุอาร์กิวเมนต์มันจะแสดงส่วนต่างแบบเต็ม หากคุณต้องการเห็นภาพที่แตกต่างให้ติดตั้งmeldบน linux หรือWinMergeบน windows ตรวจสอบให้แน่ใจว่าพวกเขาเป็นค่าเริ่มต้น difftools จากนั้นใช้สิ่งที่ชอบ

git difftool -y origin/master..origin/develop --no-merges

ในกรณีที่คุณต้องการเปรียบเทียบกับสาขาปัจจุบัน สะดวกกว่าในการใช้ HEAD แทนชื่อสาขาเช่น use:

git fetch
git log origin/master..HEAD --oneline --no-merges

มันจะแสดงความมุ่งมั่นทั้งหมดที่จะรวมเข้าด้วยกัน


1
หากคุณเปรียบเทียบสาขาที่วางจำหน่ายที่อาจมีการรวม คุณอาจต้องการลบการรวมการกระทำ (ที่ไม่เพิ่มค่าใด ๆ ) ด้วยความช่วยเหลือของพารามิเตอร์--no-mergesเช่น:git log origin/master..HEAD --oneline --no-merges
claudiu.f.marginean

15

ถ้าคุณอยู่บน Linux gitgเป็นหนทางที่จะไปได้อย่างรวดเร็วและมีกราฟิก

หากคุณยืนยันในบรรทัดคำสั่งคุณสามารถใช้:

git log --oneline --decorate

หากต้องการทำให้git logดีขึ้นตามค่าเริ่มต้นฉันมักจะตั้งค่ากำหนดทั่วโลกเหล่านี้:

git config --global log.decorate true
git config --global log.abbrevCommit true

14

ฉันขอแนะนำสิ่งต่อไปนี้เพื่อดูความแตกต่าง "ในการกระทำ" สำหรับความแตกต่างแบบสมมาตรให้ทำซ้ำคำสั่งด้วย args กลับด้าน:

git cherry -v master [your branch, or HEAD as default]

มันแตกต่างจาก git master..branch-X หรือไม่?
ilmirons

2
แน่นอนว่า "git cherry" นั้นฉลาด: แปลจาก "คอมมิท" เป็น "patches / diffs" และสามารถหลีกเลี่ยงการรายงาน "patch" ซึ่งอยู่ในทั้งสองสาขา
mmaruska


4

ไม่ใช่คำตอบที่สมบูรณ์แบบ แต่ใช้งานได้ดีขึ้นสำหรับผู้ที่ใช้ Github:

ป้อนคำอธิบายรูปภาพที่นี่

ไปที่ repo ของคุณ: Insights -> Network


นอกจากนี้การสร้างคำขอดึงจะแสดงความแตกต่างของสาขา
pkamb

OMG ฉันต้องการกอดคุณ
esseara

@esseara ฉันเป็นนักเลงตัวใหญ่เหมือนกัน :)) คุณจะได้รับการต้อนรับ: D
AIon

2

หากคุณต้องการเปรียบเทียบโดยพิจารณาจากข้อความที่ส่งมอบคุณสามารถทำสิ่งต่อไปนี้:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)

1
แทนการใช้--onelineและการcutgit log --format='%s'
ไพพ์

0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

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


0

ฉันใช้คำตอบและพบคำตอบที่เหมาะกับกรณีของฉัน (ตรวจสอบให้แน่ใจว่างานทั้งหมดอยู่ในสาขาที่วางจำหน่าย)

วิธีการอื่น ๆ ใช้งานได้ดี แต่ฉันพบว่าพวกเขาอาจเพิ่มบรรทัดที่ฉันไม่ต้องการเช่นผสานการกระทำที่ไม่เพิ่มมูลค่า

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

หรือคุณสามารถเปรียบเทียบปัจจุบันของคุณกับต้นแบบ

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch มีไว้เพื่อให้แน่ใจว่าคุณกำลังใช้ข้อมูลที่อัปเดต

ด้วยวิธีนี้การคอมมิชชันแต่ละครั้งจะอยู่บนบรรทัดและคุณสามารถคัดลอก / วางลงในเท็กซ์เอดิเตอร์และเริ่มเปรียบเทียบภารกิจกับคอมมิตที่จะถูกรวม

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