2008-09-10 29 views
225

Cách tốt nhất để nhận nhật ký cam kết trên một chi nhánh kể từ khi nhánh được phân nhánh từ nhánh hiện tại là gì? Giải pháp của tôi cho đến nay là:Cách nhận các thay đổi trên chi nhánh trong Git

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

Các tài liệu cho git-diff chỉ ra rằng git diff A...B tương đương với git diff $(git-merge-base A B) B. Mặt khác, tài liệu cho git-rev-parse cho biết rằng r1...r2 được định nghĩa là r1 r2 --not $(git merge-base --all r1 r2).

Tại sao những sự khác biệt này lại khác nhau? Lưu ý rằng git diff HEAD...branch mang lại cho tôi những khác biệt mà tôi muốn, nhưng lệnh git log tương ứng cung cấp cho tôi nhiều hơn những gì tôi muốn.

Trong hình ảnh, cho rằng điều này:

 
     x---y---z---branch 
     /
---a---b---c---d---e---HEAD 

Tôi muốn để có được một bản ghi gồm các cam kết x, y, z.

  • git diff HEAD...branch cho những cam kết
  • Tuy nhiên, git log HEAD...branch cho x, y, z, c, d, e.
+0

Bạn đang sử dụng "git log" không chính xác cho mục đích của mình từ những gì tôi có thể thấy. Tôi đã thêm câu trả lời của tôi dưới đây. – PlagueHammer

Trả lời

161

Trong ngữ cảnh của danh sách sửa đổi, A...B là cách định nghĩa git-rev-parse. git-log nhận danh sách sửa đổi. git-diff không có danh sách các bản sửa đổi - phải mất một hoặc hai bản sửa đổi và đã xác định cú pháp A...B có nghĩa là cú pháp được xác định trong trang man git-diff. Nếu git-diff không xác định rõ ràng A...B thì cú pháp đó sẽ không hợp lệ. Lưu ý rằng trang chủ git-rev-parse mô tả A...B trong phần "Chỉ định phạm vi" và mọi thứ trong phần đó chỉ hợp lệ trong trường hợp phạm vi sửa đổi hợp lệ (nghĩa là khi danh sách sửa đổi được mong muốn).

Để nhận nhật ký chỉ chứa x, y và z, hãy thử git log HEAD..branch (hai dấu chấm, không phải ba). Điều này giống hệt với git log branch --not HEAD và có nghĩa là tất cả các cam kết trên chi nhánh không có trên HEAD.

+26

Wow, điều đó thật khó hiểu. Nó chỉ ra rằng sử dụng "git diff HEAD..branch" cho thấy tất cả các cam kết (x, y, z, c, d, e), nhưng "git log HEAD..branch" thực hiện chính xác những gì tôi muốn và chỉ hiển thị x, y , z! Điều này hoàn toàn trái ngược với việc sử dụng "...". –

+20

'git diff HEAD..branch' giống hệt với' git diff HEAD branch'. Điều quan trọng cần nhớ ở đây là bản ghi có một danh sách/phạm vi sửa đổi, trong khi diff thì không. Đó là lý do tại sao họ đối xử với người khác của họ. –

60
git cherry branch [newbranch] 

thực hiện chính xác những gì bạn đang yêu cầu, khi bạn ở chi nhánh master.

Tôi cũng rất thích:

git diff --name-status branch [newbranch] 

Mà không phải là chính xác những gì bạn đang yêu cầu, nhưng vẫn còn rất hữu ích trong bối cảnh tương tự.

+0

Ah, đó cũng là một điều tuyệt vời! –

+7

'git cherry' xuất ra một danh sách các ID cam kết. Tôi có thể chuyển đổi chúng thành một khác biệt duy nhất kết hợp tất cả các thay đổi trong mọi cam kết không? –

+1

'git cherry' rất hữu ích. Cảm ơn :) – jkp

22

này cũng tương tự như câu trả lời tôi được đăng trên: Preview a Git push

Thả các chức năng này vào hồ sơ Bash của bạn:

  • gbout - git branch đi
  • gbin - git branch incoming

Bạn có thể sử dụng như sau:

  • Nếu trên tổng thể: gbin branch1 < - này sẽ cho bạn thấy những gì trong branch1 và không chủ
  • Nếu trên tổng thể: gbout branch1 < - điều này sẽ cho bạn thấy những gì trong tổng thể đó không phải là trong ngành 1

Điều này sẽ hoạt động với bất kỳ chi nhánh nào.

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 
} 
4
git log --cherry-mark --oneline from_branch...to_branch 

(3dots) nhưng đôi khi nó cho thấy '+' thay vì '='

+0

3 dấu chấm cho thấy cam kết đầu tiên trên nhánh hai lần trong khi hai không. –

30

gì bạn muốn xem đây là danh sách các cam kết đi. Bạn có thể làm điều này bằng

git log master..branchName 

hoặc

git log master..branchName --oneline 

đâu tôi cho rằng "BRANCHNAME" đã được tạo ra như là một chi nhánh theo dõi các "bậc thầy".

Tương tự, để xem các thay đổi đến bạn có thể sử dụng:

git log branchName..master 
+1

@ A-B-B, nếu branchName bị bỏ qua, nó mặc định là "head", đó là branchName hiệu quả trong ví dụ trên. – PlagueHammer

7

Ném một -p trong đó để xem một số thay đổi tập tin

git log -p master..branch 

Làm cho một số bí danh:

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

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

Xem cam kết duy nhất của một chi nhánh:

gbl 
+0

Tôi thích cảm ơn bí danh tuyệt vời! –

2

tôi thấy

git diff <branch_with_changes> <branch_to_compare_to> 

hữu ích hơn, vì bạn không chỉ nhận được những thông điệp mà cả diff cam kết.Nếu bạn đã ở trên nhánh bạn muốn xem các thay đổi và (ví dụ) muốn xem những gì đã thay đổi thành bản chính, bạn có thể sử dụng:

git diff HEAD master 
6

Để xem nhật ký của nhánh hiện tại kể từ khi phân nhánh thạc sĩ off:

git log master...

Nếu bạn hiện đang chủ, để xem nhật ký của một chi nhánh khác nhau vì nó phân nhánh off chủ:

git log ...other-branch

8

Tương tự như một số câu trả lời như Alex V và NDavis, nhưng không có câu trả lời nào giống nhau.

Khi đã có trong chi nhánh tại câu hỏi

Sử dụng:

git diff master... 

nào kết hợp một số tính năng:

  • nó siêu ngắn
  • cho thấy những thay đổi thực tế

Cập nhật:

Điều này có thể là git diff master, nhưng điều này cũng cho thấy sự khác biệt, không phải là các cam kết như câu hỏi được chỉ định.

+0

Nếu bạn có 'git co master; git pull' kể từ khi bạn tạo nhánh, 'git diff master' sẽ không được sử dụng nhiều để có được sự khác biệt được giới thiệu chỉ bởi các commit trong nhánh đã chỉ định. – guival

Các vấn đề liên quan