Cách tránh địa ngục hợp nhất-cam kết trên GitHub / BitBucket


100

Chúng tôi kết thúc với rất nhiều cam kết như thế này trong repo của chúng tôi:

Merge branch 'master' of bitbucket.org:user/repo

Điều này xảy ra mỗi khi nhà phát triển đồng bộ hóa bản fork cục bộ của họ với repo cấp cao nhất.

Có cách nào để tránh địa ngục hợp nhất-cam kết này làm lộn xộn tất cả nhật ký repo không? Người ta có thể tránh chúng khi bắt đầu các yêu cầu kéo theo một cách nào đó không?

Tôi biết tôi có thể thực hiện git rebase nếu điều này chỉ được thực hiện trong máy ảo cục bộ của tôi, có bất kỳ sự tương đương nào trong giao diện người dùng GitHub / BitBucket không?

Làm thế nào để các bạn làm điều đó?

Câu trả lời:


135

Rebase các nhánh tính năng trước khi hợp nhất

Nếu bạn muốn tránh các cam kết hợp nhất, bạn cần đảm bảo tất cả các cam kết được chuyển tiếp nhanh. Bạn làm điều này bằng cách đảm bảo rằng nhánh tính năng của bạn phục hồi rõ ràng vào dòng phát triển của bạn trước khi hợp nhất như vậy:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase cũng có rất nhiều cờ, bao gồm cả phục hồi tương tác với -icờ, nhưng bạn có thể không cần điều đó nếu bạn đang giữ mọi thứ đơn giản nhất có thể và muốn lưu giữ tất cả lịch sử chi nhánh của mình khi hợp nhất.

Sử dụng --ff-onlycờ

Ngoài việc phục hồi, việc sử dụng --ff-onlycờ sẽ đảm bảo rằng chỉ các cam kết tua đi nhanh mới được phép. Một cam kết sẽ không được thực hiện nếu thay vào đó nó sẽ là một cam kết hợp nhất. Trang hướng dẫn sử dụng git-merge (1) cho biết:

--chỉ

Từ chối hợp nhất và thoát với trạng thái khác 0 trừ khi HEAD hiện tại đã được cập nhật hoặc việc hợp nhất có thể được giải quyết dưới dạng tua nhanh.


1
Đây là một câu trả lời tuyệt vời. Tôi sử dụng rebase thường xuyên nhất có thể. Tôi không biết về cờ --ff-only. Tuyệt đấy!
Leo Correa

3
Cảm ơn vì những lời khuyên chỉ dành cho rebase và --ff. Tuy nhiên, như đã nói trong câu hỏi của tôi, làm cách nào tôi có thể thực hiện việc này trong giao diện người dùng của GitHub / BitBucket?
Niklas9

3
@Niklas Tôi khá chắc rằng bạn sẽ cần đến CLI để làm những gì bạn muốn. GitHub không tiết lộ toàn bộ sức mạnh của Git; chỉ là một tập hợp con các tính năng của nó cộng với một số giá trị gia tăng về đồ họa và mạng xã hội. Chúc may mắn!
Todd A. Jacobs

3
Một điều cần lưu ý với quá trình này là, trước khi hợp nhất nhánh chủ đề (feature / foo) trở lại thành cái chính, bạn nên git pull origin master (nếu sử dụng điều khiển từ xa), để đảm bảo nhánh chính được cập nhật . Nếu tìm thấy các bản cập nhật, hãy đảm bảo một lần nữa rebase master vào nhánh chủ đề trước khi hợp nhất nó trở lại thành master.
chikamichi

19
@CodeGnome không gọi nó là "đang sử dụng" CLI ... trong thực tế, bạn nên cảnh báo về việc "sử dụng" giao diện người dùng!
Droogans

9

"Todd A. Jacobs" đã đề cập đến "rebase" là khái niệm ở đây. Đây chỉ là một cách làm chi tiết hơn.

Giả sử bạn đang ở nhánh chính

$ git branch
  * master

Bạn muốn thực hiện một bản sửa lỗi, vì vậy hãy tạo một "fixbranch" được phân nhánh từ cái chính

$ git checkout -b fixbranch

Có thể bạn đã làm việc vài ngày ở chi nhánh này và có một vài cam kết.

Ngày bạn muốn đẩy cam kết của mình lên repo chính trung tâm! Kiểm tra tổng thể và nhận các thay đổi mới nhất từ ​​repo chính trung tâm

$ git checkout master
$ git pull origin master

Rebase fixbranch của bạn với master để có một lịch sử rõ ràng và giải quyết các xung đột nếu có trong chính repo cục bộ.

$ git checkout fixbranch
$ git rebase master

Bây giờ fixbranch đã được cập nhật với máy chủ trung tâm, hãy để tôi hợp nhất fixbranch vào nhánh chính

 $ git checkout master
 $ git merge fixbranch

Tôi đã xong! hãy để tôi đẩy chủ sở hữu địa phương đến chủ trung tâm

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing


Tôi đánh giá cao câu trả lời này.
lasec0203
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.