Làm cách nào để hợp nhất các thay đổi từ xa tại GitHub?


137

Tôi đang gặp lỗi sau, khi thử Github đầu tiên:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

Làm thế nào tôi có thể sửa lỗi này và hợp nhất các thay đổi từ xa?

Câu trả lời:


106

Xem phần 'chuyển tiếp không nhanh' của ' git đẩy - trợ giúp' để biết chi tiết.

Bạn có thể thực hiện "git pull", giải quyết các xung đột tiềm ẩn và "git đẩy" kết quả. Một "git pull" sẽ tạo ra một cam kết hợp nhất C giữa các lần xác nhận A và B.

Ngoài ra, bạn có thể khởi động lại thay đổi giữa X và B trên đầu A, với "git pull --rebase" và đẩy kết quả trở lại. Rebase sẽ tạo ra một cam kết D mới, xây dựng sự thay đổi giữa X và B trên đầu A.


16
Tôi tiếp tục chạy vào điều này ngoại trừ rằng nếu tôi thực hiện "git pull", tôi được thông báo "Đã cập nhật". và nếu tôi thực hiện "git pull --rebase", tôi sẽ nói rằng "Chủ chi nhánh hiện tại đã cập nhật." Có ý kiến ​​gì không? Cảm ơn!
jwl

3
@ larson4 Tôi cũng gặp vấn đề tương tự, nhưng sau khi bạn thực hiện git pull, hãy thực hiện một cam kết khác và sau đó nó sẽ tốt
Patrick

20
@Patrick @larson Tôi gặp vấn đề tương tự do thực tế là tôi đã không đọc thông báo lỗi một cách cẩn thận. Sự từ chối là ở một chi nhánh mà tôi đã không kiểm tra. Chi nhánh tôi thực sự đã thành công. Giải pháp là git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier

86

Bạn cũng có thể buộc đẩy bằng cách thêm biểu tượng + trước tên chi nhánh của bạn.

git push origin +some_branch

1
Cảm ơn bạn, cái này làm việc cho tôi. Các giải pháp khác sẽ xóa hoàn toàn ảnh hưởng của tôigit reset --hard
Oli

1
Cảm ơn! Tôi đã đẩy chi nhánh "A" lên ứng dụng dàn Heroku của mình để kiểm tra một số chức năng trong môi trường sản xuất. Sau đó (cục bộ) tôi đã hợp nhất "A" và "B" thành "master" và muốn đẩy "master" vào ứng dụng dàn dựng của mình. Đã có tất cả các loại vấn đề. Điều này làm cho việc đẩy "chủ" rất đơn giản. Cảm ơn!
Don Leatham

Làm việc cho tôi quá. Mất 4 giờ để tìm vấn đề. Cảm ơn rất nhiều. Tôi chạy Netbeans trên máy cục bộ (windows 7) và muốn mỗi lần đẩy trên cục bộ, hãy kiểm tra trên máy từ xa (linux).
Maxim Shoustin

Lưu ý rằng phương pháp này có thể không an toàn và nó có thể khiến một số cam kết chuyển hướng không thể truy cập được.
samuil

Đây phải là giải pháp được chấp nhận. Các giải pháp khác không hiệu quả với tôi
banarun

20

Bạn có thể có những thay đổi trên github mà bạn không bao giờ hợp nhất. Cố gắng git pulltìm nạp và hợp nhất các thay đổi, sau đó bạn sẽ có thể đẩy. Xin lỗi nếu tôi hiểu nhầm câu hỏi của bạn.


18
Trong trường hợp bạn cần từ chối các thay đổi trong bản gốc từ xa và tự đẩy các thay đổi của mình, hãy thử ấn bằng phím -f
Hotsyk

13

Nếu bạn "git pull" và thông báo "Đã cập nhật." Và vẫn gặp lỗi này, đó có thể là do một trong những chi nhánh khác của bạn không cập nhật. Hãy thử chuyển sang một chi nhánh khác và đảm bảo rằng một chi nhánh cũng được cập nhật trước khi thử "git đẩy" lại:

Chuyển sang nhánh "foo" và cập nhật nó:

$ git checkout foo
$ git pull

Bạn có thể thấy các nhánh bạn có bằng cách ban hành lệnh:

$ git branch

Bạn có thể giải thích tại sao điều này hoạt động và là cần thiết? (Nó đã giải quyết vấn đề của tôi.) Nó chỉ có vẻ phản trực giác đối với tôi. Tôi không hiểu tại sao git lại cần một chi nhánh khác để cập nhật cũng như để tôi thúc đẩy chi nhánh chính.
Quinxy von Besiex

@QuinxyvonBesiex Tôi không chắc là mình hiểu. Nó có thể có liên quan đến cấu trúc cơ bản của chính Git và cách nó tổ chức các nhánh (về cơ bản giống như các thẻ theo như tôi hiểu).
David Calhoun

7

Bạn có thể buộc nó đẩy, nhưng vui lòng CHỈ làm điều này khi bạn khá chắc chắn những gì bạn đang làm.

Lệnh là:

git push -f 

3

Vấn đề này cũng có thể xảy ra khi bạn có các thẻ xung đột. Nếu phiên bản địa phương và phiên bản từ xa của bạn sử dụng cùng tên thẻ cho các cam kết khác nhau, bạn có thể kết thúc tại đây.

Bạn có thể giải quyết nó bằng cách xóa thẻ cục bộ:

$ git tag --delete foo_tag

2

Khi tôi gặp lỗi này, tôi đã sao lưu toàn bộ thư mục dự án của mình. Sau đó, tôi đã làm một cái gì đó như

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... Tùy thuộc vào tên chi nhánh của bạn (nếu không phải là chủ).

Sau đó tôi đã làm git pull --rebase. Sau đó, tôi đã thay thế các tệp đã kéo bằng các tệp của dự án được sao lưu. Bây giờ tôi đã sẵn sàng để cam kết thay đổi của tôi một lần nữa và thúc đẩy.


0

1) Buộc kéo để ghi đè thay đổi cục bộ

Nếu bạn không quan tâm đến những thay đổi được thực hiện cục bộ và muốn lấy mã từ kho lưu trữ, bạn có thể buộc kéo. Điều này sẽ ghi đè lên tất cả các thay đổi cục bộ được thực hiện trên máy tính của bạn, một bản sao trùng lặp của phiên bản trong kho lưu trữ sẽ xuất hiện.

Thực hiện các lệnh sau trong IDE của bạn:

thiết lập lại git - khó

kéo git

Điều này sẽ ngay lập tức phá hủy tất cả các thay đổi cục bộ của bạn, vì vậy hãy chắc chắn rằng bạn biết những gì bạn đang làm và không cần những thay đổi cục bộ của bạn.

2) Giữ cả hai thay đổi (cục bộ và từ repo)

Nếu bạn muốn giữ cả hai thay đổi (thay đổi được thực hiện cục bộ và thay đổi có trong kho lưu trữ), bạn có thể thêm và cam kết thay đổi của mình. Khi bạn kéo, rõ ràng sẽ có xung đột hợp nhất. Tại đây, bạn có thể sử dụng các công cụ trong IDE của mình (chẳng hạn như Difftool và mergetool) để so sánh hai đoạn mã và xác định những thay đổi nào cần giữ và loại bỏ. Đây là cách giữa; không có thay đổi sẽ bị mất cho đến khi bạn loại bỏ chúng bằng tay.

git thêm $ the_file_under_error

cam kết

kéo git
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.