2012-09-10 34 views
29

Tôi đang cố gắng trợ giúp một đồng nghiệp đã vô tình tạo một chi nhánh tính năng từ một nhánh đối tượng địa lý khác, thay vì tạo chi nhánh thứ hai từ nhánh chính. Đây thực chất là những gì chúng ta có bây giờ ...Chia nhánh git thành hai nhánh?

Master ---A---B---C 
        \ 
       Foo E---F---F---H 
           \ 
          Bar J---K---L---M 

Và đây là những gì chúng tôi muốn có ...

Master ---A---B---C 
        |\ 
      Foo | E---F---F---H 
        | 
      Bar J---K---L---M 

Một cách tôi nghĩ sẽ tạo FooV2 và BarV2 ngành, và cherry- chọn các cam kết cá nhân vào các nhánh V2 thích hợp. Nhưng tôi tò mò, có cách nào tốt hơn để xử lý tình huống này không?

Trả lời

12

Có vẻ với tôi như bạn có thể:

git checkout J 
git rebase master 

Edit:

tôi đã cố gắng những gì tôi đề nghị và nó không hoạt động. gợi ý của knittl không hoạt động (trên hộp của tôi). Dưới đây là những gì đã làm việc cho tôi:

git rebase --onto master foo bar 
+2

Cảm ơn rất nhiều; phiên bản đã chỉnh sửa hoạt động rất tốt! Trong trường hợp bất kỳ ai cần thêm một số chi tiết về vấn đề này, có phần "Các bản cập nhật thú vị hơn" của sách Pro Git bao gồm hầu hết ví dụ chính xác này: http://git-scm.com/book/en/Git-Branching- Rebasing –

+1

'git rebase --onto master foo bar' có nghĩa là: Lấy" bar "mà không" foo "và đặt nó vào master – schoetbi

6

Bạn có thể rebase nhánh Bar của bạn lên thạc sĩ:

git rebase --onto C H M 

Nếu một số bản vá lỗi xung đột, bạn phải giải quyết chúng bằng tay (nhưng bạn cũng phải làm điều đó khi anh đào chọn). Lời cảnh cáo: không rebase khi lịch sử đã được xuất bản rồi.

57

Để có câu trả lời chung hơn, chúng tôi sẽ cần một ví dụ lớn hơn. Vì vậy, chúng ta hãy giả vờ bạn đang thực sự trong tình huống này:

---A---B---C <= Master 
      \ 
      E---F---F---H <= Foo 
          \ 
          J---K---L---M <= Bar 
             \ 
             N---O---P---Q <= Baz 

Và đây là những gì chúng tôi muốn có ...

---A---B---C <= Master 
      |\ 
      | E---F---F---H <= Foo 
      |\ 
      | J---K---L---M <= Bar 
      \ 
      N---O---P---Q <= Baz 

Rất may, Git có một giải pháp đối với chúng tôi trong các tùy chọn cho rebase lệnh!

git rebase --onto [newParent] [oldParent] [branchToMove] 

gì phương tiện này có thể được chia nhỏ thành các phần:

  1. rebase - Thay đổi bố mẹ của một cái gì đó
  2. --onto - Đây là lá cờ mà nói với git để sử dụng cú pháp rebase thay thế này
  3. newParent - Đây là chi nhánh mà chi nhánh bạn đang rebasing sẽ có như là phụ huynh
  4. oldParent - Đây là chi nhánh mà các chi nhánh bạn đang rebasing có vì nó là cha mẹ
  5. branchToMove - Đây là chi nhánh mà bạn đang di chuyển (rebasing)

Các chút thông tin về "chi nhánh phụ huynh cũ" có thể có một chút khó hiểu, nhưng những gì nó thực sự làm là nó nói "bỏ qua những thay đổi từ cha mẹ già của tôi khi làm việc rebase". oldParent là cách bạn xác định nhánh bạn đang di chuyển (ví dụ: branchToMove) bắt đầu.

Vì vậy, các lệnh để thực thi trong tình huống của chúng ta là gì?

git rebase --onto Master Bar Baz 
git rebase --onto Master Foo Bar 

Lưu ý rằng thứ tự của các lệnh này quan trọng bởi vì chúng ta cần phải kéo mỗi nhánh của cuối của "chuỗi chi nhánh".

+3

Đưa tất cả các phép thuật ra khỏi nó, theo nghĩa tốt nhất có thể. Chỉ cần sử dụng nó để un-fubar (baz) một chi nhánh tính năng mà tôi đã thực hiện một số công việc trên Foo, sau đó một số cam kết đối với Bar, sau đó một số Foo hơn, nhưng tất cả trên cùng một dòng cam kết. #fail –

+1

Câu trả lời hay. –

+0

@cdeszaq Tôi đã cố gắng chỉnh sửa nhưng không chắc chắn điều gì đã xảy ra, trong sơ đồ đầu tiên có hai nhánh "Bar" khi nhánh đầu tiên là "Foo" để khớp với phần còn lại của câu trả lời và câu hỏi gốc. – ryanwils

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