2012-12-24 5 views
58

Khi làm git log --decorate --oneline --graph thuộc một trong các kho của chúng tôi ngay trước Giáng sinh, chúng tôi thấy rằng cấu trúc sau đây đã xuất hiện (xoay để nhấn mạnh chủ đề lễ hội mong manh):Tại sao lịch sử git của tôi trông giống như một cây thông Noel?

redacted git log output, rotated to look like a Christmas tree

Làm sao mô hình này trong các cam kết đồ thị phát sinh ?

Điều này là cố ý hơi ngớ ngẩn, tất nhiên, nhưng có một điểm thú vị ở đây - rất khó để xem cách diễn giải các mẫu cụ thể trong biểu đồ cam kết khi bạn nhìn thấy chúng trong trình duyệt lịch sử git.

+6

* "Sắp tới: tại sao cây của tôi trông giống như cây thông Noel?" * – Amber

+33

* "Sắp tới: tại sao cây Giáng sinh của tôi trông giống như một lịch sử git?" * –

+0

Cây Giáng sinh sẽ không hoàn thành mà không có một số ngôi sao ... '*' '*' '*' – ADTC

Trả lời

30

Trong trường hợp này, tình huống là có một cam kết chưa được làm sạch ở đầu chi nhánh master trong một bản sao của kho lưu trữ. Sau đó, git pull được chạy nhiều lần trong cùng một kho lưu trữ, trong một khoảng thời gian khi có rất nhiều công việc mới đang được thực hiện ngược dòng. (Trong trường hợp này, nó xảy ra vì một kịch bản tự động, nhưng điều tương tự có thể xảy ra nếu một nhà phát triển chỉ kéo liên tục vào một chi nhánh để giữ cho nó cập nhật, thay vì, nói, rebasing.)

Mỗi lần kéo khi có các cam kết mới ở trên luồng tạo ra một cam kết hợp nhất mới, vì luôn có một cam kết trong master không nằm trong số master ngược dòng. Cuối cùng, lịch sử từ nhánh chính trong kho lưu trữ này đã được đẩy lên thượng nguồn, vì vậy các nhà phát triển khác đã thấy cấu trúc này trong đồ thị cam kết đột nhiên xuất hiện khi chúng được kéo tiếp từ kho lưu trữ ngược dòng.

Nếu bạn có lịch sử với cấu trúc tương tự và muốn tìm hiểu xem nhà phát triển nào đã gây ra sự cố này, bạn có thể chỉ cần nhìn xuống dòng với các ngôi sao (về cơ bản sau cha mẹ đầu tiên của mỗi lần hợp nhất) cho đến khi bạn nhận được cam kết không hợp nhất đầu tiên. Trong trường hợp trong hình, đó là b275805 - cam kết đáng lẽ phải được đẩy trước đó.

Đây là một trong những lý do mà mọi người thường thích sử dụng git pull --rebase - nó giữ lịch sử chưa được làm sạch của bạn đơn giản.

Để cung cấp tín dụng khi đến hạn, đồng nghiệp của tôi Matthew Somerville phát hiện ra điều này và tìm ra những gì đang diễn ra.

+4

Tuyệt vời. +1. Tôi chỉ biết vấn đề tiềm ẩn của 'pull --rebase' (http://stackoverflow.com/questions/2590260/when-will-git-pull-rebase-get-me-in-to-trouble/2590276 # 2590276), nhưng ở đây, điều đó thực sự sẽ hữu ích. – VonC