Git đẩy sang nhánh sai


97

Làm việc với git, sau một số 'commit' và một vài 'push', tôi nhận ra rằng mình đang sử dụng sai nhánh!

Bây giờ tôi phải xóa theo một cách nào đó các thay đổi của mình trong sai_branch và cam kết và đẩy các thay đổi trong right_branch

Cách tốt nhất (và đơn giản) để làm điều đó là gì?

cảm ơn bạn


có thể trùng lặp của Git: Xóa lựa chọn cam kết từ kho
halfdan

Câu hỏi hay @tokland: 99% các nhà phát triển ruby sử dụng git, và các dự án tôi đang làm việc là trong RoR ... nhưng tôi biết điều này không thể là một động lực tốt
Alessandro De Simone

3
Theo quan điểm của tôi, đây không phải là sự trùng lặp với những gì Halfdan đã nhận xét, vì nó cũng là về việc chuyển các commit sang một nhánh khác, không chỉ loại bỏ chúng.
olenz

Câu trả lời:


140

chuyển sang nhánh đó, kiểm tra git loggit revertcác cam kết đó riêng lẻ. Khi bạn đã hoàn thành việc đó, hãy chuyển trở lại nhánh mong muốn và ở đó bạn có thể sử dụng git cherry-pickđể chọn các cam kết cụ thể từ các refs git và hợp nhất nó vào nhánh bên phải.

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Nếu các cam kết được nhóm lại với nhau và không có cam kết nào được đẩy sau các cam kết bẩn của bạn, bạn thậm chí có thể sử dụng git resetđể chuyển nhánh sai đó về trạng thái ngay trước khi cam kết của bạn và sau đó tiếp tục sử dụng git cherry-pickđể đưa các cam kết của bạn vào nhánh phù hợp.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Revert + cherry-pick dường như đơn giản hơn nhiều so với các phương pháp khả thi khác liên quan đến việc đặt lại đầu và / hoặc khôi phục.
ChrisV

2
Đối với git cherry-pick, bạn có thể đặt nhiều shas trong một dòng, tức là git cherry-pick commitsha1 commitsha2.
ThomasW

Cứu sinh! Và không phức tạp. Cảm ơn bạn!
Craig Silver,

những gì xảy ra khi bạn muốn hợp nhất wrong_branch (ví dụ như phát triển) vào right_branch (ví dụ như tính năng / X) sau đó bạn sẽ có được trở lại trạng hoàn tác các thay đổi mà bạn cherry chọn trong.
timB33

3

Cách đơn giản nhất là sử dụng git rebase. Giả sử rằng bạn có cài đặt đó:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

Bạn muốn chuyển thay đổi C3, C4 sang nhánh bên phải.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

Bây giờ cài đặt là

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

Sau đó, bạn phải đẩy kết quả của mình bằng lực (NẾU chưa có ai đồng bộ hóa với repo từ xa của bạn):

git push -f remote:right_branch

Tôi chưa thử giải pháp này, tôi đã tìm ra câu trả lời đầu tiên (và nó đã hoạt động). Tôi đã không nghĩ đến tại rebase, nó trông giống như một lựa chọn tốt, cảm ơn bạn
Alessandro De Simone

1
Đúng hơn là git push -fsử dụng tốt hơn git push --force-with-lease. Ít nhất, nó đảm bảo rằng ref từ xa sẽ chỉ được cập nhật nếu không ai đẩy các cam kết khác lên trên cam kết của bạn.
Pierre-Olivier Vares

2

Một chút phím tắt bổ sung vào câu trả lời của Dhruva

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.