2011-01-13 24 views
116

Tôi đang sử dụng Git để quản lý hai máy tính và sự phát triển của mình. Tôi đang cố gắng để thay đổi GitHub và tôi nhận được lỗi."Git đẩy các bản cập nhật không nhanh về phía trước đã bị từ chối" nghĩa là gì?

Không thể đẩy một số thay đổi thành <repo>. Để ngăn bạn mất lịch sử, các bản cập nhật không nhanh về phía trước đã bị từ chối. Hợp nhất các thay đổi từ xa trước khi đẩy lại.

Điều gì có thể gây ra điều này và làm cách nào để khắc phục sự cố này?

EDIT:

kéo repo trả về như sau:

* Chi nhánh master-> thạc sĩ (phi nhanh về phía trước) Đã-up-to-date

Đẩy vẫn mang lại cho tôi lỗi nói trên.

+0

Xem thêm [Git phi nhanh về phía trước từ chối] (http: // stackoverflow. com/q/5667476/456814). –

Trả lời

108

GitHub có một phần đẹp gọi là "Dealing with “non-fast-forward” errors"

Lỗi này có thể là một chút áp đảo lúc đầu, đừng sợ. Đơn giản chỉ cần đặt, git không thể thực hiện thay đổi trên điều khiển từ xa mà không bị mất cam kết, do đó, từ chối đẩy.
Thông thường điều này là do một người dùng khác đang đẩy vào cùng một chi nhánh. Bạn có thể khắc phục điều này bằng cách tìm nạp và kết hợp nhánh từ xa hoặc sử dụng kéo để thực hiện cả hai cùng một lúc.

Trong các trường hợp khác, lỗi này là kết quả của các thay đổi phá hoại được thực hiện cục bộ bằng cách sử dụng các lệnh như git commit --amend hoặc git rebase.
Trong khi bạn có thể ghi đè điều khiển từ xa bằng cách thêm --force vào lệnh push, bạn chỉ nên làm như vậy nếu bạn hoàn toàn chắc chắn đây là những gì bạn muốn làm.
Lực đẩy có thể gây ra sự cố cho những người dùng khác đã tìm nhánh từ xa và được coi là thực hành không tốt. Khi nghi ngờ, đừng ép buộc.


Git không thể thực hiện thay đổi trên điều khiển từ xa giống như một merge nhanh về phía trước, mà một Visual Git Reference minh họa như:

alt text

Đây không phải là chính xác trường hợp của bạn, nhưng giúp xem "chuyển tiếp nhanh" là gì (trong đó HEAD của chi nhánh đơn giản được chuyển sang cam kết mới hơn).


Các "branch master->master (non-fast-forward) Already-up-to-date" thường là cho các chi nhánh địa phương mà không theo dõi truy cập phần xa của họ.
Xem ví dụ câu hỏi SO này "git pull says up-to-date but git push rejects non-fast forward".
Hoặc hai chi nhánh được kết nối, nhưng trong bất đồng với lịch sử của mình:
Xem "Never-ending GIT story - what am I doing wrong here?"

Điều này có nghĩa rằng chi nhánh lật đổ của bạn và chi nhánh chủ git từ xa của bạn không đồng ý về một cái gì đó.
Một số thay đổi đã được đẩy/cam kết với một thay đổi không thuộc loại kia.
Cháy lên gitk --all và sẽ cung cấp cho bạn manh mối về những gì đã xảy ra - tìm kiếm "dĩa" trong lịch sử.

42

Điều đó có nghĩa là đã có các cam kết khác được đẩy tới kho lưu trữ từ xa khác với các cam kết của bạn. Bạn thường có thể giải quyết điều này với một

git pull 

trước khi bạn đẩy

Cuối cùng, "nhanh về phía trước" có nghĩa là các cam kết có thể được áp dụng trực tiếp trên ngọn cây làm việc mà không đòi hỏi một hợp nhất.

+1

Đây là những gì làm việc cho tôi! Tôi quên tôi đã thay đổi readme.md trên trang web kho lưu trữ! – ryanwinchester

9

Bản cập nhật chuyển tiếp nhanh là nơi chỉ thay đổi một bên là sau lần commit gần đây nhất ở phía bên kia, do đó không cần phải hợp nhất. Điều này nói rằng bạn cần hợp nhất các thay đổi của mình trước khi bạn có thể đẩy.

0

bạn có thể muốn sử dụng vũ lực với hoạt động đẩy trong trường hợp này

git push nguồn gốc chủ --force

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