2015-09-28 15 views
8

Luồng công việc git điển hình của tôi là tạo một nhánh đặc trưng khỏi nhánh chính của chúng ta, thực hiện các cam kết nhỏ, trong khi hợp nhất định kỳ từ chính trên đường đi.Khôi phục tương tác sau khi hợp nhất/các cam kết xen kẽ khác của tôi

Sau đó, tôi mở yêu cầu kéo trên github và khi được chấp nhận, tôi sẽ xóa chi nhánh. Tôi muốn tương tác rebase nhiều hơn nhưng khi tôi làm tôi sẽ gặp phải cam kết hợp nhất và cam kết của người khác xen kẽ với của riêng tôi. Tôi không chắc chắn làm thế nào/nếu tôi có thể squash những cam kết hoặc nhóm/squash tôi một mình?

Ví dụ, git log của tôi cho chi nhánh của tôi có thể trông như thế này khi nói đến thời gian để rebase:

merge commit 
someone else's commit 
one of my commits 
another one of my commits 
another merge commit 
another person's commit 
one of my commits, the first one after branching 

Tôi đang gặp rắc rối với những gì có thể và những gì không khi thực hiện một rebase tương tác và cán nát và sắp xếp lại các cam kết. Với quy trình trên, bạn sẽ đề xuất điều gì?

+1

là có một lý do bạn đang sử dụng rebase? – ilj

+0

@ilj Các thành viên khác trong nhóm muốn giữ một lịch sử rõ ràng nhất có thể, vì vậy, để giữ lịch sử cam kết hợp lý. Cá nhân tôi không quan tâm đến một lịch sử trò chuyện hợp lý (không hoàn toàn nằm ngoài hàng) – jkj2000

+0

trong kinh nghiệm của tôi, nó tạo ra nhiều vấn đề hơn là giải quyết. – ilj

Trả lời

3

Quá trình chúng tôi sử dụng trong văn phòng của tôi là để rebase chi nhánh master (hoặc bất kỳ chi nhánh nào bạn mong muốn hợp nhất) trước khi hợp nhất yêu cầu kéo của bạn. Điều này đảm bảo rằng cam kết của bạn được sắp xếp trên đầu trang của tất cả các cam kết khác hiện đang trong master, mà loại bỏ sự interleaving các cam kết của mình với những người khác:

> git fetch upstream master 
> git rebase upstream/master 
+1

Tôi hiểu, cảm ơn. Vì vậy, tôi rebase từ chủ định kỳ, thay vì hợp nhất nó. – jkj2000

2

Tôi không chắc chắn làm thế nào/nếu tôi có thể dẹp những cam kết hay nhóm/squash tôi một mình?

Chỉ sử dụng các cam kết của bạn chứ không phải người khác !!

Gần đây, tôi gặp phải vấn đề tương tự, tôi đã có 41 cam kết về yêu cầu kéo của tôi, chi nhánh của tôi đã có xung đột hợp nhất và yêu cầu kéo của tôi đã cũ. Tôi đã phải đối phó với một số vấn đề mà bạn đang phải đối mặt bây giờ. Tôi sẽ chỉ chạm vào một cái gì đó tôi đã thực hiện.

one of my commits 
another one of my commits 
one of my commits, the first one after branching 

Tôi đề nghị bí chỉ cam kết của bạn (tất cả trong số họ nếu bạn muốn).

Ví dụ: nếu bạn có 3 lần commit, bạn có thể đánh số chúng và tạo thành một lần sử dụng tính năng rebase tương tác. Xem dưới đây lệnh:

$ git rebase -i HEAD~n 

Ví dụ, bạn muốn bí 3 cam kết:

$ git rebase -i HEAD~3 

Bây giờ, bạn sẽ thấy một giao diện rebase tương tác, nơi bạn có thể viết xây dựng lại và/pick on đầu tiên cam kết và bí trên phần còn lại của họ. Vui lòng xem video này để hiểu rõ hơn.

Squashing commits

merge commit 
someone else's commit 
another merge commit 
another person's commit 

rebase để khác (người khác) cam kết

Đây là vấn đề thường gặp tất cả mọi người phải đối mặt khi sử dụng git. Hãy tưởng tượng bạn đang làm việc trên repo địa phương của bạn. Sau khi làm việc một lúc, bạn đã thực hiện một số cam kết, bây giờ bạn muốn đẩy chúng vào kho lưu trữ từ xa ban đầu. Tuyệt, bạn đã thực hiện điều này git push có nội dung là merge commit vấn đề.

Bạn biết ai đó khác có thể cũng đã cam kết với cùng một repo từ xa được cập nhật ngay bây giờ. Vì repo cục bộ của bạn không được cập nhật lên bộ điều khiển từ xa, có merge commit problem. Bây giờ, nếu chúng ta xóa vấn đề này thì sao? Chúng tôi có thể cập nhật repo của máy cục bộ của bạn về bản gốc từ xa của bạn không? Có thể không?

Có, bạn có thể làm điều đó bằng cách rebasing. Làm sao?

Khi bạn làm:

git pull --rebase 

gì đang xảy ra ở đây? Git sẽ tua lại (lùi lại) tất cả các cam kết cục bộ của bạn, kéo các cam kết từ xa rồi phát lại các cam kết cục bộ của bạn trên đầu các cam kết từ xa mới được kéo. Nếu có bất kỳ xung đột nào phát sinh mà git không thể xử lý, bạn sẽ có cơ hội hợp nhất các cam kết thủ công sau đó chỉ cần chạy git rebase --continue để tiếp tục phát lại các cam kết cục bộ của bạn.

Xem này blog post để biết thêm chi tiết

Nếu bạn muốn kết hợp chi nhánh của bạn để làm chủ?

Best (and safest) way to merge a git branch into master

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