Bạn sẽ có thể buộc sửa đổi cục bộ của mình vào repo từ xa bằng cách sử dụng
git push -f <remote> <branch>
(ví dụ git push -f origin master
). Rời đi <remote>
và <branch>
sẽ buộc đẩy tất cả các chi nhánh địa phương đã thiết lập --set-upstream
.
Chỉ cần cảnh báo, nếu những người khác đang chia sẻ kho lưu trữ này, lịch sử sửa đổi của họ sẽ xung đột với kho mới. Và nếu họ có bất kỳ cam kết địa phương nào sau thời điểm thay đổi, họ sẽ trở nên không hợp lệ.
Cập nhật : Nghĩ rằng tôi sẽ thêm một ghi chú bên. Nếu bạn đang tạo các thay đổi mà người khác sẽ xem xét, thì sẽ không có gì lạ khi tạo một nhánh với những thay đổi đó và khởi động lại định kỳ để giữ cho chúng cập nhật với nhánh phát triển chính. Chỉ cần cho các nhà phát triển khác biết điều này sẽ xảy ra theo định kỳ để họ sẽ biết những gì sẽ xảy ra.
Cập nhật 2 : Vì số lượng người xem ngày càng tăng, tôi muốn thêm một số thông tin bổ sung về những việc cần làm khi bạn upstream
gặp phải một lực đẩy.
Giả sử tôi đã nhân bản repo của bạn và đã thêm một vài cam kết như vậy:
D ---- chủ đề
/
A ---- B ---- C phát triển
Nhưng sau đó development
chi nhánh bị tấn công bằng a rebase
, điều này sẽ khiến tôi nhận được một lỗi như vậy khi tôi chạy git pull
:
Giải nén các đối tượng: 100% (3/3), xong.
Từ <repo-location>
* phát triển chi nhánh -> FETCH_HEAD
Tự động hợp nhất <files>
CONFLICT (nội dung): Hợp nhất xung đột ở <vị trí>
Tự động hợp nhất thất bại; khắc phục xung đột và sau đó cam kết kết quả.
Ở đây tôi có thể khắc phục các xung đột và commit
, nhưng điều đó sẽ để lại cho tôi một lịch sử cam kết thực sự xấu xí:
C ---- D ---- E ---- Chủ đề F
/ /
A ---- B -------------- C 'phát triển
Nó có thể trông hấp dẫn khi sử dụng git pull --force
nhưng hãy cẩn thận vì điều đó sẽ khiến bạn bị mắc kẹt:
D ---- chủ đề
A ---- B ---- C 'phát triển
Vì vậy, có lẽ lựa chọn tốt nhất là làm a git pull --rebase
. Điều này sẽ yêu cầu tôi giải quyết mọi xung đột như trước đây, nhưng với mỗi bước thay vì cam kết tôi sẽ sử dụng git rebase --continue
. Cuối cùng, lịch sử cam kết sẽ tốt hơn nhiều:
Chủ đề D '--- E'
/
A ---- B ---- C 'phát triển
Cập nhật 3: Bạn cũng có thể sử dụng --force-with-lease
tùy chọn này như một lực đẩy "an toàn hơn", như được đề cập bởi Cupcake trong câu trả lời của anh ấy :
Đẩy lực bằng "cho thuê" cho phép lực đẩy không thành công nếu có các cam kết mới trên điều khiển từ xa mà bạn không mong đợi (về mặt kỹ thuật, nếu bạn chưa đưa chúng vào nhánh theo dõi từ xa của bạn), rất hữu ích nếu bạn không muốn vô tình ghi đè lên các cam kết của người khác mà bạn thậm chí chưa biết và bạn chỉ muốn ghi đè lên chính mình:
git push <remote> <branch> --force-with-lease
Bạn có thể tìm hiểu thêm chi tiết về cách sử dụng --force-with-lease
bằng cách đọc bất kỳ nội dung nào sau đây:
git push origin --force
làm việc cho bạn?