2011-11-30 52 views
5

Tôi đã đọc một số giải thích cho một cú đánh git bị hỏng, nhưng không ai trong số họ có vẻ bao gồm trường hợp này.lỗi git push không có xung đột

Tôi không thể đẩy các thay đổi cục bộ của mình vào một kho lưu trữ từ xa, ngay cả sau khi kéo và không có xung đột.

$ git pull 
Already up-to-date 

$ git st 
# On branch unstable 
nothing to commit (working directory clean) 

$ git push 
To ssh://<url> 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'ssh://<url>' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

<url> là, tất nhiên, URL thực của kho lưu trữ của tôi.

Không có thay đổi nào để kéo, không có xung đột và tôi không chắc chắn điều gì khác có thể khiến điều này không thành công.

Tôi tin rằng tôi đã bị tất cả mọi thứ được thiết lập đúng:

$ git remote -v 
origin ssh://<url> (fetch) 
origin ssh://<url> (push) 

$ git branch -v 
    master 175a09d [behind 18] openReview must now be called from thread other than main. 
* unstable c9e5cab Progress on attachments. 

Trong quá khứ, tôi đã chỉ cần xóa kho địa phương của tôi. Tuy nhiên, điều này đang xảy ra thường xuyên hơn.

  1. Điều gì gây ra điều này xảy ra?
  2. Làm cách nào để tránh điều này trong tương lai?
  3. Tôi phải sửa lỗi này như thế nào?

Trả lời

4

Tiết lộ đầy đủ - git của tôi hơi bị gỉ nên có thể không đúng 100%.

Dường như nhánh 'tổng thể' cục bộ của bạn nằm phía sau nhánh chính 'gốc'. Khi bạn chạy 'git push', nó sẽ cố gắng cập nhật tất cả các nhánh từ xa với các nhánh cục bộ tương ứng của bạn. Để chỉ đẩy chi nhánh hiện tại của bạn, hãy thử git push origin unstable. Ngoài ra, nếu bạn muốn chi nhánh chính tại địa phương của mình nhận được cập nhật, hãy thanh toán chi nhánh chính và chạy git pull.

+0

Câu trả lời này là chính xác. Xem thêm: http://stackoverflow.com/a/8301464/156060 –

+0

Bạn nói đúng. Vấn đề là nhánh chính, mà tôi không nhận ra mình phải kéo đầu tiên. Ngoài ra, điều này có nghĩa là 'git pull --all' là đối tác thực sự của' git push'? –

1

Git về cơ bản phàn nàn rằng lịch sử cục bộ của bạn khác với lịch sử từ xa. Điều này có thể xảy ra nếu bạn khởi động lại chi nhánh của mình hoặc thường làm bất kỳ điều gì sửa đổi các bản chỉnh sửa đã cam kết sau bạn đã đẩy chúng.

Để khắc phục nó, chỉ cần làm

git push -f #Warning, this will essentially clobber revisions on origin with your local revisions. 

Các bit quan trọng là "Cập nhật phi nhanh về phía trước đã bị từ chối." Thông thường, Git chỉ có thể sao chép các bản sửa đổi của bạn sang kho lưu trữ từ xa và chạm HEAD lên bản sửa đổi gần đây nhất. Tuy nhiên, nếu lịch sử của bạn là khác nhau (bạn đã chỉnh sửa một bản sửa đổi ở địa phương của bạn sau khi bạn đã đẩy nó vào điều khiển từ xa) nó không thể nhanh chóng chuyển tiếp.

+0

'push - force' phải là phương sách cuối cùng. Xem câu trả lời của @ DanR để thay thế. –

+0

+1 cho --force là phương sách cuối cùng. Có rất ít trường hợp bạn sẽ sử dụng --force. --force có ảnh hưởng nghiêm trọng đến những người dùng còn lại của bạn. –

0

Tôi gặp sự cố tương tự trong những ngày này, bạn đang cố thực hiện cập nhật 'không nhanh về phía trước'. Như bạn có thể đọc trong trợ giúp gõ git push --help và đọc 'lưu ý về chuyển tiếp nhanh', bạn bắt đầu cục bộ một lịch sử khác với lịch sử trong repo của bạn. Nếu bạn chắc chắn rằng chi nhánh địa phương của bạn được cập nhật, bạn có thể ép buộc sử dụng git push --force để ghi đè repo từ xa của bạn với địa phương của bạn.

+0

'push - force' phải là phương sách cuối cùng.Xem câu trả lời của @ DanR để thay thế. –

Các vấn đề liên quan