2011-10-11 24 views
8

Trong git, tôi có thể làm như sau:Tương đương Mercurial cho hiển thị các cam kết trong một chi nhánh là gì nhưng không phải ở một nhánh khác?

git log foo ^bar 

để hiển thị changesets trong ngành foo nhưng không phải trong ngành bar. Có cách nào để làm điều đó trong Mercurial không?

Chỉnh sửa: Để giải thích thêm một chút về trường hợp sử dụng. Giả sử tôi có một chi nhánh trong Mercurial (gọi là foo) được phân nhánh theo số default. Những gì tôi muốn biết là những gì cam kết là trong chi nhánh foo, và do đó chưa được sáp nhập vào default. Có lẽ tôi đang nghĩ về điều này sai, nhưng trong git, tôi có thể bắt đầu làm việc trên foo, hợp nhất với master và sau đó làm việc thêm một số chi tiết trên foo và sử dụng lệnh ở trên để xem cam kết nào chưa được hợp nhất.

Vì vậy, một trường hợp sử dụng cụ thể là biết liệu chi nhánh đã được hoàn thành hợp nhất vào mặc định hay chưa. Từ việc sử dụng Mercurial, nếu tôi bắt đầu một chi nhánh foo tắt default để làm việc trên một đối tượng địa lý, hãy để nó ở đó để hợp nhất và tách ra khỏi foo để tạo ra bar, có chứa một tính năng khác được xây dựng trên mọi thứ trong foo, foo kết thúc không hoạt động bởi vì bar chứa tất cả các thay đổi trong foo, nhưng tôi có thể chỉ muốn hợp nhất các thay đổi trong foo vì tôi biết chúng là tốt trong khi bar vẫn đang được phát triển. Hy vọng rằng đó là hữu ích.

+0

Vì vậy, về cơ bản bạn muốn xem tất cả tổ tiên của 'foo' mà không phải là một phần của tổ tiên của' default'. Đó thực sự là phần thứ hai của câu trả lời của tôi. –

+0

Nếu bạn chỉ muốn xem các cam kết trong một nhánh, chỉ cần sử dụng 'hg log -b '. Nếu '' là nhánh hiện tại của bạn, bạn có thể sử dụng 'hg log -b .'. – weberc2

Trả lời

26

Hãy thử sử dụng revsets (hg help revsets)

hg log -r "branch(foo) and not branch(bar)" 

Nhưng đây là loại vô dụng như một changeset chỉ có thể ở một chi nhánh tên là tại một thời điểm.

Có thể bạn có nghĩa là tất cả tổ tiên của dấu trang không phải là tổ tiên của dấu trang khác?

hg log -r "::a and not ::b" 

Dù bằng cách nào, trang trợ giúp revsets sẽ giúp bạn bắt đầu.

+1

Cảm ơn, revsets là những gì tôi đang tìm kiếm. Tôi nghĩ tôi muốn nói "changesets" thay vì "commit", vì vậy cảm ơn vì đã chỉ ra điều đó. – Bialecki

+0

Yeah changeset là Mercurial lingo, commit là Git lingo; p. Bạn có thể sử dụng chúng khá nhiều thay thế cho nhau. –

9

Chính xác bạn ngụ ý gì bởi các cam kết trong chi nhánh foo nhưng không có trong thanh? Cam kết về cơ bản chỉ trong một nhánh trong thủy ngân.

hg log -b foo #lists all commits that are in branch foo 
+0

Xem chỉnh sửa của tôi ở trên. Khi bạn nói "các cam kết về cơ bản chỉ ở một nhánh trong thủy ngân", điều đó có nghĩa là mô hình khác với Git? Sự hiểu biết của tôi là chỉ có changesets và bạn có thể áp dụng chúng vào bất kỳ chi nhánh nào, vì vậy hai nhánh có thể có cả một thay đổi được áp dụng. – Bialecki

+0

Tôi đã chỉnh sửa câu hỏi của mình thành "changesets" thay vì "commit", cảm ơn vì đã chỉ ra sai lầm đó. – Bialecki

+0

@Bialecki, Mercurial có hai loại chi nhánh, có tên chi nhánh và chi nhánh ẩn danh. Chi nhánh ẩn danh không gì khác ngoài phân tách các cam kết và chúng có thể được theo dõi bằng dấu trang (tương tự như các nhánh của git).Các nhánh được đặt tên thực sự có nhãn được cam kết cùng với chúng, vì vậy cam kết luôn nằm trên một nhánh, hoặc là 'mặc định' hoặc một nhánh khác. –

1

để hiển thị changesets trong foo chi nhánh nhưng không phải trong thanh chi nhánh

hg log -r "::foo and not ::bar and ! destination(branch(bar)) and ! origin(branch(bar))" 
Các vấn đề liên quan