Git - cách tìm cam kết đầu tiên của nhánh cụ thể


91

Trong cây ví dụ sau:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

Tôi đang tìm F - cam kết đầu tiên trong chi nhánh xxx. Tôi nghĩ rằng có thể với:

git log xxx --not master

và cam kết cuối cùng được liệt kê nên là F. Nó có phải là giải pháp chính xác hoặc có thể có một số nhược điểm của nó?

Tôi biết rằng có những câu hỏi tương tự trên stackoverflow, nhưng không ai đề xuất giải pháp như vậy và tôi không chắc liệu mình có làm đúng hay không.


Có thể có bản sao của stackoverflow.com/questions/6058308/…
nyzm

Câu trả lời:


109
git log master..branch --oneline | tail -1

Trong đó "chi nhánh" là tên chi nhánh cụ thể của bạn. Dấu chấm cung cấp cho bạn tất cả các cam kết mà nhánh có cái mà chủ không có. tail -1trả về dòng cuối cùng từ đầu ra trước đó.


3
điều này chỉ hoạt động nếu `nhánh '' tồn tại. Bạn sẽ làm như thế nào nếu nhánh bị xóa?
Oz123

2
Chi nhánh @ Oz123 có thể được thay thế bằng bất kỳ tham chiếu nào, như HEAD hoặc sha1 hoặc thẻ. Nhưng rõ ràng bạn cần một số loại tài liệu tham khảo.
Zitrax

3
Không mang lại cho tôi những gì tôi đã mong đợi. Chi nhánh của tôi (cái cũ) đã được hợp nhất trở lại cái chính, có nghĩa là tất cả các cam kết trong xxx đã ở trong cái chính. Tuy nhiên - tôi cần biết cam kết nào LÀ cái đầu tiên trên nhánh đó - hoặc thực ra - tôi cần phải kiểm tra lịch sử các lần cam kết của nhánh đó - Tôi không quan tâm liệu chúng có trên chính chủ hay không.
Motti Shneor

1
@MottiShneor tùy thuộc vào cách bạn hợp nhất, điều đó có thể phức tạp. Nếu bạn tua đi nhanh, nó như thể nhánh chưa bao giờ tồn tại. Nếu không, bạn có thể quan tâm đến câu trả lời này , nó liệt kê một số cách để tìm điểm nhánh. Sau khi bạn có điểm chi nhánh của mình, SHA có thể thay thế mastervà miễn là chi nhánh của bạn chưa bị xóa, git log <sha>..branch --oneline | tail -1vẫn sẽ cung cấp cho bạn kết quả bạn đang tìm kiếm.
ND Geek

1
Bạn có thể sử dụng --reverseđể đọc các bản ghi ngược với màu sắc, vv
Dominik

8

Bạn nên sử dụng merge-basechức năng được thiết kế để giải quyết chính xác điều này:

git merge-base remotes/origin/<branch> develop 

Tôi không nghĩ rằng điều này sẽ hiệu quả nếu bạn muốn quay lại điểm ngã ba ban đầu. Nếu bạn hợp nhất phát triển thành <branch> thì cơ sở hợp nhất sẽ mới hơn điểm rẽ nhánh ban đầu.
Alexander Mills

5
Ngoài ra, điều này sẽ không chỉ đến F, mà là một cam kết trong nhánh chính (mặc dù khó thấy trong bản vẽ của OP, có vẻ là B hoặc C).
RomainValeri


1

Nếu chi nhánh của bạn (cái cũ) một lần nữa được hợp nhất trở lại cái chính không cho kết quả mong đợi, tôi phải sử dụng tập lệnh python để tìm Id cam kết chi nhánh ban đầu.

git rev-list - tập hợp thay đổi cha đầu tiên

- cha mẹ đầu tiên chỉ theo dõi cam kết mẹ đầu tiên khi thấy một cam kết hợp nhất.

Lặp lại các tập thay đổi từ lệnh trên cho đến khi tìm thấy nhánh cha.

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)

0
git cherry master -v | tail -1   

tuy nhiên điều này sẽ chỉ cung cấp cho bạn cam kết đầu tiên trên nhánh xxx mà không có trong chính, không phải là cam kết đầu tiên trên nhánh xxx. sau này sẽ khó nếu nhánh xxx đã bị xóa và / hoặc được tạo lại một hoặc nhiều lần. trường hợp đó bạn có thể thử những cách sau:

git reflog | grep checkout | grep xxx | tail -1   

3
Ý bạn là viết head -n 1thay vì tail -1? tail -1trả về cam kết gần đây nhất thay vì cam kết đầu tiên.
Nelu

-1

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1


Trong repo của tôi, điều này hiển thị cam kết đầu tiên kể từ lần hợp nhất cuối cùng từ cái chính vào nhánh xxx, không phải cam kết đầu tiên của nhánh xxx.
jk7
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.