2013-08-18 29 views
6

Có một số quy ước cho lệnh của cha mẹ của một người cam kết không?Git Cam kết đơn đặt hàng của cha mẹ

Bởi vì một trong những bậc phụ huynh cam kết của nên được để trước cam kết về chi nhánh hiện tại đang được sáp nhập vào và phần còn lại là cam kết trước đó của các ngành sáp nhập khác.

Tôi muốn xác định cam kết trước đó của chi nhánh hiện tại, Tôi đang sử dụng pygit mà trả về một danh sách các bậc cha mẹ cho một cam kết và trực giác tôi nghĩ có lẽ thứ tự của các bậc cha mẹ có ý nghĩa nhưng tôi đã không tìm thấy rõ ràng đề cập đến điều này.


tôi đã viết chức năng tiện ích này, sử dụng đầu tiên mẹ cam kết đi qua chi nhánh:

def walk_branch(pygit_repository, branch_oid): 
    """ 
    Walk a single branch 
    """ 
    from pygit2 import GIT_SORT_TOPOLOGICAL 
    previous_first_parent_oid = None 
    for commit in pygit_repository.walk(branch_oid, GIT_SORT_TOPOLOGICAL): 
     if previous_first_parent_oid is None or commit.oid == previous_first_parent_oid: 
      previous_first_parent_oid = commit.parents[0].oid if len(commit.parents) else None 
      yield commit 
+3

Tôi không biết về libgit2 và pygit2 nhưng bố mẹ "đầu tiên" luôn là phụ huynh từ nhánh bạn đang truy cập khi bạn thực hiện 'git merge'. Đây là một trong những chiết xuất '--first-parent', và nó là phần đầu tiên trong đầu ra thô từ' git cat-file -p somerev'. Các bậc cha mẹ còn lại là các nhánh được "sáp nhập". – torek

+0

Cảm ơn, tôi không biết về cụm từ "cha mẹ đầu tiên". –

Trả lời

7

libgit2 và các ràng buộc của nó trả về cha mẹ theo thứ tự chúng được lưu trữ trong cam kết, đó là thứ tự của các cam kết khi chúng được đưa ra trên ví dụ: dòng lệnh cho git merge, và đó là một hằng số mà cha mẹ đầu tiên là cam kết hiện tại khi tạo một cái mới (hoặc thông qua hợp nhất hoặc bình thường git commit).

Để xác định cam kết trước đó (theo thời gian), thì tất cả những gì bạn cần làm là xem phụ huynh đầu tiên. Cho dù chúng ở trong cùng một chi nhánh hay không thì không phải là thứ bạn có thể nhìn thấy từ đó, vì cha mẹ cam kết có thể ở một nhánh khác (đó là nguyên nhân gây ra nhánh), nhưng bạn có thể vẽ một đường thẳng (giống như các số git log --graph --oneline) .

+0

Cảm ơn bạn đã làm rõ. –

7

Vâng, nếu bạn kết hợp A vào B, phụ huynh đầu tiên là B và thứ hai là A.

Vì vậy, bạn có thể thực hiện những việc như gitk --first-parent để chỉ hiển thị lịch sử của chi nhánh hiện tại mà không cần chi tiết về các chi nhánh đã hợp nhất.

0

Bất kỳ phụ huynh nào sau cha/mẹ thứ nhất đại diện cho hợp nhất từ ​​một chi nhánh khác có ít nhất một ngoại lệ.

Nếu bạn hợp nhất một chi nhánh, điều này thường xảy ra khi nó được làm việc ở hai nơi riêng biệt, sau đó được tích hợp, một trong những nhánh đó trong nhánh sẽ xuất hiện như thể nó không đến từ đâu.

Điều này sẽ hiển thị nếu bạn đi qua tất cả các bậc cha mẹ của tất cả các nhánh lá nhưng các chi nhánh đó trong các nhánh sẽ không hiển thị nếu bạn đi qua lịch sử tuyến tính của tất cả các nhánh lá. Điều này ít nhất vẫn chính xác theo nghĩa là bạn sẽ chỉ đi qua lịch sử tuyến tính của các cam kết đã được hợp nhất vào. Những gì sẽ được ẩn là một thực tế rằng có một chi nhánh trong một chi nhánh để nó sẽ không được hiển thị tất cả lịch sử độc quyền cho chi nhánh đó.

Tôi không biết liệu xóa các nhánh có cùng tác dụng hay không.

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