Ghi đè chi nhánh địa phương của tôi với chi nhánh từ xa


153

Tôi đã hoàn toàn khai thác chi nhánh địa phương của mình và muốn bắt đầu lại. Phiên bản trên máy chủ là chính xác.

Tôi không muốn bắt đầu lại, tôi muốn sử dụng lịch sử địa phương của mình để sửa lỗi lớn. (Tôi có thể nếu tôi phải.)

git fetch branchnamegit pull branchnamekhông làm việc Thông báo tôi nhận được là " cập nhật " tuy nhiên, phiên bản địa phương của tôi không khớp với máy chủ.

git pull origin/branchnamecho tôi một lỗi " không tìm thấy ".


Câu trả lời:


248

trước tiên, hãy tạo một nhánh mới ở vị trí hiện tại (trong trường hợp bạn cần lịch sử 'sai lầm' cũ):

git branch fubar-pin

cập nhật danh sách các chi nhánh từ xa và đồng bộ hóa các cam kết mới:

git fetch --all

sau đó, đặt lại nhánh của bạn đến điểm mà điểm gốc / nhánh tới:

git reset --hard origin/branch

hãy cẩn thận , điều này sẽ loại bỏ bất kỳ thay đổi từ cây làm việc của bạn !


2
+1 nhưng bạn có thể muốn thêm lời nhắc cần thực hiện git fetch origintrước khi đặt lại
Đánh dấu Longair

Tôi đã làm điều này với một thay đổi nhỏ và nó không hoạt động: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (một số nội dung khác), git reset - gốc / nhánh. Kết quả cuối cùng là tôi vẫn ở cam kết cũ. Vì vậy, phương pháp này có thể hoạt động trong một số trường hợp, nhưng tôi nghĩ nó không hiệu quả.
chào đón

@greggles: Có lỗi gì không? Sau lệnh cuối cùng, HEAD phải trỏ đến điểm gốc / nhánh.
knittl

1
@Gavin: không, điều này trong mọi trường hợp sẽ không ảnh hưởng đến các chi nhánh khác origin/branch. Không bao giờ.
knittl

1
@greggles Tôi biết điều này là rất muộn nhưng đối với những người khác tự hỏi tại sao điều đó có thể xảy ra, phương pháp này sẽ chỉ hoạt động nếu bạn có một chi nhánh được kiểm tra. Nó không hoạt động với bạn bởi vì bạn đang ở trạng thái ĐẦU tách rời , (các điểm CHÍNH ở một cam kết, không phải là một nhánh) và các lệnh này chỉ hoạt động nếu CHÍNH đang chỉ vào một nhánh. Khi bạn làm git resettrong khi CHÍNH đang chỉ vào một nhánh, nhánh đó sẽ theo sau.
Michael Dorst

60

Những gì tôi làm khi tôi làm hỏng chi nhánh địa phương của mình là tôi chỉ đổi tên chi nhánh bị hỏng của mình và kiểm tra / chi nhánh chi nhánh ngược dòng một lần nữa:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Sau đó, nếu bạn chắc chắn rằng bạn không muốn bất cứ thứ gì từ chi nhánh cũ của bạn, hãy xóa nó:

git branch -D branch-old

Nhưng thường thì tôi rời khỏi chi nhánh cũ quanh địa phương, chỉ trong trường hợp tôi có thứ gì đó ở đó.


4
Đây dường như là câu trả lời tốt nhất. Nó giúp tạo một bản sao dự phòng chỉ trong trường hợp và dường như rất có thể dẫn đến chi nhánh địa phương là một bản sao chính xác của điều khiển từ xa.
chào đón

Câu trả lời tuyệt vời, hữu ích cho tôi. Một Q: Tài liệu kiểm tra git chính thức dường như nói rằng lệnh thứ 3 của bạn phải là: Bạn git checkout -b <branch> --track <remote>/<branch>có làm việc tốt như nhau không, không có --track?
Starman

1
Tôi nghĩ rằng cấu hình var branch.autoSetupMerge(mà tôi nghĩ mặc định là true) làm cho --trackẩn. Và, vâng, trong tất cả các thiết lập git của tôi, tôi không cần phải rõ ràng --trackkhi thực hiện checkout -b, nhưng YMMV.
Casey Marshall

5

Chi nhánh địa phương của bạn có thể có sửa đổi mà bạn muốn loại bỏ. Để làm điều này, bạn sẽ cần sử dụng git resetđể đặt lại đầu chi nhánh đến vị trí cuối cùng mà bạn đã chuyển hướng từ chi nhánh của thượng nguồn. Sử dụng git branch -vđể tìm id sha1 của nhánh ngược dòng và đặt lại nhánh của nó bằng nhánh đó git reset SHA1ID. Sau đó, bạn sẽ có thể làm một git checkoutđể loại bỏ những thay đổi nó còn lại trong thư mục của bạn.

Lưu ý: luôn luôn làm điều này trên một repo sao lưu. Bằng cách đó bạn có thể đảm bảo rằng bạn tự làm việc đúng. Hoặc nếu không, bạn có một bản sao lưu để hoàn nguyên.


Cảm giác này có thể sẽ hiệu quả, nhưng với sự đơn giản và đáng tin cậy của phương pháp "tạo một bản sao công việc của bạn ở một nơi khác, tạo một bản sao mới của chi nhánh từ xa" Tôi không thấy cách này tốt hơn.
chào đón

2
git reset --hard

Điều này là để hoàn nguyên tất cả các thay đổi cục bộ của bạn về đầu nguồn gốc

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.