Có sai không khi git lực đẩy chi nhánh?


10

Khi tôi làm việc trên một nhánh tính năng, tôi có xu hướng muốn dọn sạch các cam kết trong nhánh bằng cách sử dụng một rebase tương tác trước khi công việc của tôi được xem xét và tích hợp trong nhánh chính.

Trong quá trình phát triển tính năng, tôi muốn đẩy công việc trung gian của mình đến kho lưu trữ từ xa như một biện pháp dự phòng. Tức là khi ổ cứng của tôi gặp sự cố, tôi không muốn toàn bộ nhánh tính năng của mình bị mất.

Tuy nhiên, điều này dẫn đến thực tế là tôi thường phải thực hiện một git push --forcekho lưu trữ từ xa sau một cuộc nổi loạn, một hành động thường được tán thành. Hoặc như trang github được liên kết nói:

Vì việc thay đổi lịch sử cam kết của bạn có thể gây khó khăn cho những người khác khi sử dụng kho lưu trữ, nên nó được coi là thực hành xấu để phản hồi lại các cam kết khi bạn đã bị đẩy vào kho lưu trữ.

Có một chính sách (thường được chấp nhận) để giải quyết xung đột này?

Tại sao đây không phải là bản sao của "Nguyên tắc vàng nổi loạn" rất cần thiết?

Câu hỏi của tôi ở đây yêu cầu một chính sách để giải quyết xung đột giữa việc muốn sao lưu công việc của bạn trong kho lưu trữ từ xa và từ chối công việc của bạn , trong khi câu hỏi khác cố gắng phủ nhận rằng có một cuộc xung đột và hỏi tại sao một số người nghĩ rằng xung đột tồn tại, và do đó hỏi tại sao "nó là thiết yếu" không đẩy lực lượng nổi dậy?



1
@gbjbaanb nếu bạn thực hiện các cam kết WIP, một rebase rất hữu ích để tránh có nhiều cam kết trong một ngày làm việc. Tôi thường thực hiện các thay đổi nhỏ chỉ để tôi có tùy chọn "hoàn tác trạng thái tôi nhớ" nếu cần - hầu hết những điều này không liên quan / tiếng ồn đối với lịch sử chính của repo (đó là lý do tại sao rebase rất hữu ích).
thúc

1
@gbjbaanb Đó là vấn đề quan điểm tôi nghĩ. Nhiều đội sử dụng chiến lược nổi loạn để giữ cho lịch sử của họ sạch sẽ.
Chiel ten Brinke

1
@enderland mọi người đều muốn lịch sử đẹp, đó vẫn là điều sai (và nguy hiểm) phải làm như được hiển thị bởi liên kết. Torvalds không bao giờ nên đặt nó vào, anh ta nên cho phép các cam kết được "nén" trên màn hình thay thế.
gbjbaanb

1
@gbjbaanb nhưng ... anh ấy đã không làm, và vì vậy chúng tôi phải làm việc với những gì chúng tôi có. Đối với tôi, sẽ hữu ích hơn nhiều khi có một cam kết duy nhất trên nhánh chính thay vì 30+ cam kết riêng lẻ và gia tăng từ mỗi nhánh tính năng. Nhưng mọi người sẽ có một quy trình làm việc khác nhau, tôi đoán ...
enderland 14/03/2016

Câu trả lời:


5

Câu hỏi chính để tự hỏi:

  • Bạn có giữ chi nhánh từ xa của bạn sau khi hợp nhất trở lại thành chủ?

Nếu bạn xóa nhánh tính năng từ xa sau khi hợp nhất thành chủ, bạn đã mất lịch sử. Giả sử bạn squash / rebase chi nhánh trước khi thực hiện hợp nhất / PR, bạn sẽ mất lịch sử này. Tất cả lực đẩy của bạn đang làm trong trường hợp này là cho phép bạn sử dụng github làm dự phòng.

Tình huống mà bạn muốn giữ lịch sử và không ép buộc là nếu chi nhánh từ xa của bạn vẫn tồn tại sau khi được sáp nhập và không chỉ tồn tại trong một khoảng thời gian tạm thời.

Tôi cho rằng bạn đang hỏi liệu tôi có giữ được chi nhánh không bị cấm không? Không, AFAIC. Tuy nhiên, việc ép buộc về mặt lý thuyết có thể dẫn đến việc mất các cam kết từ những người dùng khác đã đẩy đến cùng chi nhánh

Có vẻ như bạn có nhiều người đẩy đến chi nhánh đó cùng một lúc. Đây có nghĩa là bạn làm quan tâm đến lịch sử trên các chi nhánh.

Thay vào đó, những gì bạn có thể làm cho công việc trung gian của mình là tạo một nhánh của nhánh đó. Bạn có thể đẩy sang điều này và sau đó khởi động lại tất cả các cam kết của bạn thành một cam kết duy nhất trước khi hợp nhất, vì vậy khi bạn hợp nhất chúng vào nhánh tính năng của mình, bạn chỉ có 1 cam kết (với lịch sử bị từ chối của toàn bộ chi nhánh của bạn).


"Bạn có giữ chi nhánh từ xa của mình sau khi hợp nhất trở lại thành chủ không?" Tôi cho rằng bạn đang hỏi liệu tôi có giữ được chi nhánh không bị cấm không? Không, AFAIC. Tuy nhiên, việc ép buộc về mặt lý thuyết có thể dẫn đến việc mất các cam kết từ những người dùng khác đã đẩy đến cùng một chi nhánh.
Chiel ten Brinke

@ChieltenBrinke Tôi đã chỉnh sửa một chút về điều đó. FYI
enderland 14/03/2016

Tôi nghĩ rằng việc rèn như là một biện pháp để ngăn chặn phá hủy cam kết khi lực đẩy thực sự là một gợi ý rất tốt. Nhưng AFAIK nó không thực sự là một khái niệm git và bạn cần một trình bao bọc dịch vụ xung quanh đó để thực hiện điều này một cách dễ dàng (chẳng hạn như github). Tôi có đúng về điều đó không? Hoặc có thể tôi nhầm bạn sử dụng thuật ngữ "forking" chỉ để tạo một nhánh riêng biệt?
Chiel ten Brinke

@ChieltenBrinke tốt, bạn có thể hoàn thành điều tương tự bằng nhiều cách khác nhau. Nếu nhánh tính năng của bạn nằm trên kho lưu trữ từ xa, bạn có thể rẽ nhánh repo và có phiên bản của nhánh đó. Và sau đó hợp nhất nhánh đó vào nhánh từ xa của bạn sau khi squash cam kết. Hoặc bạn chỉ có thể tạo một nhánh cục bộ khác (có thể featurebranch-local) và sau đó thực hiện dev hoạt động trên nhánh đó, với số lần xác nhận như bạn muốn. Khi bạn muốn hợp nhất, hãy xóa các cam kết đó và sau đó hợp nhất chúng vào tính năng. Về cơ bản chỉ cần làm dev trong một nhánh tạm thời thực tế và sau đó nén / sáp nhập vào tính năng của bạn.
thúc vào

Giả sử rằng việc hủy một repo là không có lựa chọn vì người ta không sử dụng github, chúng tôi sẽ làm việc với một develop-featurechi nhánh "riêng tư" . Tất nhiên tính riêng tư hoàn toàn theo quy ước và không được thực thi bởi bất cứ điều gì, nhưng có thể là một phần của chính sách, đặc biệt là nếu các quy ước đặt tên chi nhánh nhất định được đưa ra cho việc này. (Có lẽ tôi đang quá lo lắng ngay bây giờ, có thể không :) Sự kết hợp với --force-with-leasekhông thể bị tổn thương, mặc dù không nên dựa vào, như đã chỉ ra trong bài đăng khác của tôi.
Chiel ten Brinke

3

Tôi đang liệt kê một số khả năng ở đây mà vượt qua tâm trí của tôi.

Luôn nổi loạn trên một nhánh mới

Khi có một nhánh lộn xộn some-feature, hãy khởi động lại nó trên một nhánh mới. Ví dụ

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

Sau đó đã some-feature-rebasexem xét và tích hợp.

Vấn đề: Một nhược điểm lớn ở đây là, nói đúng ra, bạn cần một nhánh mới cho mỗi cuộc nổi loạn. (Chẳng hạn, bạn có thể có nhiều lần nổi loạn nếu bạn thực hiện thay đổi sau khi xem xét mã)

Sử dụng git push --force-with-lease

Tôi vừa tìm hiểu về sự git push --force-with-leasethay thếgit push --force ,

từ chối cập nhật một chi nhánh trừ khi đó là trạng thái mà chúng ta mong đợi; tức là không ai cập nhật chi nhánh ngược dòng.

Vấn đề : Điều này dường như cải thiện trực tiếp tình huống chúng ta chỉ sử dụng --force, nhưng vẫn có một số cảnh báo, đáng chú ý nhất là khi tôi thực hiện git fetchthay vì git pullcập nhật các nhánh ngược dòng cục bộ của chúng tôi, đánh lừa --force-with-leaserằng không có thay đổi nào không được thực hiện trên điều khiển từ xa chi nhánh.

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.