2011-08-27 30 views
7

Tôi đã có một số cam kết chưa được dọn sạch trong con của tôi trong nhánh chính của chúng tôi. Tôi đã thực hiện rebase thành một nhánh tính năng, và kết hợp thành công vài xung đột dẫn đến, nhưng tôi đã không nhận ra rằng việc rebase sẽ không để lại cho tôi trên nhánh tính năng. Nếu tôi bây giờ git kiểm tra chi nhánh tính năng, nó có lẽ sẽ ghi đè lên những thay đổi đã cam kết của tôi trong cây làm việc của tôi, để lại chúng trong một số loại limbo. Tôi có thể "git checkout -m", nhưng điều đó dường như chỉ để hợp nhất các thay đổi cục bộ không được cam kết. Làm thế nào tôi có thể nhận được vào các chi nhánh tính năng và giữ những thay đổi chưa được cam kết nhưng cam kết của tôi mà tôi hiện đang có trong chi nhánh chính (mà không đẩy họ đến chi nhánh chủ)? Tôi có nên sử dụng git rebase -onto không? Nếu vậy, tôi nên làm gì bây giờ mà tôi đã rebased mà không có -onto?cách di chuyển các thay đổi đã cam kết nhưng chưa được hủy bỏ sang chi nhánh khác?

+0

Không phải là bản dupe. Đó là một vấn đề rất khác với những thay đổi đã được cam kết, chưa kể đến đã trải qua một sự tái phạm không chính xác. –

Trả lời

7

Bạn có thể làm điều đó như thế này:

  1. git checkout branch để kiểm tra các chi nhánh tính năng.
  2. git reset --hard master để di chuyển chi nhánh giống như cam kết master ngay bây giờ. Bằng cách này, bạn mất tất cả các cam kết trong nhánh. Bởi vì rebase của bạn, tất cả những cam kết nên có bản sao trên master, vì vậy bạn không nên thực sự mất bất cứ điều gì.
  3. git checkout master để thanh toán master.
  4. git reset --hard origin/master để đặt lại master về trạng thái trên origin repo. Điều này giả định bạn không có bất kỳ thay đổi nào chưa được sửa đổi thành master. Nếu bạn làm như vậy, hãy thay thế origin/master bằng id cam kết bạn muốn đặt lại.
+0

"bạn mất tất cả các cam kết trong chi nhánh ..." Tôi không làm theo phần này. Mục tiêu của tôi là giữ cho các cam kết chưa được dọn dẹp của tôi bằng cách di chuyển chúng đến nhánh tính năng. "điều này giả định bạn không có bất kỳ thay đổi chưa được sửa nào để làm chủ". Một lần nữa, cam kết không được tẩy rửa là toàn bộ lý do tại sao tôi hỏi câu hỏi của tôi. – BrianHoltz

+0

Tôi thấy rằng wat tôi muốn làm được mô tả trong trang git-reset man dưới "Hoàn tác một cam kết, biến nó trở thành một nhánh chủ đề". – BrianHoltz

+0

Trang git man được BrianHoltz đề cập ở đây: http://git-scm.com/docs/git-reset/2.0.0#_examples –

3

Trước hết hãy hạn chế tình huống của bạn để đảm bảo tôi đã hiểu chính xác. Bạn đã thực hiện một vài cam kết trên master và muốn di chuyển chúng đến feature, vì vậy bạn đã chạy git rebase feature? Trước tiên, bạn muốn hoàn tác điều đó. Giả sử bạn vẫn có master đã đăng xuất và chưa thực hiện bất kỳ lần rebases nào kể từ đó, hãy chạy git reset --hard ORIG_HEAD để hoàn tác quá trình rebase.

Bây giờ, để có cách thích hợp để chuyển các cam kết của bạn sang chi nhánh feature. Thực hiện và kiểm một chi nhánh tạm thời, do đó bạn không gây rối lên master:

git checkout -b temp 

Bây giờ rebase tất cả các thay đổi được thực kể từ khi cam kết cuối cùng trên origin/master vào feature:

git rebase --onto feature origin/master 

Đó di chuyển các chi nhánh temp như nếu nó được phân nhánh từ feature. Bây giờ để trộn các thay đổi vào feature, làm:

git checkout feature 
git merge temp 
git branch -d temp 

Nó sẽ là một nhanh về phía trước hợp nhất kể từ khi bạn chỉ rebased.

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