2010-02-08 43 views
16

Tôi muốn sử dụng git rebase để hợp nhất sạch một đối tượng địa lý trong nhánh chính (ít cam kết hoặc ít nhất ở đầu nhật ký thay đổi). Lưu ý rằng Tôi là người duy nhất làm việc trên kho lưu trữ.Làm thế nào để đẩy/kéo Git rebase

Sau khi đọc Git workflow and rebase vs merge questions, tôi thấy git rebase sẽ là khá đẹp và giống như Micah Tôi muốn git push thay đổi rebased đơn giản chỉ vì Tôi đang làm việc trên chúng từ nhiều nơi khác nhau (ví dụ: máy tính xách tay của tôi, nhà của tôi, PC khác ở đâu đó ...)

Vì vậy, đây là hai giải pháp (để hợp nhất xấu xí bi-directional):

  1. Sử dụng git push -f đẩy, và sau đó kéo trên máy tính khác, nhưng làm thế nào để sạch có được phiên bản mới nhất trên các máy khác?
  2. Sử dụng hợp nhất để hợp nhất sự thay đổi tổng thể để các tính năng chi nhánh, git push/pull, và một khi trưởng thành, làm một rebase duy nhất (trong một hoặc nhiều cam sạch)

(2) sẽ là như dưới đây:

git co -b feature-a 
... change files 
git push origin feature-a 
... moving to another PC 
git pull origin feature-a 
... change files 
git merge master 
... change files (not the "special rebase") 
git rebase master 
git co master 
git merge feature-a 
git branch -d feature-a 
git push origin :feature-a 

Bạn nghĩ giải pháp nào sẽ hoạt động? Tôi đã không thử một trong số họ cho đến nay (chủ yếu là do làm cho đăng nhập của tôi lộn xộn hơn).

Trả lời

11

Hãy nhớ rằng git rebase phát lại thay đổi và tạo các cam kết mới. Bằng cách rebasing và buộc đẩy tất cả các nơi, bạn sẽ đi ngược lại hạt của công cụ. Lưu ý cách phần "Recovering from an upstream rebase" của tài liệu git rebase bắt đầu (với sự nhấn mạnh thêm):

rebasing (hoặc bất kỳ hình thức nào khác viết lại) một chi nhánh mà người khác đã làm việc dựa trên là một ý tưởng tồi: ai hạ lưu của nó được buộc để khắc phục lịch sử của họ theo cách thủ công. Phần này giải thích cách khắc phục từ quan điểm của hạ lưu. Việc sửa chữa thực tế, tuy nhiên, sẽ là để tránh rebasing thượng nguồn ở nơi đầu tiên.

Mặc dù bạn là nhà phát triển duy nhất, bạn sẽ vẫn là những người khác (từ quan điểm của một repo) khi làm việc trong các bản sao khác. Như bạn đã thấy, quy trình làm việc này là một rắc rối.

Hãy để thay đổi của bạn nấu ăn trong các nhánh cây. Khi một chi nhánh đã sẵn sàng cho giờ vàng, hãy sau đó rebase, hợp nhất thành chính và xóa nhánh chủ đề của nó. Cuộc sống của bạn sẽ dễ dàng nhất nếu bạn giữ cho tuổi thọ của các nhánh ngắn và phạm vi hẹp.

+0

Có vẻ như tùy chọn (2) trong đề xuất của tôi. – Wernight

+1

"Hãy để thay đổi của bạn nấu ăn trong các nhánh." Tôi không hiểu nhận xét này. Anh ấy đã sử dụng các nhánh chủ đề cho những thay đổi mới.Trái tim của câu hỏi có vẻ là làm thế nào để kết hợp các nhánh từ xa và rebasing mà không làm phiền mọi người xung quanh bạn. –

13

Tôi luôn đảm bảo rằng tôi cam kết và đẩy (-f) mọi thứ từ bất kỳ máy nào tôi rời khỏi.

Khi tôi đến một số máy khác:

git fetch -v 
git checkout mybranch # Already checked out with old HEAD 
git reset --hard origin/mybranch 

này hoạt động tốt bởi vì tôi biết người kia "tôi" ở máy tính khác nhau một cách nhất quán cam kết và đẩy trước khi tôi rời (Và do đó không có thay đổi unpushed trên máy tôi đến)

+0

Hiện tại tôi tạo một bản vá các thay đổi của mình và truyền bản vá cho máy tiếp theo mà tôi sẽ làm việc. Quy tắc cá nhân của tôi là chỉ cam kết mã để biên dịch một cách rõ ràng và cũng vượt qua tất cả các bài kiểm tra. Tuy nhiên đây là một nỗi đau và tôi đã nghĩ về cách tiếp cận của bạn khá thường xuyên. Mặt khác, không phải điều này lúng túng lịch sử/reflog trên máy? –

+0

Đây là một thực tế tồi tệ nếu bạn đang làm việc với người khác.'push -f' xóa câu chuyện của người khác và buộc họ phải làm lại. – rvazquezglez

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