Câu hỏi Cách nhận các thay đổi trên nhánh trong Git


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à:

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

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 chỉ ra rằng 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 lại khác nhau? Lưu ý rằng git diff HEAD...branch cung cấp cho tôi những khác biệt mà tôi muốn, nhưng lệnh git log tương ứng cho tôi nhiều hơn những gì tôi muốn.

Trong hình ảnh, giả sử điều này:

         x --- y --- z --- chi nhánh
        /
--- một --- b --- c --- d --- e --- HEAD

Tôi muốn lấy một nhật ký chứa các cam kết x, y, z.

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

234
2017-09-10 07:44


gốc


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ể nhìn thấy. Tôi đã thêm câu trả lời của tôi dưới đây. - PlagueHammer


Các câu trả lời:


Trong ngữ cảnh của danh sách sửa đổi, A...B tôi chỉ ra git-rev-parse định nghĩa nó. git-log nhận danh sách sửa đổi. git-diff khô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...B cú pháp có nghĩa là nó được định nghĩa như thế nào trong git-diff manpage. Nếu git-diff không xác định rõ ràng A...Bthì cú pháp đó sẽ không hợp lệ. Lưu ý rằng git-rev-parse manpage mô tả A...B trong phần "Chỉ định phạm vi" và mọi thứ trong phần đó chỉ hợp lệ trong các trường hợp có 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 chấm, không phải ba). Điều này giống hệt với git log branch --not HEADvà có nghĩa là tất cả các cam kết trên chi nhánh không có trên HEAD.


165
2017-09-10 07:50



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 "...". - Greg Hewgill
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ọ. - Kevin Ballard


git cherry branch [newbranch]

thực hiện chính xác những gì bạn đang hỏi, khi bạn ở trong master chi 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 đang yêu cầu, nhưng vẫn rất hữu ích trong cùng một bối cảnh.


63
2017-11-07 21:24



Ah, đó cũng là một điều tuyệt vời! - Greg Hewgill
'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? - Jonathan Hartley
git cherry thực sự rất hữu ích. Cảm ơn :) - jkp
@JonathanHartley Đầu tiên và Cuối cùng giống như ID cam kết và đưa 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
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à cần được thay thế bằng tên chi nhánh tùy chỉnh - pal4life


Những gì bạn muốn xem là danh sách các cam kết gửi đ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

Tôi giả định rằng "branchName" đã được tạo thành một nhánh theo dõi của "master".

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

git log branchName..master

30
2017-11-20 02:37



@ 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


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

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

  • gbout - git branch outgoing
  • gbin - git branch đến

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

  • Nếu trên master: gbin branch1 <- this sẽ cho bạn thấy những gì trong branch1 và không ở trong bậc thầy
  • Nếu trên master: gbout branch1 <- điều này sẽ cho bạn thấy những gì trong bậc thầy không ở chi nhánh 1

Điều này sẽ làm việc 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
}

22
2018-05-14 00:41





Tương tự như một số câu trả lời như Alex V và NDavis, nhưng không ai trong số họ là hoàn toàn giống nhau.

Khi đã ở chi nhánh được đề cập

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 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.


11
2018-05-09 12:03



Nếu bạn đã git co master; git pull kể từ khi bạn tạo chi 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 cam kết trong chi nhánh đã chỉ định. - guival
Hoặc để chỉ đị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


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 cam kết duy nhất của một nhánh:

gbl

8
2017-08-14 20:21



Tôi yêu cảm ơn bí danh tuyệt vời! - Lance Badger


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

git log master...

Nếu bạn hiện đang ở chế độ chủ, hãy xem nhật ký của một nhánh khác vì nhánh đó đã được phân nhánh thành thạo:

git log ...other-branch


6
2017-10-12 22:48