Git: Bỏ tất cả các thay đổi trên một nhánh cục bộ phân kỳ


117

Tôi có một nhánh chủ đề cục bộ đang theo dõi một nhánh từ xa. Vì lợi ích của đối số, giả sử lịch sử cam kết trông như thế này:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Sau khi xem xét lịch sử cam kết tương đối, bây giờ tôi muốn loại bỏ tất cả các thay đổi đối với phobosnhánh cục bộ và đưa nó trở lại thành bản sao trực tiếp origin/phobos, để lịch sử cục bộ trông giống như sau:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Tôi thực sự không muốn các thay đổi cục bộ đối với phobosnhánh và tôi thực sự không muốn bất kỳ hợp nhất nào hiển thị trong kho lưu trữ gốc sau đó. (Vì vậy, chỉ hợp nhất không phải là điều tôi nghĩ đến.)

Điều này có vẻ như nó sẽ thực sự dễ dàng, nhưng google-fu của tôi đã làm tôi thất bại. Làm thế nào để tôi làm điều này?

Câu trả lời:


79

Xóa chi nhánh, sau đó tạo lại nó:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos

37
Một vấn đề với cách tiếp cận này so với việc đặt lại phần đầu của nhánh, đó là việc xóa nhánh sẽ làm mất bản ghi lại của nhánh. Mặt khác, việc đặt lại nhánh không chỉ bảo tồn bản ghi lại mà còn thực sự ghi lại quá trình đặt lại trong bản ghi lại. Điều này giúp thao tác dễ dàng được đảo ngược sau này, nếu cần.
Dan Molding

9
@Electrons_Ahoy Đề nghị bạn thay đổi câu trả lời được chấp nhận ở đây thành câu trả lời của Dan (để những người như tôi, những người đã tìm hiểu cách làm trên Google có khả năng chọn phương pháp an toàn hơn).
Steve Chambers

4
Câu trả lời của @ DanMoulding không liên quan đến việc xóa một nhánh cục bộ khi không cần thiết. Nó an toàn hơn nhiều.
brma

@brma: Làm sao vậy? Nó vẫn chỉ trỏ một nhánh đến một cam kết mới.
mipadi

5
Câu trả lời của Dan Moulding là an toàn hơn. Tôi nghĩ bạn nên chọn cái đó.
Daniel Apt,

330
git checkout phobos
git reset --hard origin/phobos

Điều này yêu cầu Git đặt lại phần đầu của phoboscùng một cam kết origin/phobosvà cập nhật cây làm việc để phù hợp.


35
IMO đây phải là câu trả lời được chấp nhận; nó đưa ra lệnh "đặt lại" để cấy con trỏ nhánh, thay vì thực hiện phẫu thuật với việc loại bỏ / tạo lại.
vdboor

Trên thực tế, tôi đã thử cái này đầu tiên và nó đã ném ra rất nhiều lỗi do bản sao cục bộ gần như không sử dụng được. Xóa / tạo lại có thể kém thanh lịch hơn, nhưng tôi không phải hỏi bất kỳ câu hỏi tiếp theo nào.
Electron_Ahoy

3
@Electrons_Ahoy: Hmm, điều đó chắc chắn không bình thường. Thực hiện đặt lại này thông thường sẽ là một hoạt động không có sự cố nếu repo của bạn hoạt động tốt.
Dan Molding

hoặc ngay cả khi nó khó hiểu. Sử dụng git reflog để tìm đường về nhà nếu bạn "vô tình" đưa ra lệnh này mà không thực sự đọc nó làm gì. :)
dbn 19/12/12

Ngoài ra, điều này hoạt động nếu bạn đang ở trên chi nhánh và bạn đã làm rối nó cục bộ.
slott
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.