Có phải quy tắc vàng của Git Hồi là rất cần thiết?


22

Gần đây tôi đã có một cuộc thảo luận với những người hoàn toàn trái ngược với chiến lược rebase của các nhánh tính năng trên GIT. Nó dường như là một mô hình được chấp nhận để chỉ sử dụng rebase cho các chi nhánh địa phương, tư nhân nhưng không bao giờ sử dụng nó khi có một số người làm việc trên cùng một tính năng & chi nhánh, theo cái gọi là "Quy tắc nổi loạn vàng" này (như được giải thích ở đây: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

Tôi chỉ ngạc nhiên khi có sự đồng thuận về điều này. Tôi đã làm việc 3 năm với một chiến lược nổi loạn hoàn toàn, với khoảng 20 nhà phát triển làm việc cùng nhau và đoán xem, nó đã hoạt động như thế nào.

Quá trình cơ bản là:

  • Bạn tạo nhánh tính năng của mình, hãy gọi nó là "myfeature" và đẩy nó về nguồn gốc / myfeature
  • Những người khác có thể kiểm tra và làm việc với nó
  • Đôi khi bạn có thể rebase nó từ master: từ "myfeature", git rebase origin / master ; và sau đó, vâng, bạn phải đẩy nó.
  • Điều gì xảy ra khi những người khác muốn đẩy mạnh cam kết của họ? Họ chỉ rebase nó: git rebase origin / myfeature . Vì vậy, bây giờ họ đang tiến nhanh và có thể đẩy nó mà không cần ép buộc.

Nguyên tắc duy nhất để tôn trọng là nhánh tính năng thuộc sở hữu của một ai đó . Chủ sở hữu là người duy nhất có thể đẩy.

Vì vậy, tôi thừa nhận: ngay khi có lực đẩy, có nguy cơ mắc lỗi. Đung. Nhưng cũng có nhiều cách để khắc phục lỗi và thực sự, trong 3 năm phát triển, tôi đã không thấy nhiều sai lầm về lực lượng và khi nó xảy ra, chúng tôi luôn tìm ra cách phục hồi đúng cách.

Vậy, tại sao "Nguyên tắc vàng nổi loạn" này lại được chấp nhận rộng rãi như vậy? Có điều gì khác tôi đã bỏ lỡ với điều đó? Tôi hiểu rằng nó yêu cầu tối thiểu tổ chức (mọi chiến lược đều yêu cầu một số tổ chức), nhưng nó hoạt động.


Một cái gì đó tôi quên nói, nhưng nó có tầm quan trọng của nó: theo kinh nghiệm trước đây của chúng tôi, chúng tôi đã sử dụng gerrit như một công cụ đánh giá mã. Điều đó có nghĩa là nếu ai đó đẩy một cam kết trong khi chủ sở hữu chi nhánh đang thực hiện một cuộc nổi loạn, sẽ không có nguy cơ rằng cam kết đó bị mất, bởi vì nó được đẩy sang gerrit thay vì trực tiếp đến kho lưu trữ gốc. Và vì chủ sở hữu chi nhánh là người duy nhất có quyền gửi cam kết từ gerrit, nên rủi ro để phạm sai lầm là rất thấp.
Joel

Điều gì xảy ra nếu tôi hợp nhất nhánh tính năng của người khác vào nhánh của mình?
Winston Ewert

Nếu tính năng của bạn phụ thuộc vào tính năng khác, thì tôi đoán bạn có thể khởi động lại tính năng của bạn từ tính năng khác: git rebase origin / otherFeature (Tôi nói rebase chứ không phải hợp nhất, vì mục tiêu là giữ tuyến tính lịch sử). Tôi thừa nhận rằng sự phức tạp của tất cả những điều đó tăng lên rất nhiều khi bạn giới thiệu ngày càng nhiều sự phụ thuộc giữa các chi nhánh.
Joel

Câu trả lời:


10

Vấn đề với lực đẩy không phải là về nhánh tính năng và chủ của bạn, mà là về việc đẩy chủ của bạn sang chủ nhân của người khác - sự đồng bộ hóa đó sẽ ghi đè lên chủ nhân của họ bằng các thay đổi của bạn, bỏ qua mọi thứ trên đầu họ.

Xem xét mối nguy hiểm này, có một lý do tại sao bạn không nên sử dụng nó trừ khi mọi thứ đã bị hỏng và bạn hoàn toàn cần phải sử dụng nó để sửa chữa. Một hệ thống SCM không cần phải bị ép buộc như thế này, nếu nó xảy ra vì có gì đó không ổn (và cách tiếp cận đầu tiên của tôi trong những trường hợp như vậy sẽ là khôi phục lại các bản sao lưu và lặp lại các hoạt động để giữ nguyên lịch sử).

Vì vậy, có lẽ câu hỏi là tại sao bạn lại nổi loạn? Vì lịch sử 'sạch' khi đưa các tính năng trở lại thành chủ? Nếu vậy, bạn đang ném ra tất cả lịch sử tốt liên quan đến việc phân nhánh vì lý do phong cách hoàn toàn. Sáp nhập nhanh IMHO cũng không phải là một cách tốt nhất, bạn nên giữ tất cả lịch sử để bạn có thể thấy những gì bạn thực sự đã làm, không phải là một phiên bản vệ sinh sau đó.


Tất nhiên, bạn có thể kéo theo chủ nhân, rebase, và sau đó lực đẩy, nhưng đó không phải là nguyên tử.
Kevin

@gbjbaanb bạn hoàn toàn đúng, chiến lược nổi loạn là tất cả về lý do phong cách / lịch sử dễ đọc hơn. Tôi không cố gắng để tranh luận rằng nó tốt hơn hay không. Nhưng nó có thể làm như vậy, và đó là điểm tôi muốn nêu ra. Tất nhiên tôi không nói về việc đẩy mạnh chủ, mà chỉ nói về các nhánh tính năng.
Joel

4
IMHO tính năng thiết kế của cả rebase và sáp nhập nhanh là một sai lầm. SCM là về việc giữ lịch sử để bạn có thể thấy những gì đã xảy ra khi bạn cần và chụp ảnh nhanh cho các điểm có liên quan kịp thời. Ít nhất đó là những gì hầu hết mọi người muốn, tôi đoán Linus muốn lịch sử đơn giản để anh ta đọc càng tốt và vì vậy hãy đặt chúng vào vì lợi ích của anh ta. Thay vào đó, IMHO nên nỗ lực nhiều hơn để tạo ra sự khác biệt giữa 2 phiên bản dễ quản lý hơn (nghĩa là cho phép chế độ xem đơn giản hơn, không phải là lịch sử cơ bản)
gbjbaanb

2
Khi bạn xuất bản một bài báo, bạn có xuất bản bản thảo đầu tiên không? Có luật nào nói rằng các công cụ bạn sử dụng để viết bản nháp đầu tiên không thể được sử dụng để chỉnh sửa nó để xuất bản không? Git là một công cụ phát triển. Nếu bạn muốn bảo tồn một cách đáng tin cậy và có thể kiểm chứng một loạt, hãy bảo tồn nó. Thay vào đó, nếu bạn muốn chỉnh sửa nó để xuất bản, hãy chỉnh sửa nó. Git's stellar ở cả hai nhiệm vụ.
jthill

5

Rebase không cần thiết, như bạn nói nó chủ yếu là mỹ phẩm. Đôi khi nó đơn giản hơn rất nhiều sau đó là một sự hợp nhất. Vì vậy, nó có thể có một số giá trị "thực tế", nhưng chỉ "đôi khi"

Sử dụng rebase không đúng cách có thể tốn kém. Không có khả năng mất dữ liệu nếu bạn biết đủ để không hoảng loạn và tìm kiếm các quy trình phục hồi, nhưng "không ai cố gắng trong một thời gian tôi phải sửa ..." không phải là tuyệt vời. Cũng không có ai đốt thời gian để phục hồi nghiên cứu và thử nghiệm khi họ có thể đã thêm các tính năng hoặc xóa lỗi (hoặc ở nhà với gia đình).

Với sự đánh đổi đó, kết quả của "rất ít người thực hiện một cuộc nổi loạn và thúc ép" không có gì đáng ngạc nhiên.

Một số quy trình công việc có thể làm giảm rủi ro, ví dụ như giảm nó xuống "không miễn là bạn nhớ những nhánh nào bạn được phép buộc và những gì bạn không thể". Trong thực tế, chúng có thể đủ an toàn để biện minh cho rủi ro, nhưng mọi người thường đưa ra lựa chọn dựa trên văn hóa dân gian lớn hơn. Sau đó, một lần nữa trong thực tế, lợi ích là khá nhỏ, vậy rủi ro thực sự cần phải nhỏ đến mức nào?


3
"Này, không ai thúc ép tôi phải sửa cả ..." .. nghe có vẻ như ngày xưa sử dụng Visual Source Safe. Tôi nghĩ rằng git là tốt hơn thế.
gbjbaanb

Đúng, do đó mọi người đưa ra các quy tắc như "không chơi với các công cụ sắc bén! (Lực đẩy)" Vì vậy, họ có thể tránh điều trị các vết thương có thể tránh được!
Sọc

2
@gbjbaanb Vâng, Git tốt hơn thế - khi bạn sử dụng đúng cách. Khiếu nại về việc Git không thể đối phó với sự phát triển đồng thời một cách thanh lịch khi bạn liên tục nổi loạn và thay đổi các bản băm cam kết của mọi thứ giống như phàn nàn về những chiếc xe hơi thấp hơn xe ngựa vì chúng nặng hơn nhiều so với ngựa kéo. Đó không phải là lỗi của công cụ mà mọi người khăng khăng sử dụng sai ...
Idan Arye

4
Vâng, đó là lỗi của công cụ. Git phơi bày RẤT NHIỀU cạnh sắc nét, và trong khi đôi khi lưu ý rằng chúng sắc nét thì điều đó thường không xảy ra. Nếu bạn so sánh nó để nói CVS trong đó tất cả các bit sắc nét nằm trong một tiểu ban SINGLE ("quản trị viên cvs"? Nó sẽ mất một thời gian ...) mà không thể nói rằng "điều này có thể cắt bạn xấu, đừng sử dụng nó trừ khi bạn có nhu cầu khủng khiếp ". Hoặc các hệ thống kiểm soát phiên bản khác mà bỏ qua các khả năng có thể gây tổn thương.
Sọc

4
Điều đó không có nghĩa là git đã không đưa ra các lựa chọn thiết kế hợp lệ (chức năng liên quan đến nhóm theo tiểu ban và thích cho phép git giải quyết những điều phức tạp hơn trong tay phải) ... nhưng chúng là LỰA CHỌN và người ta có thể chỉ trích lựa chọn để có nhiều cạnh sắc nét, giống như người ta có thể chỉ trích sự lựa chọn của các VCS khác để loại bỏ rất nhiều tính năng hữu ích "chỉ vì ai đó có thể bị tổn thương".
Sọc

2

Để thêm một giọng nói khác:

Có, nếu bạn làm việc như bạn mô tả, không có vấn đề gì với việc sử dụng rebasevà đẩy mạnh. Điểm quan trọng là: Bạn có một thỏa thuận trong nhóm của bạn.

Các cảnh báo về rebasevà bạn bè là cho trường hợp không có thỏa thuận đặc biệt. Thông thường, git bảo vệ bạn tự động, ví dụ, bằng cách không cho phép đẩy không nhanh về phía trước. Sử dụng rebasevà lực đẩy đè lên sự an toàn đó. Điều đó ổn nếu bạn có một cái gì đó khác.

Trong nhóm của tôi, đôi khi chúng tôi cũng phản ứng lại các nhánh tính năng nếu lịch sử đã trở nên lộn xộn. Chúng tôi hoặc xóa chi nhánh cũ và tạo một cái mới với một tên mới hoặc chúng tôi chỉ phối hợp không chính thức (điều này là có thể bởi vì chúng tôi là một nhóm nhỏ và không ai khác làm việc trong kho lưu trữ của chúng tôi).


Lưu ý rằng bản thân dự án git cũng thực hiện một điều tương tự: Họ có một nhánh tích hợp thường xuyên được tạo lại, được gọi là "pu" ("cập nhật được đề xuất"). Nó được ghi nhận rằng chi nhánh này được tạo lại thường xuyên, và bạn không nên dựa trên công việc mới.


1

Vì vậy, tôi thừa nhận: ngay khi có lực đẩy, có nguy cơ mắc lỗi. Đung. Nhưng cũng có nhiều cách để khắc phục lỗi và thực sự, trong 3 năm phát triển, tôi đã không thấy nhiều sai lầm về lực lượng và khi nó xảy ra, chúng tôi luôn tìm ra cách phục hồi đúng cách.

Lý do mà người dùng Git có xu hướng tránh lịch sử có thể thay đổi được chia sẻ là vì không có tự động tránh hoặc sửa chữa các vấn đề này. Bạn phải biết những gì bạn đang làm, và bạn phải sửa chữa mọi thứ bằng tay nếu bạn làm hỏng. Cho phép chính xác một người thực hiện lực đẩy là không trực quan và trái với thiết kế phân tán của Git. Điều gì xảy ra nếu người đó đi nghỉ? Có ai khác tạm thời sở hữu chi nhánh? Làm thế nào để bạn biết họ sẽ không đi bộ trên tất cả những gì chủ sở hữu ban đầu đang làm? Và trong thế giới nguồn mở, điều gì xảy ra nếu chủ sở hữu chi nhánh dần dần rời khỏi cộng đồng mà không chính thức rời đi? Bạn có thể mất rất nhiều thời gian chờ đợi để trao quyền sở hữu chi nhánh cho người khác.

Nhưng vấn đề thực sự là đây: Nếu bạn gây rối và không nhận ra ngay lập tức, những cam kết cũ cuối cùng sẽ biến mất sau khi đủ thời gian trôi qua. Tại thời điểm đó, vấn đề có thể không thể phục hồi (hoặc ít nhất, có khả năng rất khó phục hồi, tùy thuộc vào câu chuyện sao lưu của bạn trông như thế nào - bạn có sao lưu các bản sao cũ của kho Git của mình không, không chỉ là bản sao?).

Tương phản điều này với công việc tiến hóa Changeet của Mercurial (mà tôi cần lưu ý, vẫn chưa kết thúc hoặc ổn định). Mọi người đều có thể thực hiện bất kỳ thay đổi nào đối với lịch sử mà họ thích, miễn là các thay đổi không được đánh dấu công khai. Những sửa đổi và nổi loạn này có thể được đẩy và kéo với hoàn toàn không bị trừng phạt, không cần chủ sở hữu chi nhánh. Không có dữ liệu nào bị xóa; toàn bộ kho lưu trữ cục bộ chỉ là phụ lục. Những thay đổi không còn cần thiết được đánh dấu lỗi thời, nhưng được giữ vô thời hạn. Cuối cùng, khi bạn làm rối tung lịch sử của mình (được coi là một phần bình thường trong quy trình làm việc hàng ngày của bạn), sẽ có một lệnh tiện lợi để tự động dọn dẹp nó cho bạn. Đây là loại người UX mong đợi trước khi họ đi sửa đổi lịch sử chia sẻ.


Tôi đồng ý với "triết lý git" này và tôi cũng nghĩ rằng triết học đôi khi có thể bị hack :). Nghiêm trọng hơn, như tôi đã nói trong các bình luận, cách đây 3 năm, tôi đã gặp trường hợp cụ thể là có một công cụ đánh giá mã hoạt động như một công cụ sao lưu thực tế, ngăn chặn sự mất mát nghiêm trọng như vậy. Bây giờ tôi vẫn nghĩ rebase là ổn khi bạn chắc chắn "kiểm soát" một nhánh. Ngay cả trong một dự án mã nguồn mở, nếu tôi đang phát triển một tính năng và mở một yêu cầu kéo, tôi "sở hữu" PR đó, tôi cho rằng tôi có quyền từ chối chi nhánh của nó, tôi không muốn làm hỏng công việc của mình trong khi nổi loạn ... (1/2)
Joel

... và nếu một số người muốn mang lại sự sửa đổi cho PR đó thì tôi nghĩ họ nên nói với tôi trước, và đó là vấn đề giao tiếp. (2/2)
Joel

Tái bút: cảm ơn vì liên kết tiến hóa Changeet, điều đó thật thú vị
Joel

Trên thực tế, rebase giống như nói: "hãy viết lại tất cả công việc của tôi từ đầu (từ chủ nhân mới nhất), xóa tất cả công việc trước đây của tôi." Nếu bạn ổn để làm điều đó, bạn có thể bắt đầu lại.
Joel
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.