2010-05-26 33 views
20

Tôi làm việc với một nhóm nhỏ sử dụng git để quản lý mã nguồn. Gần đây, chúng tôi đã làm các nhánh chủ đề để theo dõi các tính năng sau đó hợp nhất chúng thành chủ cục bộ sau đó đẩy chúng vào một kho lưu trữ git trung tâm trên một máy chủ từ xa. Điều này làm việc tuyệt vời khi không có thay đổi nào được thực hiện trong master: Tôi tạo nhánh chủ đề của mình, commit nó, hợp nhất nó vào master, sau đó push. Hoan hô.git rebase vào bản cập nhật từ xa

Tuy nhiên, nếu ai đó đã đẩy xuất xứ trước khi tôi làm, các cam kết của tôi không tiến nhanh. Do đó, một cam kết hợp nhất xảy ra sau đó. Điều này cũng xảy ra khi một nhánh chủ đề cần hợp nhất với nội bộ chính để đảm bảo các thay đổi của tôi hoạt động với mã như bây giờ. Vì vậy, chúng tôi kết thúc với hợp nhất cam kết ở khắp mọi nơi và một git đăng nhập cạnh tranh một vòng tay tình bạn.

Vì vậy, việc rebasing là lựa chọn hiển nhiên. Những gì tôi muốn là:

  • tạo các chi nhánh chủ đề giữ nhiều cam kết
  • thanh toán tổng thể và kéo (nhanh về phía trước, vì tôi đã không cam kết để làm chủ)
  • chi nhánh rebase chủ đề lên người đứng đầu mới của nắm vững
  • rebase chủ đề chống chủ (vì vậy các chủ đề bắt đầu từ chủ đầu), đưa tổng thể lên đến tôi đầu chủ đề

cách của tôi để làm điều này hiện đang được liệt kê dưới đây:

01.
git checkout master 
git rebase master topic_1 
git rebase topic_1 topic_2 
git checkout master 
git rebase topic_2 
git branch -d topic_1 topic_2 

Có cách nào nhanh hơn để thực hiện việc này không?

Trả lời

10

tôi đã tìm thấy, theo thời gian, giải pháp ưa thích của tôi là:

git checkout topic 
# make [n] commits 
git rebase -i HEAD~[n] #clean up time 
git checkout master 
git pull --rebase 
git checkout topic 
git rebase master 
git checkout master 
git merge topic 
git push origin 
+0

Là sự hợp nhất cuối cùng cần thiết. Tôi có thể tưởng tượng sự mới lạ của việc nhìn thấy tất cả các nhánh làm việc trên đồ thị nhưng mã đã được tích hợp vào tổng thể và tôi không nghĩ rằng nó không hợp lý để tung ra mã làm việc nếu nó không trở thành một ngã ba chính hãng. Nếu không thì IMHO, câu trả lời này là hoàn hảo. –

2

Đối với nhóm của chúng tôi, chúng tôi thiết lập một thứ gì đó hoạt động rất tốt và không sử dụng rebase.

Chúng tôi cắt công việc của chúng tôi trong vé Jira mà không mất quá nhiều thời gian, thường là 1-2 ngày nỗ lực. Mỗi dev tạo ra một chi nhánh cho mỗi vé và hoạt động trên nhánh này. Khi đã sẵn sàng để chia sẻ điều này được đẩy đến máy chủ trung tâm.

Máy chủ trung tâm được giám sát bởi máy chủ CI hudson, kéo các thay đổi, hợp nhất tất cả các nhánh đã cập nhật, xây dựng lại phần mềm, chạy thử nghiệm và đẩy mọi thứ vào kho lưu trữ chính của git.

Từ đó chúng tôi kéo nó trở lại kho lưu trữ của chúng tôi. Chúng tôi thường xuyên (tức là vài ngày một lần) hợp nhất các nhánh làm việc của chúng tôi với chủ nhân trung tâm để giữ chúng gần gũi.

Vì không có ai đang làm việc trên máy 'hợp nhất' và không ai khác ngoài máy chủ CI chạm vào máy chủ, chúng tôi đã vô tình hợp nhất các vấn đề (trong khoảng 1-2% số tiền cam kết). Và chúng được giải quyết nhanh chóng trên máy chủ xây dựng bằng cách dọn dẹp vùng làm việc. Chúng tôi thấy chúng tôi có thể tránh được hầu hết những điều này bằng cách giữ cho các nhánh ngắn và sáp nhập với chủ từ xa trước khi đẩy.

Tôi cũng thích rằng việc hợp nhất mạnh mẽ hơn nhiều so với việc rebasing và đòi hỏi ít nhiều việc phải làm lại.

+0

Thật tuyệt vời để phát triển chậm hơn, nhưng chúng tôi có môi trường yêu cầu một số cam kết tăng lên hàng đêm trong khi những người khác chờ bản phát hành lớn hơn. Tôi đoán một cách để xử lý đó là thiết lập hàng đêm và phát hành các nhánh trên kho lưu trữ từ xa ... nhưng có vẻ như nó có thể mời nhiều hơn các cam kết hợp nhất này nếu không được tôn trọng đầy đủ. Mặc dù tôi cũng tin rằng việc hợp nhất là mạnh mẽ hơn, Nhóm của chúng tôi có khả năng tìm ra git-rebase và làm việc thông qua các vấn đề. Có một lịch sử cam kết dễ đọc hơn cũng quan trọng đối với tôi. –

+0

Cá nhân, tôi nghĩ rằng các loại sáp nhập là xấu xí/lộn xộn trong lịch sử vì vậy tôi luôn luôn rebase temp/chi nhánh phát triển đến nguồn gốc từ xa. Tuy nhiên, tôi thấy thú vị là nhóm của bạn đã triển khai hiệu quả kế hoạch hợp nhất chỉ với một số vấn đề và lợi ích có thể đo lường. Bạn có rebase trên lịch trình kéo thường xuyên của bạn để giữ cho mọi thứ 'gần gũi hơn' với chủ trung tâm? "Làm sạch không gian làm việc" là gì? Và, bạn có kéo và rebase để kiểm tra các xung đột trước khi hợp nhất với kho lưu trữ trung tâm không? –

+0

@EvanPlaice Vệ sinh vùng làm việc đang xóa thư mục làm việc trên Jenkins. Lần sau, một bản sao mới được tạo ra. –

30

Bạn có biết về git pull --rebase không? Nó rebases hơn là sáp nhập khi bạn kéo, và ngăn chặn các cam kết hợp nhất từ ​​gây ô nhiễm lịch sử của bạn.

Bạn cũng có thể thiết lập làm hành vi mặc định cho chi nhánh với các tùy chọn cấu hình branch.<name>.rebasebranch.autosetuprebase.

+2

có và tôi thường xuyên sử dụng nó khi cập nhật cơ sở mã được chia sẻ lên cơ sở mới nhất từ ​​xa. Tuy nhiên, bài viết này đã được nhiều hơn về các chi nhánh tính năng một cách sắp xếp hợp lý hơn để làm như vậy và git kéo rebase không phải là nó IMO. Tuy nhiên, chi nhánh tự động rebase là một tính năng tuyệt vời và tôi đã thêm nó vào một vài repos. Mẹo tuyệt vời! :) –

1

Bạn cũng có thể chỉ rebase so với up-to-date chủ

git checkout topic_1 
git rebase refs/remotes/origin/master 

nào obviates sự cần thiết cho kéo (ít nhất là cho đến EOL của chi nhánh tính năng của bạn). Quá trình của chúng tôi sử dụng các yêu cầu kéo GitHub vì vậy tôi không bao giờ cần phải làm điều đó cục bộ.

Các vấn đề liên quan