2012-03-23 13 views
54

Tôi biết mọi người đã hỏi những câu hỏi tương tự, nhưng tôi tin rằng nguyên nhân của vấn đề của họ là khác nhau. Tôi đã làm một hard reset bởi vì tôi đã sai lầm mã của tôi khá xấugit push bị từ chối: lỗi: không thể đẩy một số refs

git reset --hard 41651df8fc9 

Tôi đã thực hiện một số thay đổi khá, tôi đã thực hiện một số cam kết và bây giờ mà tôi đang cố gắng để đẩy tất cả những cam kết vào máy chủ Tôi nhận được lỗi sau:

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '[email protected]' 

Git gợi ý thực hiện một thao tác kéo và đó là những gì người khác đã đề xuất cho người dùng khác. Tuy nhiên, tôi tin rằng một git kéo sẽ hợp nhất mã hiện tại của tôi với mã mà tôi không muốn nữa (sửa đổi đầu). Làm cách nào để đẩy và quên phiên bản/bản sửa đổi trước tôi?

Trả lời

90

git push -f nếu bạn được phép, nhưng điều đó sẽ làm hỏng bất kỳ ai khác rút khỏi repo đó, vì vậy hãy cẩn thận.

Nếu mà bị từ chối, và bạn có quyền truy cập vào máy chủ, như canzar nói dưới đây, bạn có thể cho phép điều này trên máy chủ với

git config receive.denyNonFastForwards false 
+0

Tôi đoán tôi không có quyền 'từ xa : error: từ chối các ref/head/master không nhanh về phía trước (bạn nên kéo đầu tiên) 'Tôi là người duy nhất làm việc trên repo này vào lúc này, vì vậy tôi không lo lắng về bất kỳ chi nhánh nào khác. Bất kỳ ý tưởng? – Eric

+0

Nếu bạn là người duy nhất sở hữu repo này, chỉ cần sử dụng 'git push -f', mà sẽ sử dụng repo hiện tại của bạn thay thế từ xa. Nếu có nhiều người dùng phát triển, thì tiến nhanh là điều cần thiết, nếu không, sẽ rất dễ xảy ra sự phân biệt. – Tim

+1

Nếu bạn có thể đăng nhập trên điều khiển từ xa, bạn có thể đi thẳng vào kho trống git và tự tua lại nhánh, với 'git branch -f', ví dụ:' git branch -f rewind_the_one_I_broke 8120307' chẳng hạn. Bạn có thể chạy 'git log' trong một repo trống để tìm điểm đặt lại. Lưu ý rằng điều này có tác dụng tương tự như 'git push -f' nhưng bỏ qua móc. – torek

23

Nếu bạn là người duy nhất làm việc trên dự án, những gì bạn có thể làm là:

git checkout master 
git push origin +HEAD 

này sẽ thiết lập đỉnh của nguồn gốc/master với cùng cam kết như là bậc thầy (và do đó xóa các cam kết giữa 41651df và nguồn gốc/master)

+0

điều này sẽ loại bỏ mã mà tôi không muốn nữa và giữ mã mới của tôi? (xin lỗi nếu đó là một câu trả lời ngớ ngẩn) – Eric

+2

điều này sẽ đặt đầu nguồn gốc/chính thành cùng một cam kết làm chủ (và xóa các cam kết giữa 41651df và nguồn gốc/chủ) – ouah

+0

Cập nhật nhánh gốc của kho gốc với HEAD hiện tại của bạn nhánh, cho phép cập nhật không nhanh chóng. Vì vậy, điều này giống với 'git push HEAD -f'. Đối với tôi, tôi nghĩ, bạn có thể sử dụng một cách nhẹ nhàng hơn để làm điều này, đầu tiên, sử dụng 'git fetch', sau đó, sử dụng' git rebase -i origin/master', điều này sẽ cho phép bạn chọn các cam kết. – Tim

4

'remote: error: denying non-fast-forward refs/heads/master (you should pull first)'

Thông báo đó gợi ý rằng có móc trên máy chủ đang từ chối các lần đẩy nhanh về phía trước. Có, nó thường không được khuyến khích và là một người bảo vệ tốt, nhưng vì bạn là người duy nhất sử dụng nó và bạn muốn đẩy mạnh, hãy liên hệ với quản trị viên của repo để cho phép đẩy nhanh không tạm thời bằng cách xóa tạm thời móc hoặc cho phép bạn trong móc để làm như vậy.

+1

Hoặc, có quản trị viên chạy 'git branch -f', có tác dụng tương tự nhưng không yêu cầu phiền phức về móc trước khi nhận. – torek

10

Chỉ cần làm

git pull origin [branch] 

và sau đó bạn sẽ có thể để đẩy.

Nếu bạn có cam kết trên của riêng bạn và không đẩy nó trở thành chi nhánh chưa, hãy thử

git pull --rebase origin [branch] 

và sau đó bạn sẽ có thể để đẩy.

0

Tôi đã làm gì để giải quyết vấn đề là:

git pull origin [branch] 
git push origin [branch] 

Ngoài ra hãy chắc chắn rằng bạn đang trỏ đến chi nhánh ngay bằng cách chạy:

git remote set-url origin [url]