2010-05-27 18 views
39

Tiêu đề không rõ ràng. Những gì tôi thực sự cần phải làm thường xuyên như sau:Làm thế nào để di chuyển nhánh ngược lại trong git?

Hãy nói rằng tôi có một sự phát triển đang diễn ra với một số cam kết c1, c2, ... và 3 chi nhánh A, B, C

c1--c2--c3--(B)--c4--(A,C) 

Chi nhánh Một và C có cùng cam kết.

Bây giờ tôi muốn chi nhánh A quay trở lại đó B là, để nó loks như thế này:

c1--c2--c3--(A,B)--c4--(C) 

Quan trọng là điều này có thể xảy ra tại địa phương và trên github.

Trả lời

58

Sử dụng subcommand reset:

git checkout A 
git reset --hard B 
git push --force github 

Là một sidenote, bạn nên cẩn thận khi sử dụng git reset trong khi một chi nhánh đã được đẩy ở nơi khác rồi. Điều này có thể gây rắc rối cho những người đã kiểm tra các thay đổi của bạn.

+3

Nếu có bất kỳ cam kết trên nhánh A, họ sẽ bị mất bởi 'git reset --hard b'. Nếu có cam kết trên nhánh A, thì bạn nên sử dụng 'git rebase' để định vị nhánh. –

+0

Có thể gây ra sự cố nào? –

+0

Bạn có thể vứt đầu nhánh mà bạn đã đẩy tới máy chủ và bị người khác kéo trong thời gian chờ đợi. Máy chủ không thể xây dựng trên đầu của đầu bị loại bỏ này (vì vậy việc đẩy cần phải được buộc). Và tương tự như vậy, các nhà phát triển đồng đẳng cũng cần phải buộc một lực kéo có thể không mong muốn. –

22

Nếu không có cam kết nào trên chi nhánh A, thì git reset --hard Bsolution given by Bram Schoenmakers sẽ hoạt động.

Tuy nhiên nếu có cam kết là chi nhánh A phải bảo quản, thì sau đây nên làm như lừa:

  1. Tạo một bản sao lưu của repo của bạn (chỉ trong trường hợp)
  2. git checkout A
  3. git rebase -i --onto B SHA1-A^

... trong đó SHA1-A^ là id cam kết của phụ huynh của chi nhánh A

Xem chi tiết git rebase man page để biết chi tiết.

LƯU Ý: Thao tác này sẽ ghi lại lịch sử (khi luôn luôn rebase). Cần cân nhắc đặc biệt nếu chi nhánh A của bạn đã từng được đẩy tới repo công khai.

1

Xóa chi nhánh cả cục bộ lẫn từ xa, tạo lại nhánh, đẩy chi nhánh trở lại máy chủ.

git branch -d A 
git push origin :heads/A 
git branch B A 
git push origin A:A 

Hoặc bạn có thể sử dụng lệnh sau để hoàn tác lần commit cuối cùng.

git revert c4 

nào sẽ làm cho thời gian của bạn trông giống như:

c1--c2--c3--(B) 
      \ 
       c4--(C) 
       \ 
       (^c4)--(A) 

nơi (^c4) là một cam kết rằng Undoes c4

tôi không khuyên bạn sử dụng rebase hoặc revert trên một chi nhánh đã được đẩy với một repo từ xa, chúng có thể gây rắc rối cho bạn hoặc bất kỳ ai khác sử dụng repo đó.

+0

Xóa và tái tạo các chi nhánh từ xa cũng sẽ gây ra tấn rắc rối cho bất cứ ai sử dụng repo, mặc dù. (Như tôi đã học được từ kinh nghiệm đau đớn.) – ebneter

+0

Vấn đề là gì? Tôi làm điều này tất cả các thời gian và nó không bao giờ gây ra bất kỳ rắc rối, nhưng bây giờ tôi tự hỏi nếu tôi đã chỉ nhận được may mắn. – kubi

3

Tôi thường sử dụng chuỗi này và thấy nó cách đơn giản nhất:

git checkout B 
git branch -f A B 
Các vấn đề liên quan