! [bị từ chối] cái -> cái (tìm nạp trước)


101

Có cách nào hay để giải thích cách giải quyết " ! [rejected] master -> master (fetch first)'" trong Git không?

Khi tôi sử dụng lệnh này, $ git push origin masternó sẽ hiển thị thông báo lỗi.

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:zapnaa/abcappp.git'

Câu trả lời:


132

Câu trả lời là ở đó, git yêu cầu bạn tìm nạp trước.

Có thể ai đó đã thúc đẩy để làm chủ rồi, và cam kết của bạn đang ở phía sau. Do đó, bạn phải tìm nạp, hợp nhất tập thay đổi, và sau đó bạn sẽ có thể đẩy lại.

Nếu bạn không (hoặc thậm chí tệ hơn, nếu bạn buộc nó bằng cách sử dụng --forcetùy chọn), bạn có thể làm rối tung lịch sử cam kết.

CHỈNH SỬA: Tôi đi vào chi tiết hơn về điểm cuối cùng, vì một anh chàng ở đây vừa đưa ra Lời khuyên Rất tồi về việc sử dụng --forcetùy chọn.

Vì git là một DVCS, lý tưởng nhất là nhiều nhà phát triển khác đang làm việc trên cùng một dự án với bạn, sử dụng cùng một kho lưu trữ (hoặc một nhánh của nó). Nếu bạn ghi đè mạnh mẽ tập thay đổi của mình, kho lưu trữ của bạn sẽ không khớp với người khác, bởi vì "bạn đã viết lại lịch sử". Bạn sẽ làm cho người khác không hài lòng và kho lưu trữ sẽ đau khổ. Có lẽ một con mèo con trên thế giới cũng sẽ khóc.

TL; DR

  1. Nếu bạn muốn giải quyết, hãy tìm nạp trước (và sau đó hợp nhất).
  2. Nếu bạn muốn hack, hãy sử dụng --forcetùy chọn.

Tuy nhiên, bạn đã yêu cầu cái trước. Đi cho 1) luôn luôn, ngay cả khi bạn sẽ luôn sử dụng git một mình, bởi vì đó là một thực hành tốt.


5
Không thể tìm nạp xóa các thay đổi quan trọng trong tệp cục bộ?
Leonardo Castro

2
Nó không thay đổi sau khi tìm nạp
dhein

@dhein như tôi đã viết, tìm nạp phải được theo sau bởi một hợp nhất - vấn đề là bạn phải "căn chỉnh" cây cục bộ với cây từ xa (do đó có hợp nhất) - nhưng cảm ơn, tôi đã viết nó trong TL; DR quá
linuxbandit

88

thử:

git fetch origin master
git merge origin master

Sau khi viết mã này, tôi nhận được lỗi khác: (không tua đi nhanh)

Tôi viết mã này:

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

Và giải quyết vấn đề của tôi


Tương tự cho tôi. Điều đó đã giải quyết vấn đề của tôi. Có một vài cảnh báo. Tôi đã nhầm lẫn với một kho lưu trữ phụ, nhưng đã giải quyết nó bằng cách này: stackoverflow.com/questions/19584255/…
M.

1
@Aurelio A Lệnh hợp nhất của bạn không chính xác, đúng như vậy git merge master.
mike

Tại sao chúng ta cần sử dụng git branch -D tmp?
Милош Вељковић

27

Bạn nên sử dụng git pull, lệnh đó thực hiện một git fetchvà tiếp theo làm git merge.

Nếu bạn sử dụng một git push origin master --forcelệnh, bạn có thể gặp sự cố trong tương lai.


1
Có đúng là bạn chỉ nên sử dụng --force nếu bạn là người duy nhất trong dự án và bạn đang cảm thấy thất vọng khi cố gắng thực hiện lần đẩy đầu tiên của mình?
chrips

20

pull luôn là cách tiếp cận đúng nhưng một ngoại lệ có thể xảy ra khi bạn đang cố gắng chuyển đổi hệ thống tệp none-Git thành kho lưu trữ Github. Ở đó, bạn sẽ phải thực hiện cam kết đầu tiên.

git init
git add README.md
git add .
git commit -m "first commit"
git remote add origin https://github.com/userName/repoName.git
git push --force origin master

làm việc cho tôi, tôi bắt đầu lại một dự án mới (cùng một repo) và tôi muốn thay thế nó.
ucotta

18

Hãy thử lệnh git này

git push origin master --force

hoặc thiếu lực lượng -f

git push origin master -f


2
Điều này ghi đè hạn chế git push. Không được khuyến khích cho làm việc theo nhóm. Từ tài liệu git push: Nếu ai đó khác xây dựng dựa trên lịch sử ban đầu của bạn trong khi bạn đang phục hồi, thì phần đầu của nhánh ở điều khiển từ xa có thể tiến lên với cam kết của cô ấy và đẩy một cách mù quáng với --force sẽ mất công việc của cô ấy .
Casey

10

Như được nêu trong thông báo Lỗi, bạn phải "tìm nạp trước." Điều này đã làm việc cho tôi. Sử dụng lệnh:

  1. git fetch origin master

Sau đó, hãy làm theo các bước sau để hợp nhất:

  1. git pull origin master
  2. git add .
  3. git commit -m 'your commit message'
  4. git push origin master

4

Vui lòng thử lệnh này để giải quyết nó -

git push origin master --force

Hoặc là

 git push origin master -f

3

Bạn có thể sử dụng lệnh sau: Đầu tiên sao chép một bản sao mới của repo của bạn, sử dụng cờ --mirror:

$ git clone --mirror git://example.com/some-big-repo.git

Sau đó làm theo các mã cho phù hợp:

Thêm dự án hiện có vào GitHub bằng dòng lệnh

Ngay cả khi điều đó không hiệu quả, bạn có thể chỉ cần viết mã:

$ git push origin master --force 

hoặc là

$ git push origin master -f

3

Làm theo các bước được cung cấp bên dưới vì tôi cũng gặp sự cố tương tự:

$ git pull origin master --allow-unrelated-histories 

(Để xem có thể dễ dàng hợp nhất chi nhánh cục bộ với chi nhánh từ xa hay không)

$ git push -u origin master 

(Bây giờ đẩy toàn bộ nội dung của kho lưu trữ git cục bộ sang kho lưu trữ trực tuyến của bạn)


2

Có khả năng ai đó khác (ví dụ như đồng nghiệp của bạn) đã đặt các cam kết origin/masterkhông thuộc masterchi nhánh cục bộ của bạn và bạn đang cố gắng đẩy một số cam kết từ chi nhánh cục bộ của mình lên máy chủ. Trong 99% trường hợp, giả sử bạn không muốn xóa công việc của họ origin, bạn có hai lựa chọn:

2) Hợp nhất các thay đổi của họ vào chi nhánh cục bộ của bạn, rồi đẩy kết quả đã hợp nhất. git checkout master git pull # resolve conflicts here git push

(Lưu ý rằng git pullvề cơ bản chỉ là a git fetchvà a git mergetrong trường hợp này.)

1) Cơ sở lại chi nhánh địa phương của bạn, để có vẻ như đồng nghiệp của bạn đã thực hiện cam kết của họ trước và sau đó bạn thực hiện cam kết của mình. Điều này giữ cho lịch sử cam kết tốt đẹp và tuyến tính - và tránh "cam kết hợp nhất". Tuy nhiên, nếu bạn có xung đột với những thay đổi của đồng nghiệp, bạn có thể phải giải quyết những xung đột đó cho từng cam kết của mình (thay vì chỉ một lần) trong trường hợp xấu nhất. Về cơ bản, điều này tốt hơn cho mọi người nhưng nỗ lực nhiều hơn cho bạn. git pull --rebase # resolve conflicts here git push

(Lưu ý rằng git pull --rebasevề cơ bản là a git fetchvà a git rebase origin/master.)



1

Lỗi của bạn có thể là do nhánh hợp nhất.
Chỉ cần làm theo điều này:

bước 1: git pull origin master(trong trường hợp nếu bạn nhận được bất kỳ thông báo nào thì hãy bỏ qua nó)
bước 2: git add .
bước 3: git commit -m 'your commit message'
bước 4:git push origin master


1

Đầu tiên, bạn nên sử dụng git pull, sau đó lệnh làm a git fetchvà tiếp theo thực hiện hợp nhất git.

Nếu bạn sử dụng một git push origin master --forcelệnh, bạn có thể gặp sự cố trong tương lai.


1

Tôi đã khắc phục điều này bằng cách kiểm tra một chi nhánh mới như thế này:

# git checkout -b newbranch <SHA of master>

# git branch
* newbranch
  master

# git push -u <repo_url_alias> newbranch

Bạn còn lại 2 nhánh: Master và newbranch, bạn có thể quản lý để hợp nhất sau.


0

Bạn chỉ cần đề cập đến tên chi nhánh của bạn cùng với tên từ xa của bạn.

git fetch origin
git merge origin/master

0

Lý do nó xảy ra trong trường hợp của tôi là khi tạo liên kết đại diện GitHub, tôi đã khởi tạo nó bằng tệp README

Trong khi tạo Git từ xa, không khởi tạo nó bằng tệp README nếu không nó sẽ hiển thị lỗi

Đừng làm điều đó & nó chắc chắn sẽ hoạt động tốt Thay vào đó hãy khởi tạo nó bằng tệp readme nếu bạn muốn sau khi đẩy đến nhánh chính


0

Điều này hiệu quả với tôi, vì không có giải pháp nào khác phù hợp với tôi. KHÔNG BAO GIỜ LỰC LƯỢNG!

https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-using-the-command-line

Chỉ cần phải đi qua Git Bash

cd REPOSITORY-NAME
git add .
git commit -m "Resolved merge conflict by incorporating both suggestions."

Sau đó, quay lại cmd của tôi và tôi có thể: git push heroku mastertrong trường hợp của tôi là vấn đề.


0

--force tùy chọn phù hợp với tôi mà tôi đã sử dụng git push origin master --force


0

nhập mô tả hình ảnh ở đây

! Lỗi [bị từ chối] master -> master (tìm nạp trước): không thể đẩy một số ref tới 'git@github.com:'

nhập mô tả hình ảnh ở đây

Đã giải quyết thành công sự cố bằng lệnh --force. vì vậy, bạn phải sử dụng
git push origin master --force


-1

công việc này cho tôi

  1. git init

  2. git add --all

3.git cam kết -m "tên"

4. git push origin master --force


-1

Điều này đã làm việc cho tôi:

$ git add .
$ git commit -m "commit"
$ git push origin master --force

-1

Đơn giản của nó sử dụng lệnh này:

git push -f origin master

và nó sẽ hoàn thành công việc của bạn


-1

Vấn đề đã được giải quyết

Vấn đề tôi gặp phải

! [rejected]        master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/repo_name/repo-hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g.hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Tôi cũng có cùng một vấn đề. Vấn đề là commitsở các kho lưu trữ khác của bạn không thành công, pushedvì vậy bạn cần chạy các lệnh sau:

  1. git fetch origin master

    đầu ra: From https://github.com/username/repo-name * branch master -> FETCH_HEAD

  2. git merge origin master

    đầu ra: Merge made by the 'recursive' strategy. repo-name/ReadMe.md | 1 - 1 file changed, 1 deletion(-)

  3. git push

    đầu ra: Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 8 threads Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 1.00 KiB | 1.00 MiB/s, done. Total 6 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 1 local object. To https://github.com/user_name/repo-name.git 0852d5vf..70v56d9 master -> master

Cảm ơn bạn rất nhiều

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.