Cách nhận các thay đổi trên một nhánh trong Git


264

Cách tốt nhất để có được một bản ghi các cam kết trên một chi nhánh kể từ thời điểm nó được phân nhánh từ chi nhánh hiện tại là gì? Giải pháp của tôi cho đến nay là:

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

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

Tại sao những điều này khác nhau? Lưu ý rằng git diff HEAD...branchcung cấp cho tôi các khác biệt 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 ảnh, giả sử điều này:

         x --- y --- z --- chi nhánh
        /
--- a --- b --- c --- d --- e --- TRỤ

Tôi muốn nhận một bản ghi chứa các xác nhận x, y, z.

  • git diff HEAD...branch đưa ra những cam kết
  • tuy nhiên, git log HEAD...branchcho x, y, z, c, d, e.

Bạn đang sử dụng "git log" không chính xác cho mục đích của bạn 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.
Bệnh dịch hạch

Câu trả lời:


186

Trong bối cảnh của một danh sách sửa đổi, A...Blà cách git-rev-parsexác định nó. git-log có một danh sách sửa đổi. git-diffkhông lấy 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 A...Bcú pháp có nghĩa là nó được định nghĩa như thế nào trong git-difftrang. Nếu git-diffkhông xác định rõ ràng A...B, thì cú pháp đó sẽ không hợp lệ. Lưu ý rằng git-rev-parsetrang này mô tả A...Btrong phần "Phạm vi chỉ định" và mọi thứ trong phần đó chỉ hợp lệ trong các tình huống trong đó phạm vi sửa đổi là hợp lệ (nghĩa là khi muốn có danh sách sửa đổi).

Để có được một bản ghi 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 git log branch --not HEADvà có nghĩa là tất cả các cam kết trên nhánh không nằm trên CHÍNH.


31
Wow, thật khó hiểu. Hóa ra, sử dụng "git diff HEAD..branch" hiển thị tất cả các xác nhận (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 ngược lại với việc sử dụng "...".
Greg Hewgill

22
git diff HEAD..branchlà giống hệt với git diff HEAD branch. Điều quan trọng cần nhớ ở đây là nhật ký 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 các đối số của họ khác nhau.
Lily Ballard

4
Có vẻ như git diff HEAD...branch(ba dấu chấm) tương ứng với đầu ra củagit log HEAD..branch
jchook

72
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 ở trong masterchi nhánh.

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

git diff --name-status branch [newbranch]

Đó không phải là chính xác những gì bạn yêu cầu, nhưng vẫn rất hữu ích trong cùng một bối cảnh.


8
'git cherry' đưa 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?
Jonathan Hartley

1
git cherrythực sự rất hữu ích Cảm ơn :)
jkp

2
@JonathanHartley Lấy ID đầu tiêncuối cùng giống như các ID cam kết và ném chúng vào gif-diff: git diff x..zhoặc cho ví dụ của riêng tôi git diff 13bc4d..8eda3a.
Towi

3
Thật khó để hiểu mã nào phải được thay thế trong lệnh của bạn vì trong đó một nhánh hoặc newbranch là một từ khóa và nên được thay thế bằng tên nhánh tùy chỉnh
pal4life

37

Những gì bạn muốn thấy là danh sách các cam kết đi. Bạn có thể làm điều này bằng cách sử dụng

git log master..branchName 

hoặc là

git log master..branchName --oneline

Trong đó tôi giả sử rằng "BranchName" đã được tạo như một nhánh theo dõi của "master".

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

git log branchName..master

1
@ABB, nếu BranchName bị bỏ qua, nó mặc định là "head", đó là BranchName hiệu quả trong ví dụ trên.
Bệnh dịch hạch

25

Điều này tương tự như câu trả lời tôi đã đăng trên: Xem trước một cú đẩy Git

Thả các hàm này vào hồ sơ Bash của bạn:

  • gbout - chi nhánh git đi
  • gbin - chi nhánh git đến

Bạn có thể sử dụng như thế này:

  • Nếu trên master: gbin Branch1 <- điều này sẽ cho bạn thấy những gì trong nhánh1 và không phải trong master
  • Nếu trên master: gbout chi nhánh1 <- điều này sẽ cho bạn thấy những gì trong master không nằm trong nhánh 1

Điều này sẽ làm việc với bất kỳ chi nhánh.

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

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

Khi đã ở trong chi nhánh trong câu hỏi

Sử dụng:

git diff master...

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ó lẽ nên 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.


1
Nếu bạn đã git co master; git pulltạo chi nhánh, git diff masterbạn sẽ không sử dụng nhiều để có được sự khác biệt được giới thiệu CHỈ bằng các cam kết trong chi nhánh được chỉ định.
guival

1
Hoặc để xác định rõ ràng các nhánh: git diff <branch1>...<branch2>sẽ hiển thị các thay đổi được giới thiệu bởi branch2.
Alex

10

Ném một -p vào đó để xem một số THAY ĐỔI TẬP TIN

git log -p master..branch

Tạo 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 các cam kết duy nhất của chi nhánh:

gbl

6

Để xem nhật ký của nhánh hiện tại kể từ khi rẽ nhánh chính:

git log master...

Nếu bạn hiện đang ở chế độ chính, để xem nhật ký của một nhánh khác vì nó rẽ nhánh chính:

git log ...other-branch


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

(3dots) nhưng đôi khi nó hiển thị '+' thay vì '='


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

2

tôi đã tìm 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 các thông điệp cam kết mà là toàn bộ khác biệt. Nếu bạn đã ở trên nhánh bạn muốn xem các thay đổi của và (ví dụ) muốn xem những gì đã thay đổi thành chủ, bạn có thể sử dụng:

git diff HEAD master
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.