วิธีรับการเปลี่ยนแปลงในสาขาใน Git


264

วิธีที่ดีที่สุดในการรับบันทึกการเข้าสู่สาขาตั้งแต่เวลาที่แยกจากสาขาปัจจุบันคืออะไร ทางออกของฉันคือ:

git log $(git merge-base HEAD branch)..branch

เอกสารประกอบสำหรับGit-diffบ่งชี้ว่าเทียบเท่ากับgit diff A...B git diff $(git-merge-base A B) Bบนมืออื่น ๆ , เอกสารสำหรับGit-REV-แยกแสดงให้เห็นว่ามีการกำหนดเป็นr1...r2r1 r2 --not $(git merge-base --all r1 r2)

ทำไมเหล่านี้แตกต่างกันอย่างไร โปรดทราบว่านั่นgit diff HEAD...branchเป็นสิ่งที่ฉันต้องการ แต่คำสั่ง git log นั้นให้ฉันมากกว่าที่ฉันต้องการ

ในภาพสมมติว่า:

         x --- --- Y Z --- สาขา
        /
--- สิ่ง --- --- ขค d --- --- --- อี HEAD

ฉันต้องการรับบันทึกที่มีการกระทำ x, y, z

  • git diff HEAD...branch มอบความมุ่งมั่นเหล่านี้
  • อย่างไรก็ตามgit log HEAD...branchให้ x, y, z, c, d, e

คุณกำลังใช้ "บันทึก git" ไม่ถูกต้องสำหรับวัตถุประสงค์ของคุณจากสิ่งที่ฉันเห็น ฉันได้เพิ่มคำตอบของฉันด้านล่าง
PlagueHammer

คำตอบ:


186

ในบริบทของรายการการแก้ไขA...Bเป็นวิธีที่git-rev-parseกำหนดไว้ git-log รับรายการแก้ไข git-diffไม่ใช้รายการการแก้ไข - ใช้การแก้ไขหนึ่งหรือสองครั้งและได้กำหนดA...Bไวยากรณ์เพื่อหมายถึงวิธีการกำหนดในgit-diffmanpage หากgit-diffไม่ได้กำหนดไว้อย่างชัดเจนA...Bแล้วไวยากรณ์นั้นจะไม่ถูกต้อง โปรดทราบว่าgit-rev-parsemanpage อธิบายA...Bในส่วน "การระบุช่วง" และทุกอย่างในส่วนนั้นจะใช้ได้เฉพาะในสถานการณ์ที่ช่วงการแก้ไขนั้นถูกต้อง (เช่นเมื่อต้องการรายการการแก้ไข)

หากต้องการรับบันทึกที่มีเพียง x, y และ z ให้ลองgit log HEAD..branch(สองจุดไม่ใช่สาม) สิ่งนี้เหมือนกันgit log branch --not HEADและหมายถึงการกระทำทั้งหมดในสาขาที่ไม่ได้อยู่ใน HEAD


31
ว้าวมันสับสน ปรากฎว่าการใช้ "git diff HEAD..branch" แสดงการกระทำทั้งหมด (x, y, z, c, d, e) แต่ "git log HEAD..branch" ทำสิ่งที่ฉันต้องการและแสดงเพียง x, y , z! ตรงข้ามกับการใช้ "... "
Greg Hewgill

22
git diff HEAD..branchgit diff HEAD branchเป็นเหมือน สิ่งสำคัญที่ต้องจำไว้ที่นี่คือบันทึกใช้รายการ / ช่วงของการแก้ไขในขณะที่ diff ไม่ได้ นั่นเป็นเหตุผลที่พวกเขาปฏิบัติต่อสิ่งที่แตกต่างกัน
Lily Ballard

4
ดูเหมือนว่าgit diff HEAD...branch(สามจุด) สอดคล้องกับผลลัพธ์ของgit log HEAD..branch
jchook

72
git cherry branch [newbranch]

ทำสิ่งที่คุณขออย่างแน่นอนเมื่อคุณอยู่ในmasterสาขา

ฉันชอบมาก:

git diff --name-status branch [newbranch]

ซึ่งไม่ตรงกับที่คุณขอ แต่ยังมีประโยชน์มากในบริบทเดียวกัน


8
'git cherry' จะแสดงรายการการส่งรหัส ฉันสามารถแปลงสิ่งเหล่านี้ให้เป็นส่วนต่างที่รวมการเปลี่ยนแปลงทั้งหมดในทุกการกระทำได้หรือไม่?
Jonathan Hartley

1
git cherryมีประโยชน์มากแน่นอน ขอบคุณ :)
jkp

2
@JonathanHartley ใช้ครั้งแรกและครั้งสุดท้ายเช่นรหัสกระทำและโยนพวกเขาไปที่gif-diff: หรือตัวอย่างของตัวเองมันเป็นgit diff x..z git diff 13bc4d..8eda3a
towi

3
มันยากที่จะเข้าใจว่ารหัสใดที่จะต้องถูกแทนที่ในคำสั่งของคุณซึ่งหนึ่งในสาขาหรือสาขาใหม่เป็นคำหลักและควรแทนที่ด้วยชื่อสาขาที่กำหนดเอง
pal4life

37

สิ่งที่คุณต้องการดูคือรายการการส่งออก คุณสามารถทำได้โดยใช้

git log master..branchName 

หรือ

git log master..branchName --oneline

ที่ฉันคิดว่า "branchName" ถูกสร้างขึ้นเป็นสาขาการติดตามของ "master"

เพื่อดูการเปลี่ยนแปลงที่เข้ามาคุณสามารถใช้:

git log branchName..master

1
@ABB หากไม่ระบุ branchName จะมีค่าเริ่มต้นเป็น "head" ซึ่งเป็น branchName ที่มีประสิทธิภาพในตัวอย่างด้านบน
PlagueHammer

25

นี่คล้ายกับคำตอบที่ฉันโพสต์: ดูตัวอย่างการกด Git

วางฟังก์ชั่นเหล่านี้ลงในโปรไฟล์ Bash ของคุณ:

  • gbout - git branch ขาออก
  • gbin - git ที่สาขาเข้ามา

คุณสามารถใช้สิ่งนี้เช่น:

  • หากใช้กับ master: gbin branch1 <- สิ่งนี้จะแสดงให้คุณเห็นว่ามีอะไรใน branch1 และไม่ใช่ใน master
  • หากเป็นปรมาจารย์: gbout branch1 <- สิ่งนี้จะแสดงให้คุณเห็นว่ามีอะไรในต้นแบบที่ไม่อยู่ในสาขา 1

สิ่งนี้จะใช้ได้กับทุกสาขา

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

คล้ายกับคำตอบหลายอย่างเช่น Alex V และ NDavis แต่ไม่มีคำตอบใดที่เหมือนกัน

เมื่ออยู่ในสาขาที่มีปัญหา

โดยใช้:

git diff master...

ซึ่งรวมคุณสมบัติหลายประการ:

  • มันสั้นมาก
  • แสดงให้เห็นถึงการเปลี่ยนแปลงที่เกิดขึ้นจริง

ปรับปรุง:

สิ่งนี้น่าจะเป็นgit diff masterแต่ก็แสดงให้เห็นถึงความแตกต่างไม่ใช่สิ่งที่กระทำตามคำถามที่ระบุ


1
หากคุณได้git co master; git pullสร้างสาขาขึ้นมาแล้วคุณgit diff masterจะไม่ต้องใช้ความแตกต่างมากนักในการสร้างความแตกต่างที่เกิดขึ้นโดยการทำคอมมิชชันในสาขาที่ระบุเท่านั้น
guival

1
หรือระบุสาขาอย่างชัดเจน: จะแสดงการเปลี่ยนแปลงที่นำโดยgit diff <branch1>...<branch2> branch2
Alex

10

โยน -p ไปที่นั่นเพื่อดูการเปลี่ยนแปลงของไฟล์

git log -p master..branch

สร้างชื่อแทน:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

ดูข้อผูกพันเฉพาะของสาขา:

gbl

6

หากต้องการดูบันทึกการทำงานของสาขาปัจจุบันตั้งแต่การแยกจากปรมาจารย์:

git log master...

หากคุณอยู่ในปัจจุบันเพื่อดูบันทึกของสาขาที่แตกต่างกันเพราะมันแยกจากปรมาจารย์:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) แต่บางครั้งก็แสดง '+' แทน '='


3 จุดแสดงให้เห็นถึงการกระทำครั้งแรกในสาขาสองครั้งในขณะที่ทั้งสองไม่ได้
TJ Biddle

2

ฉันพบ

git diff <branch_with_changes> <branch_to_compare_to>

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

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