Lý do chính từ những gì tôi có thể thấy là như sau:
- Giao diện người dùng GitHub để hợp nhất các yêu cầu kéo hiện tại (tháng 10 năm 2015) không cho phép bạn chỉnh sửa dòng đầu tiên của thông báo cam kết, buộc nó phải là
Merge pull request #123 from joebloggs/fix-snafoo
- Giao diện người dùng GitHub để duyệt lịch sử cam kết hiện không cho phép bạn xem lịch sử của chi nhánh theo
--first-parent
quan điểm
- Giao diện người dùng GitHub để xem lỗi tại một tệp hiện không cho phép bạn xem trách nhiệm của tệp với
--first-parent
quan điểm (lưu ý rằng điều này chỉ được sửa trong Git 2.6.2, vì vậy chúng tôi có thể tha thứ cho GitHub vì không có có sẵn)
Vì vậy, khi bạn kết hợp cả ba tình huống trên, bạn sẽ gặp tình huống các cam kết không được xử lý bị sáp nhập trông xấu xí từ Giao diện người dùng GitHub.
Lịch sử của bạn với các cam kết bị đè bẹp sẽ trông giống như
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... Hotfix for android display issue
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... Implemented pop-up to select language
Trong khi đó, nếu không bị đè bẹp thì lịch sử sẽ trông giống như
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... hotfix for #5849564648
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Khi bạn có nhiều cam kết trong một lần truy tìm PR nơi có sự thay đổi có thể trở thành một cơn ác mộng nếu bạn hạn chế sử dụng Giao diện người dùng GitHub .
Ví dụ: bạn tìm thấy một con trỏ null đang được tham chiếu ở đâu đó trong một tệp ... vì vậy bạn nói "ai đã làm điều này và khi nào? Phiên bản phát hành nào bị ảnh hưởng?". Sau đó, bạn đi lang thang đến chế độ xem đổ lỗi trong Giao diện người dùng GitHub và bạn thấy rằng dòng đã được thay đổi trong789fdfffdf
... "oh nhưng đợi một chút, dòng đó chỉ thay đổi thụt lề để phù hợp với phần còn lại của mã", vì vậy bây giờ bạn cần điều hướng đến trạng thái cây cho tệp đó trong cam kết cha mẹ và truy cập lại trang đổ lỗi ... cuối cùng bạn tìm thấy cam kết ... đó là một cam kết từ 6 tháng trước ... "oh **** điều này có thể ảnh hưởng đến người dùng trong 6 tháng" bạn nói ... à, nhưng chờ đã, đó là cam kết thực ra là trong Yêu cầu kéo và chỉ được sáp nhập vào ngày hôm qua và chưa có ai cắt bản phát hành ... "Chết tiệt, mọi người vì đã hợp nhất lịch sử mà không bị đè bẹp" là tiếng kêu thường có thể nghe thấy sau khoảng 2 hoặc 3 cuộc thám hiểm khảo cổ mã thông qua Giao diện người dùng GitHub
Bây giờ chúng ta hãy xem xét cách thức hoạt động của nó nếu bạn sử dụng dòng lệnh Git (và bản 2.6.2 siêu tuyệt vời có bản sửa lỗi git blame --first-parent
)
- Nếu bạn đang sử dụng dòng lệnh Git, bạn sẽ có thể kiểm soát hoàn toàn thông điệp cam kết hợp nhất và do đó, cam kết hợp nhất có thể có một dòng tóm tắt hay.
Vì vậy, lịch sử cam kết của chúng tôi sẽ như thế nào
$ git log
1256556316... #423 Added new slideshow feature
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... #324 Hotfix for android display issue
787g8fgf78... hotfix for #5849564648
f56556316e... #28 Implemented pop-up to select language
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Nhưng chúng ta cũng có thể làm
$ git log --first-parent
1256556316... #423 Added new slideshow feature
56556316ad... #324 Hotfix for android display issue
f56556316e... #28 Implemented pop-up to select language
(Nói cách khác: Git CLI cho phép bạn có bánh và ăn nó)
Bây giờ khi chúng ta gặp phải vấn đề con trỏ null ... chúng ta chỉ cần sử dụng git blame --first-parent -w dodgy-file.c
và ngay lập tức chúng ta được cung cấp cam kết chính xác trong đó tham chiếu khử con trỏ null được đưa vào nhánh chính bỏ qua các thay đổi khoảng trắng đơn giản.
Tất nhiên, nếu bạn đang thực hiện hợp nhất bằng Giao diện người dùng GitHub thì git log --first-parent
thực sự rất nhảm nhí nhờ GitHub buộc dòng đầu tiên của thông báo cam kết hợp nhất:
1256556316... Merge pull request #423 from jrandom/add-slideshows
56556316ad... Merge pull request #324 from ahacker/fix-android-display
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
Vì vậy, để cắt ngắn một câu chuyện dài:
Giao diện người dùng GitHub (tháng 10 năm 2015) có một số thiếu sót với cách nó hợp nhất các yêu cầu kéo, cách trình bày lịch sử cam kết và cách nó quy kết thông tin đổ lỗi. Cách tốt nhất hiện tại để hack xung quanh các lỗi này trong Giao diện người dùng GitHub là yêu cầu mọi người xóa sạch các cam kết của họ trước khi hợp nhất.
Git CLI không có những vấn đề này và bạn có thể dễ dàng chọn chế độ xem bạn muốn xem để vừa có thể khám phá lý do tại sao một thay đổi cụ thể được thực hiện theo cách đó (bằng cách xem lịch sử của các cam kết chưa được xử lý) cũng như xem các cam kết hiệu quả đè bẹp.
Tập lệnh
Lý do cuối cùng thường được trích dẫn cho các cam kết squash là để làm cho việc nhập backport dễ dàng hơn ... nếu bạn chỉ có một cam kết để quay lại cổng (tức là cam kết bị đè bẹp) thì rất dễ để chọn cherry ...
Vâng, nếu bạn đang xem lịch sử git với git log --first-parent
thì bạn chỉ có thể chọn anh đào hợp nhất. Hầu hết mọi người đều nhầm lẫn khi chọn cam kết hợp nhất vì bạn phải chỉ định -m N
tùy chọn nhưng nếu bạn có cam kết từ git log --first-parent
đó thì bạn biết rằng đó là cha mẹ đầu tiên mà bạn muốn theo dõi nên sẽ làgit cherry-pick -m 1 ...