Làm thế nào để tôi thấy sự khác biệt cam kết giữa các chi nhánh trong git?


341

Tôi đang ở chi nhánh-X và đã thêm một vài cam kết nữa trên đầu trang. Tôi muốn thấy tất cả sự khác biệt giữa MASTER và chi nhánh mà tôi đang thực hiện về mặt cam kết. Tôi chỉ có thể làm một

git checkout master
git log

và sau đó một

git checkout branch-X
git log

và trực quan khác với những điều này, nhưng tôi hy vọng một phương pháp dễ dàng hơn, ít lỗi hơn.


Câu trả lời:


324

Bạn có thể có được một đầu ra trực quan thực sự tốt đẹp về cách các chi nhánh của bạn khác với điều này

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

13
Điều đó sẽ không cho bạn thấy sự khác biệt giữa các chi nhánh mặc dù đó là những gì đang được hỏi.
gót chân Pablo Fernandez 20/12/12

47
git log --oneline --graph --all --decorate --abbrev-commitsẽ cung cấp cho bạn một đầu ra tương tự trong một lệnh ngắn hơn / dễ đọc hơn
gót chân Pablo Fernandez

4
Tôi thích điều này:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery

6
Vô cùng quá phức tạp.
Shawn Erquhart

12
git log --oneline --graph --all --decoratelà đủ, --abbrev-commitkhông bắt buộc, --onelinelà viết tắt của--pretty=oneline --abbrev-commit
avmohan

719

Bạn có thể dễ dàng làm điều đó với

git log master..branch-X

Điều đó sẽ cho bạn thấy rằng nhánh X có nhưng chủ không có.


9
Có một tùy chọn nếu cả hai nhánh chứa các cam kết mà bên kia không? Ngay bây giờ, bạn phải lật các đối số và chạy cả hai cách để xem các xác nhận mà nhánh khác không chứa.
Elliott Sl tàn

38
Nếu bạn đã chuyển sang branch-Xbạn có thể sử dụnggit log master..
Dave

8
@ElliottSl daughter: Nếu bạn muốn tìm cam kết ở chế độ chính hoặc nhánh-X nhưng không phải cả hai, bạn có thể sử dụng git log master...branch-X(ba dấu chấm thay vì hai). Xem man gitrevisionsđể biết thêm.
Xavier T.

3
Nó thực sự chỉ có một nửa câu trả lời. Bất kỳ cam kết trong tổng thể gây ra các chi nhánh để phân kỳ sẽ không hiển thị
jterm

9
Nếu các cam kết đã được chọn từ nhánh X để làm chủ thì điều này sẽ không lọc chúng ra. Họ vẫn sẽ nằm trong danh sách các cam kết "Trong chi nhánh-X nhưng không phải là chủ nhân" mặc dù họ thực sự ở cả hai ..
Tuffwer

87

Tôi nghĩ đó là vấn đề của sự lựa chọn và bối cảnh. Tôi thích sử dụng

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

Nó sẽ hiển thị các cam kết trong phát triển không nằm trong nhánh chính.

Nếu bạn muốn xem tập tin nào thực sự được sửa đổi, hãy sử dụng

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

Nếu bạn không chỉ định đối số, nó sẽ hiển thị khác biệt đầy đủ. Nếu bạn muốn xem diff diff, hãy cài đặt meldtrên linux hoặc WinMergetrên windows. Hãy chắc chắn rằng chúng là các khác biệt mặc định. Sau đó sử dụng một cái gì đó như

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

Trong trường hợp bạn muốn so sánh nó với chi nhánh hiện tại. Sẽ thuận tiện hơn khi sử dụng HEAD thay vì tên chi nhánh như sử dụng:

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

Nó sẽ cho bạn thấy tất cả các cam kết, sắp được sáp nhập


1
Nếu bạn so sánh một nhánh phát hành có thể có sự hợp nhất. Bạn có thể muốn xóa các cam kết hợp nhất (không thêm bất kỳ giá trị nào) với sự trợ giúp của thông số --no-mergesnhư:git log origin/master..HEAD --oneline --no-merges
claudiu.f.marginean

15

Nếu bạn đang dùng Linux, gitg cách để thực hiện nó rất nhanh và đồ họa.

Nếu bạn nhấn mạnh vào dòng lệnh, bạn có thể sử dụng:

git log --oneline --decorate

Để làm git logđẹp hơn theo mặc định, tôi thường đặt các tùy chọn toàn cầu này:

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

14

Tôi muốn đề xuất những điều sau đây để thấy sự khác biệt "trong các cam kết". Đối với sự khác biệt đối xứng, lặp lại lệnh với các đối số đảo ngược:

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

Đây có phải là khác với git master..branch-X?
ilmirons

2
Chắc chắn, "git cherry" rất thông minh: nó dịch từ "cam kết" thành "bản vá / khác biệt" và có thể tránh báo cáo "bản vá" trên cả hai nhánh nhưng được áp dụng theo thứ tự khác nhau.
mmaruska

8

nếu bạn muốn sử dụng gitk:

gitk master..branch-X

nó có một ngôi trường cũ đẹp GUi


4

Không phải là câu trả lời hoàn hảo nhưng hoạt động tốt hơn cho những người sử dụng Github:

nhập mô tả hình ảnh ở đây

Chuyển đến repo của bạn: Insights -> Network


Ngoài ra, tạo Yêu cầu Kéo cũng sẽ hiển thị sự khác biệt của chi nhánh.
pkamb

OMG tôi muốn ôm bạn
esseara

@esseara Tôi cũng là một người hugger lớn :)) Bạn được chào đón: D
AIon

2

Nếu bạn muốn so sánh dựa trên các thông điệp cam kết, bạn có thể làm như sau:

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
Thay vì sử dụng --onelinevà đường ống đến cutbạn có thể sử dụnggit log --format='%s'
quang vòng

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

Đóng góp điều này bởi vì nó cho phép các bản ghi a và b được hiển thị trực quan, cạnh nhau, nếu bạn có một công cụ tìm khác biệt trực quan. Thay thế lệnh diff ở cuối bằng lệnh để bắt đầu công cụ tìm khác biệt trực quan.


0

Tôi đã sử dụng một số câu trả lời và tìm thấy câu trả lời phù hợp với trường hợp của mình (đảm bảo tất cả các tác vụ đều nằm trong nhánh phát hành).

Các phương thức khác cũng hoạt động nhưng tôi thấy rằng chúng có thể thêm các dòng mà tôi không cần, như các cam kết hợp nhất không thêm giá trị.

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

hoặc bạn có thể so sánh hiện tại của bạn với chủ

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

git fetch có để đảm bảo bạn đang sử dụng thông tin cập nhật.

Theo cách này, mỗi cam kết sẽ nằm trên một dòng và bạn có thể sao chép / dán nó vào trình soạn thảo văn bản và bắt đầu so sánh các tác vụ với các cam kết sẽ được hợp nhất.

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.