Git push không thành công, "Các bản cập nhật không chuyển tiếp nhanh đã bị từ chối"


99

Tôi đã chỉnh sửa kho lưu trữ GIT của mình qua Git Online. Sau khi cố gắng đẩy các thay đổi mã cục bộ của mình, tôi gặp lỗi:

Git push failed, To prevent from losing history, non-fast forward updates were rejected.

Làm thế nào tôi có thể sửa lỗi này?


Câu trả lời:


137

Kéo các thay đổi trước:

git pull origin branch_name

1
Nếu điều đó không giải quyết được vấn đề của bạn, hãy đảm bảo rằng bạn đang đẩy đến cùng một nhánh với nhánh mà bạn hiện đang làm việc. Kiểm tra xem bạn đang ở chi nhánh nào với "trạng thái git".
afilina

1
Lệnh này làm việc với tôi, tuy nhiên tôi muốn biết, tại sao điều này không git pull:? Điều khiển từ xa bằng origin, vì vậy nó thực sự chạy: git pull origin. Nó không nên cập nhật tất cả các chi nhánh?
Karlen Kishmiryan

83

Thêm --force vào dòng lệnh của bạn nếu bạn chắc chắn muốn đẩy. Ví dụ: sử dụng git push origin --force(Tôi khuyên bạn nên sử dụng dòng lệnh vì bạn sẽ tìm thấy nhiều hỗ trợ hơn từ những người dùng khác với dòng lệnh. Ngoài ra, điều này có thể không thực hiện được với SmartGit.) Xem trang web này để biết thêm thông tin: http://help.github.com/ điều khiển từ xa /


8
- lực lượng sẽ giải quyết vấn đề của bạn nhưng có khả năng gây hại cho người khác. Nó nên được sử dụng chỉ với nhiều dịch vụ chăm sóc (và kiến thức)
schoetbi

7
-1 bởi vì ép buộc nói chung là một ý tưởng khủng khiếp.
joshin4colours

6
+1 vì 5 người đã đồng ý với @ joshin4colours để cho -1. Nhưng mặc dù lực đẩy không phải lúc nào cũng là ý tưởng tốt nhất (mà git nói khá rõ ràng bằng cách từ chối động thái của bạn), nếu 100% thời gian đó là một ý tưởng tồi, thì tùy chọn này sẽ không tồn tại. Đề xuất của Matt ở đây chắc chắn có thể hữu ích cho những người khác.
user1271772

2
Hãy thoải mái sử dụng --forcenếu bạn là người duy nhất sử dụng nhánh đó. Tuy nhiên, nó gây ra sự cố khi chia sẻ một nhánh với các nhà phát triển khác.
Robert Brisita

22

Trước khi đẩy, hãy thực hiện kéo git với tùy chọn rebase. Thao tác này sẽ nhận những thay đổi mà bạn đã thực hiện trực tuyến (tại nguồn gốc của bạn) và áp dụng chúng cục bộ, sau đó thêm các thay đổi cục bộ của bạn lên trên nó.

git pull --rebase

Bây giờ, bạn có thể đẩy sang điều khiển từ xa

git push 

Để biết thêm thông tin, hãy xem Git rebase được giải thíchChương 3.6 Phân nhánh Git - Rebasing .


2
Trong trường hợp của tôi git pull --rebasekết thúc vớiThere is no tracking information for the current branch. Please specify which branch you want to rebase against.
trejder

17

Tôi gặp phải lỗi tương tự, chỉ cần thêm "--force" vào lệnh, nó hoạt động

git push origin master --force

6
có hậu quả cho điều này không?
jayunit100

8
làm mất cam kết của người khác.
Giovanni Toraldo

1
Tôi đã gặp phải một tình huống kỳ quặc mà đây chính xác là những gì tôi muốn làm ... thổi bay nội dung của một nhánh điều khiển từ xa vừa được tạo ra bằng một thứ gì đó mới. Điều này đã giải quyết vấn đề của tôi. Mặc dù nó không phải là giải pháp cho tất cả mọi người, nhưng --forcecó thể hữu ích.
Brad

1
Tôi không nghĩ câu trả lời này đáng bị bỏ phiếu xuống 6 lần. Đây là một giải pháp hợp lệ cho vấn đề được cung cấp, tuy nhiên, tác giả có thể mô tả nhiều hơn một chút về các trường hợp mà lệnh này sẽ hữu ích. Nếu nó đáng được đề cập vì nó đáng được viết (chức năng cho --force)
Aiden Strydom

5

Tôi đã có cùng một vấn đề.
Lý do là, chi nhánh địa phương của tôi bằng cách nào đó đã mất theo dõi đối tác từ xa.

Sau

git branch branch_name --set-upstream-to=origin/branch_name
git pull

và giải quyết các xung đột hợp nhất, tôi đã có thể thúc đẩy.


Có vẻ như bạn đã bỏ lỡ những thay đổi trong chi nhánh từ xa
ozma

5

Bạn có thể thêm --force-with-cho thuê vào lệnh, nó sẽ hoạt động.

git push --force-with-lease

--force có tính hủy diệt vì nó ghi đè vô điều kiện kho lưu trữ từ xa bằng bất cứ thứ gì bạn có cục bộ. Nhưng --force-with-cho thuê đảm bảo bạn không ghi đè công việc của người khác.

Xem thêm thông tin tại đây .


1

(Một) Giải pháp cho Netbeans 7.1: Thử kéo. Điều này cũng có thể sẽ thất bại. Bây giờ hãy xem nhật ký (chúng thường được hiển thị ngay bây giờ trong IDE). Có một / nhiều dòng nói:

"Kéo không thành công do tệp này:"

Tìm kiếm tệp đó, xóa nó (tạo một bản sao lưu trước đó). Thông thường đó là tệp .gitignore, vì vậy bạn sẽ không xóa mã. Thực hiện lại động tác đẩy. Mọi thứ sẽ hoạt động tốt bây giờ.


1

Sử dụng --rebasetùy chọn đã làm việc cho tôi.

  • git pull <remote> <branch> --rebase

Sau đó đẩy đến repo.

  • git push <remote> <branch>

Ví dụ

git pull origin master --rebase

git push origin master


0

Tôi đã gặp vấn đề tương tự. Tôi đã giải quyết với

git checkout <name branch>
git pull origin <name branch>
git push origin <name branch>

3
OP nói về việc đẩy các thay đổi mã cục bộ. checkoutsẽ ghi đè những thay đổi này hoặc ít nhất là sẽ không đưa chúng vào quảng cáo.
trejder

0

Đây là những gì làm việc cho tôi. Nó có thể được tìm thấy trong tài liệu git ở đây

Nếu bạn đang ở chi nhánh mong muốn, bạn có thể thực hiện điều này:

git fetch origin
# Fetches updates made to an online repository
git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

0

Gặp phải vấn đề tương tự, để giải quyết nó, hãy chạy các gitlệnh sau .

  • git pull {url} --rebase
  • git push --set-upstream {url} master

Trước tiên, bạn phải tạo kho lưu trữ trên github.


0

Đôi khi, trong khi thực hiện thao tác kéo từ git của bạn, HEAD bị tách ra. Bạn có thể kiểm tra điều này bằng cách nhập lệnh:

git branch 
  • (HEAD tách khỏi 8790704)

    bậc thầy

    phát triển, xây dựng

Tốt hơn là bạn nên chuyển đến chi nhánh của mình và thực hiện một bước mới từ chi nhánh tương ứng của bạn.

git checkout develop

git pull origin develop

git push origin develop
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.