2015-08-13 18 views
11

Làm cách nào để tìm số cam kết giữa hai cam kết trong git?Số Cam kết giữa hai Cam kết

Ngoài ra, có cách nào để tôi có thể thực hiện tương tự với bất kỳ dự án nào trên GitHub (sử dụng giao diện người dùng chứ không phải API) không?

+0

Nếu bạn có hai cam kết bạn có số sửa đổi của họ không? Trừ hai? Tôi có thể quá đơn giản hoặc không hiểu câu hỏi. –

+0

@CarlosBribiescas trong 'git', một cam kết không nhất thiết là một ID cam kết. Ngoài ra, ngay cả khi bạn có ID cam kết, trong git, cam kết ID là băm (ff3823ac, 554fbae3, v.v.). – haneefmubarak

Trả lời

14

Trước khi tôi cung cấp cho bạn một câu trả lời, xem xét việc này cam kết đồ thị:

 o ----------- 
    /   \ 
... - A - o - o - o - B 
     \  /
     o ----- o 

Mỗi o đại diện cho một cam kết, cũng như AB (chúng tôi chỉ thư cho chúng ta hãy nói về cụ cam kết) . Có bao nhiêu cam kết giữa các cam kết AB?

Điều đó nói rằng, trong nhiều trường hợp tuyến tính, chỉ cần sử dụng git rev-list --count A..B và sau đó quyết định ý bạn là "giữa" (bao gồm B và loại A? Đó là cách git rev-list --count sẽ hoạt động). Trong các trường hợp nhánh như thế này, bạn sẽ nhận được tất cả các cam kết xuống tất cả các nhánh; thêm --first-parent, ví dụ: chỉ cần thực hiện theo "dòng chính".

(Bạn cũng có đề cập đến "commitish", gợi ý rằng chúng ta có thể có thẻ chú thích đó sẽ không ảnh hưởng đến sản lượng từ git rev-list, mà chỉ đếm các cam kết cụ thể..)


Chỉnh sửa: Kể từ git rev-list --count A..B bao gồm cam kết B (trong khi bỏ qua cam kết A) và bạn muốn loại trừ cả hai điểm kết thúc, bạn cần phải trừ một điểm. Trong vỏ hiện đại bạn có thể làm điều này với số học shell:

count=$(($(git rev-list --count A..B) - 1)) 

Ví dụ:

$ x=$(($(git rev-list --count HEAD~3..HEAD) - 1)) 
$ echo $x 
2 

(repo đặc biệt này có một cấu trúc đồ thị rất tuyến tính, vì vậy không có chi nhánh ở đây và có hai cam kết "giữa" đầu và ba phía sau đầu). Lưu ý, tuy nhiên, điều này sẽ tạo ra -1 nếu AB xác định cùng cam kết:

$ x=$(($(git rev-list --count HEAD..HEAD) - 1)) 
$ echo $x 
-1 

vì vậy bạn có thể muốn kiểm tra xem đầu tiên:

count=$(git rev-list --count $start..$end) 
if [ $count -eq 0 ]; then 
    ... possible error: start and end are the same commit ... 
else 
    count=$((count - 1)) 
fi 
+0

Bạn sẽ làm gì nếu muốn tổng số tất cả các chi nhánh được cộng lại? Ngoài ra, ở giữa, tôi đã nghĩ đến "độc quyền" (không bao gồm A & B). – haneefmubarak

+0

Lệnh 'git rev-list' (thử nó mà không có' --count') đi vào biểu đồ, in SHA-1 của mỗi commit bạn chọn. Ký hiệu 'A..B' có nghĩa là" chọn mọi cam kết có thể truy cập bắt đầu từ B và làm việc trở lại thông qua tất cả các commit cha, nhưng sau đó loại trừ mọi commit có thể truy cập bằng cách bắt đầu từ A và làm việc trở lại ", vì vậy nếu bạn muốn tất cả chúng, bạn ' trong hình dạng tuyệt vời, bởi vì đó là những gì bạn nhận được. Trong khi đó, vì 'danh sách rev' bao gồm' A', trừ một. – torek

+0

bạn có thể đặt nhận xét trong câu trả lời cùng với một lớp lót cũng trừ một (có lẽ là kết quả thành '| xargs expr -1 +') và sau đó tôi sẽ đánh dấu nó là đúng – haneefmubarak

5
$ git log 375a1..58b20 --pretty=oneline | wc -l 

Chỉ định cam kết bắt đầu của bạn theo sau là cam kết cuối cùng, sau đó đếm các dòng. Đó phải là số lượng cam kết giữa hai phạm vi cam kết đó. Sử dụng định dạng --pretty=online để mỗi cam kết chiếm một dòng.

Đối với GUI trong GitHub, tôi không biết cách nào để thực hiện tác vụ tương tự này. Nhưng điều đó không đáng kể, vì ở trên là cách có thể thực hiện nó trực tiếp trong Git Bash.

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