2011-12-11 26 views
5

Nếu bạn sử dụng gitk --all, bạn có thể xem tất cả các cam kết của repo của bạn, từ tất cả các chi nhánh. Tôi muốn một cái gì đó như thế ngoại trừ chỉ có hậu duệ của một cam kết nhất định.Làm thế nào tôi có thể nhận/liệt kê/xem tất cả các hậu duệ của một cam kết với git (hoặc gitk)?

+1

Mặc dù câu đầu tiên của manojlds là đúng, nhưng không phải toàn bộ sự thật: nó có thể kludge cái gì đó kiểm tra xem liệu mỗi ref có cam kết đã cho trong tổ tiên của nó, và sau đó hiển thị lịch sử bắt đầu từ những refs. – Cascabel

+1

có thể trùng lặp của [Nhận danh sách tất cả trẻ em của một cam kết nhất định] (http://stackoverflow.com/questions/2613935/getting-a-list-of-all-children-of-a-given-commit) – jthill

Trả lời

2

Một cam kết chỉ biết về cha mẹ của nó (và do đó tất cả các con đường lên) nhưng không có đầu mối về con/con cháu của nó. Bạn phải sử dụng ký hiệu như A..B để tìm nó.

Ví dụ, nếu bạn muốn tìm các cam kết trong ngành hiện tại kể từ khi được cam kết A, bạn có thể làm một cái gì đó như thế này:

git rev-list A.. 
+1

'gitk --all' phải hoạt động bằng cách nào đó. Có vẻ như ít nhất phải mã hóa nó thành 'gitk --all' đầu tiên và sau đó bỏ qua mọi cam kết không có một cam kết xác định làm cha của nó. – Pistos

7

Tôi nghĩ rằng điều này có thể làm những gì bạn muốn. Tất cả các cam kết trong tất cả các ngành, mà có A như tổ tiên:

gitk --all --ancestry-path A.. 
1

Nói tóm lại:

git log --all BRANCH~1.. 

Cụ thể, với các ví dụ: Đây là cây hoàn chỉnh của một kho lưu trữ Tôi vừa tạo:

$ git log --graph --oneline --decorate --all 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 
| * 65b716e (c) c-5 
| * ebe2a0e c-4 
|/ 
| * 2ed9abe (b) b-4 
|/ 
* ace558e (master) 3 
* 20db61f 2 
* 3923af1 1 

Ngoài --all, điều khác là rõ ràng: master ->HEAD:

$ git log --graph --oneline --decorate master.. 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 

Vì vậy, tôi cố gắng kết hợp chúng, và nó gần như đã cho tôi những gì chúng ta muốn:

$ git log --graph --oneline --decorate --all master.. 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 
* 65b716e (c) c-5 
* ebe2a0e c-4 
* 2ed9abe (b) b-4 

Nhưng thật không may, điều này không thể hiện mối quan hệ giữa các ngành, kể từ khi chi nhánh chúng tôi đang yêu cầu về đã bị bỏ qua. Vì vậy, chúng tôi phải sử dụng nhật ký từ phụ huynh của master như vậy:

$ git log --graph --oneline --decorate --all master~1.. 
* e3972be (HEAD, a) a-6 
* 2707d79 a-5 
* cdea9a7 a-4 
| * 65b716e (c) c-5 
| * ebe2a0e c-4 
|/ 
| * 2ed9abe (b) b-4 
|/ 
* ace558e (master) 3 

Ta-da! (Tôi không biết nếu điều này chỉ đơn giản là không làm việc trong quá khứ, nhưng chỉ trong trường hợp: Tôi đang trên git phiên bản 1.7.1)

EDIT 2017-11-17 - Nhờ STW thực sự cho thấy vấn đề với điều này: Cây độc lập sẽ làm hỏng điều này. Các cam kết hoàn toàn độc lập với master sẽ được bao gồm trong đầu ra này. Bắt đầu từ một bản sao của repo trên, đây là những gì lệnh cuối cùng của tôi sẽ ra:

$ git checkout --orphan z 
Switched to a new branch 'z' 
$ git commit --allow-empty -m'z-1' 
[z (root-commit) bc0c0bb] z-1 
$ git commit --allow-empty -m'z-2' 
[z 1183713] z-2 

$ git log --graph --oneline --decorate --all master~1.. 
* 1183713 (HEAD -> z) z-2 
* bc0c0bb z-1 
* 6069f73 (a) a-6 
* 654d106 a-5 
* a218c59 a-4 
| * 338432a (c) c-5 
| * 2115318 c-4 
|/ 
| * 43a34dc (b) b-4 
|/ 
* ce05471 (master) 3 

Nhánh z, được tạo ra như là một đứa trẻ mồ côi, không có lịch sử chung với master, vì vậy z-1z-2 nên đã được loại trừ nhưng không. Đây là những gì --ancestry-path là cho, bây giờ tôi nhận được.Kể cả nó sẽ loại trừ chi nhánh z:

$ git log --graph --oneline --decorate --all --ancestry-path master~1.. 
* 6069f73 (a) a-6 
* 654d106 a-5 
* a218c59 a-4 
| * 338432a (c) c-5 
| * 2115318 c-4 
|/ 
| * 43a34dc (b) b-4 
|/ 
* ce05471 (master) 3 

Để hoàn chỉnh, thậm chí cho rằng nó đã có --ancestry-path, câu trả lời đầu hiện tại không hiển thị các mối quan hệ chi nhánh một cách chính xác bởi vì nó không bao gồm các cam kết về master bản thân:

$ git log --graph --oneline --decorate --all --ancestry-path master.. 
* 6069f73 (a) a-6 
* 654d106 a-5 
* a218c59 a-4 
* 338432a (c) c-5 
* 2115318 c-4 
* 43a34dc (b) b-4 
+0

Tôi đã thử thách với các biến thể của điều này, nhưng nó dường như không hiển thị những gì tôi muốn [với gitk]. Ví dụ, giả sử bạn đã lập một chi nhánh con trung gian, và từ đó đã tạo ra 3 chi nhánh cháu. Điều gì sẽ là cách để hiển thị gitk chỉ cho gia đình của các chi nhánh, và không ai trong số tổng thể, hoặc bất cứ điều gì khác? – Pistos

+0

@Pistos Vì vậy, bằng cách sử dụng ở trên, tôi nhận được cùng một đầu ra trong 'gitk' như' log' khi tôi sử dụng 'gitk --all master..' (trái ngược với' git log --all master ~ 1..' - Vì vậy, để sử dụng một nhánh khác với master, hãy thử 'gitk --all branchname..' (bao gồm hai dấu chấm) – Izkata

+0

@Pistos Tôi cũng lưu ý rằng nhận xét của tôi đã kết thúc gần như giống như câu trả lời của jsvnm, ngoại trừ I don ' t khá hiểu '--ancestry-path' và tại sao nó sẽ là cần thiết – Izkata