git: các bản cập nhật đã bị từ chối vì điều khiển từ xa chứa công việc mà bạn không có cục bộ


112

Tôi đang làm việc trong một nhóm với một số nhà phát triển sử dụng git trên BitBucket. Tất cả chúng tôi đang làm việc trên một devchi nhánh, không thúc đẩy cho masterđến khi phát hành.

Một trong những nhà phát triển đã cam kết không chính xác mã đã vô tình ghi đè mã của tôi và bây giờ tôi đang cố gắng đẩy mã đúng trở lại repo. Tôi đã đọc về lỗi này trong một vài ngày nay, tôi không thể đẩy vào repo được nữa vì tôi đang gặp lỗi sau:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Tôi làm theo hướng dẫn và pullnhưng sau đó tôi nhận được xung đột hợp nhất. Sau khi nhập thông báo cho xung đột hợp nhất, mã cục bộ của tôi bây giờ là mã không chính xác mà nhà phát triển khác đã vô tình tải lên (như mong đợi từ pull). Vì vậy, tôi thay thế mã không chính xác bằng bản sao lưu tôi đã sao chép trước khi giới thiệu và khi tôi cố gắng đẩy lại, tôi gặp lỗi tương tự.

Thật sự rất bực mình, mình rất muốn giúp đỡ đội của mình và đóng góp, nhưng không thể vì lỗi này. Có ai biết làm thế nào để giải quyết vấn đề này? Tôi sẽ đánh giá rất cao bất kỳ sự giúp đỡ nào.

Đây là những lệnh tôi chạy để cam kết, nếu nó giúp ích cho bất kỳ ai:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Tôi đã nghĩ rằng nếu tôi giữ thứ tự này, tôi sẽ không nhận được các xung đột hợp nhất. Tôi đoán tôi đã sai. Cảm ơn một lần nữa

Cập nhật: Tôi nên nói thêm rằng tôi đã tìm kiếm trong vài giờ trên Google và stackoverflow, và làm theo các hướng dẫn khác nhau, nhưng tôi vẫn không thể pushđến devchi nhánh.

Câu trả lời:


42

git pull <remote> master:devsẽ tìm nạp remote/masternhánh và hợp nhất nó vào local/devnhánh của bạn .

git pull <remote> devsẽ tìm nạp remote/devchi nhánh và hợp nhất nó vào chi nhánh hiện tại của bạn.

Tôi nghĩ rằng bạn đã nói rằng cam kết xung đột đang bật remote/dev, vì vậy đó có thể là nhánh mà bạn có thể định tìm nạp và hợp nhất.

Trong trường hợp đó, bạn đã không thực sự hợp nhất xung đột vào chi nhánh cục bộ của mình, điều này thật kỳ lạ vì bạn nói rằng bạn đã thấy mã không chính xác trong bản sao làm việc của mình. Bạn có thể muốn kiểm tra những gì đang xảy ra remote/master.


1
Wow ... Tôi chưa bao giờ biết điều đó. Nhưng nó có rất nhiều ý nghĩa bây giờ. Chi nhánh chính cũng không chính xác, vì vậy câu trả lời của bạn xóa toàn bộ câu hỏi của tôi. Tôi vẫn còn một chút mới với git. Cảm ơn rất nhiều vì đã cho tôi biết sự khác biệt giữa hai cái đó!
delos

6
Lựa chọn tốt nhất cho tôi là git pull --rebase.
derekmx271

151

Sử dụng lệnh này trong thiết bị đầu cuối

git push -f origin master


49
Dùng vũ lực đẩy (-f) cờ là rất nguy hiểm và nó không bao giờ nên là một phần của dòng chảy công việc thường xuyên của bạn
Spaideri

5
Đã phản đối vì tôi thiếu một số cảnh báo trong câu trả lời này.
Melebius

2
Ôi! Điều này buộc kho lưu trữ phải tự viết lại.
Azarsa

3
Tôi đã gặp lỗi tương tự với github và tôi đã sửa nó bằng lệnh này, @theeastcoastwest tại sao bạn lại nói điều này là nguy hiểm? lý do của bạn là gì "
simon

3
@simon điều này nguy hiểm vì nó bỏ qua công việc ở xa và nó buộc các thay đổi của bạn vào repo. Vì vậy, nếu bạn không muốn làm xáo trộn công việc của nhóm, ĐỪNG ép buộc.
Gásten

42

Nó xảy ra khi chúng tôi đang cố gắng đẩy đến kho lưu trữ từ xa nhưng đã tạo một tệp mới trên điều khiển từ xa mà vẫn chưa được kéo, giả sử Readme. Trong trường hợp đó như lỗi nói

git từ chối cập nhật

vì chúng tôi chưa cập nhật điều khiển từ xa trong môi trường cục bộ của chúng tôi. Vì vậy, hãy kéo từ xa trước

git pull

Nó sẽ cập nhật kho lưu trữ cục bộ của bạn và thêm một Readmetệp mới . Sau đó, đẩy các thay đổi đã cập nhật lên điều khiển từ xa

git push origin master

Tôi đã tham gia git pull origin developvào chi nhánh phát triển địa phương của mình, nhưng bây giờ, chỉ cần làm điều git pullđó là ổn đối với tôi, tôi không biết tại sao.
Alex

vì theo mặc định nếu chi nhánh địa phương của bạn được đồng bộ với chi nhánh ở xa và bạn đang kiểm tra ra ở chỗ chi nhánh bạn không cần phải xác định một chi nhánh chỉ git pulllà đủ
Himanshu

11

Điều này thường xảy ra khi repo chứa một số mục không có ở đó cục bộ. Vì vậy, để đẩy các thay đổi của chúng tôi, trong trường hợp này, chúng tôi cần tích hợp các thay đổi từ xa và sau đó đẩy.

Vì vậy, hãy tạo lực kéo từ điều khiển từ xa

git pull origin master

Sau đó, đẩy các thay đổi vào điều khiển từ xa đó

git push origin master

10

Lực đẩy

git push -f origin master


2
Điều này có lẽ nên đi kèm với một cảnh báo.
Chris

7

Tôi đã sửa nó, tôi không chắc chắn chính xác những gì tôi đã làm. Tôi đã thử chỉ cần đẩy và kéo bằng cách sử dụng:

git pull <remote> dev thay vì git pull <remote> master:dev

Hy vọng điều này sẽ giúp ích cho ai đó nếu họ đang gặp vấn đề tương tự.


6

Bạn cần nhập:

$ git pull
$ git fetch 
$ git merge

Nếu bạn sử dụng một git push origin master --force, bạn sẽ có một vấn đề lớn.


5
Tại sao bạn cần sử dụng git fetchvà sử dụng git mergelại theo cách thủ công sau khi chạy git pullchứa chúng ?
Melebius

6

Bạn có thể thử điều này: git pull origin master --rebase


2
Chào Eduardo! Điều này đã làm việc cho tôi. Nhưng bạn có thể giải thích tại sao nó hoạt động? Chính xác thì lệnh này làm gì?
Akshaya Natarajan

4

Thực sự thì github đơn giản hơn chúng ta nghĩ rất nhiều và nó hoàn toàn xảy ra bất cứ khi nào chúng ta cố gắng đẩy ngay cả sau khi chúng ta đã chèn rõ ràng một số tệp vào kho lưu trữ git của mình, vì vậy, để khắc phục sự cố, chỉ cần thử ..

: git pull

và sau đó..

: git push

Lưu ý: nếu bạn vô tình mắc kẹt trong trình chỉnh sửa vim sau khi kéo kho lưu trữ của bạn, đừng lo lắng, chỉ cần đóng trình chỉnh sửa vim và thử đẩy :)


4

Tôi đã thực hiện các bước dưới đây. cuối cùng nó hoạt động tốt.

Các bước

1) git init

2) trạng thái git (để kiểm tra trạng thái)

3) git thêm. (thêm tất cả tệp thay đổi (.))

4) git cam kết -m "<pass your comment>"

5) git từ xa thêm nguồn gốc "<pass your project clone url>"

6) git pull - cho phép-không-liên-quan-lịch sử "<pass your project clone url>"chính

7) Git push -u "<pass your project clone url>"master


2

Tôi đã gặp lỗi này và đó là do có bản cập nhật trên máy chủ nhưng SourceTree không hiển thị bất kỳ bản cập nhật nào khả dụng (có thể do tôi ngoại tuyến khi kiểm tra lần cuối). Vì vậy, tôi đã làm mới trong cây nguồn và bây giờ nó hiển thị 2 mục để đẩy thay vì 1 mục.

Vì vậy, hãy nhớ nhấn làm mới hoặc kéo nếu bạn gặp lỗi này và sau đó thử lại.


1

git pull --rebase origin master

git push origin master


git push -f origin master

Cảnh báo git push -f origin master

  • đẩy mạnh vào kho lưu trữ hiện có và cũng xóa các kho lưu trữ trước đó để nếu bạn không cần các phiên bản trước thì điều này có thể hữu ích

1

Lựa chọn tốt nhất cho tôi và nó hoạt động và đơn giản

git pull --rebase

sau đó

git push

may mắn nhất


1

Đây là cách tôi giải quyết vấn đề này:

  1. git pull origin master
  2. git push origin master

Điều này thường xảy ra khi chi nhánh từ xa của bạn không được cập nhật. Và sau đó nếu bạn gặp lỗi như "Vui lòng nhập thông báo cam kết" Hãy tham khảo điều này (Đối với tôi câu trả lời xiaohu Wang đã hoạt động :))


0

Tôi đã có một dự án SSDT VS trước. Tôi muốn đẩy dự án này lên Github. Tôi muốn cú hích đó là phiên bản ban đầu của repo của tôi bắt đầu nhánh chính. Đề xuất của Donal về git push -f origin master là cách dễ nhất (mà tôi đã thấy) để thực hiện điều này. Vì tôi không phải lo lắng về việc viết lại bất cứ thứ gì, nên nó có vẻ hợp lý.


0

Tôi đã từng gặp vấn đề tương tự. Đã xảy ra rằng tôi đã tạo tệp .Readme trên kho lưu trữ mà không kéo nó trước.

Bạn có thể muốn xóa tệp .Readme hoặc kéo nó trước khi đẩy.


Tôi không chắc câu trả lời này cho câu hỏi cũ 5 năm có cung cấp thêm giá trị nào không, ngoài ra, nó không cung cấp giải pháp cho vấn đề cụ thể của OP. Vì bạn là cộng tác viên mới, vui lòng xem hướng dẫn về cách trả lời câu hỏi: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos


0

bạn có thể dùng

git pull --rebase <your_reponame> <your_branch>

điều này sẽ giúp trong trường hợp bạn có một số thay đổi chưa được đăng ký trên đại diện địa phương của bạn. đặc biệtREADME.md

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.