Git push bị từ chối "không tua đi nhanh"


90

Tôi còn khá mới githiện đang sử dụng nó để quản lý mã của chúng tôi trong môi trường nhóm. Tôi đã gặp một số vấn đề khôi phục và tôi đã khắc phục chúng bằng cách sử dụng

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

Bây giờ tôi muốn đẩy các thay đổi của mình và chạy lệnh sau

$ git push origin feature/my_feature_branch

cho tôi lỗi sau:

To ssh://git@coderepo.com:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://git@coderepo.com:7999/repo/myproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Tôi có thể làm gì để loại bỏ lỗi này?

Tái bút: Tôi đang tránh sử dụng --forcetùy chọn nhiều nhất có thể.


Câu trả lời:


76

Có vẻ như ai đó đã đẩy các cam kết mới giữa lần cuối của bạn git fetchgit push. Trong trường hợp này, bạn cần lặp lại các bước của mình và căn cứ lại my_feature_branchmột lần nữa.

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

Sau khi git fetchtôi khuyên bạn nên kiểm tra tình hình với gitk --all.


Việc cần làm để bật git pull origin master: master sẽ được mặc định là hợp nhất. Đây có phải là xung đột hợp nhất hay không. Đây là câu hỏi duy nhất được hỏi.
mathtick

24

Có thể bạn đã không tìm nạp các thay đổi từ xa trước khi rebase hoặc ai đó đã đẩy các thay đổi mới (trong khi bạn đang khôi phục và cố gắng đẩy). Hãy thử các bước sau:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp

Điều này giải quyết vấn đề của tôi: khi tôi cam kết mã của mình, tôi đã thực hiện rebase (quá muộn, đã có những thay đổi, nên thực hiện trước khi cam kết). Sau đó ngay cả khi không có xung đột, tôi không thể thúc ép. Sau khi áp dụng phép thuật trên, nó đã hoạt động. Cảm ơn.
Jing Li

19

Tôi đã có vấn đề này! Tôi đã thử: git fetch + git merge, nhưng không giải quyết được! Tôi đã thử: git pull, và cũng không giải quyết được

Sau đó, tôi đã thử điều này và giải quyết vấn đề của mình (tương tự như câu trả lời của Engineer):

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

7
Điều này khiến tôi khó chịu, tôi đã trực tiếp đẩy mọi thứ để làm chủ và đẩy triển khai từ cả ngày ... và mọi người đều bực mình .... MẸO TUYỆT VỜI!
Mike Q

6
Có lẽ muốn giải thích tóm tắt những gì bạn đang làm trước khi đưa cho ai đó một công cụ nguy hiểm.
Mirv - Matt

10

Tôi đã gặp sự cố tương tự và tôi đã giải quyết nó bằng: git pull origin


1
Đã giúp tôi khi tôi nhận được lỗi được đề cập trong khi kéo một nhánh từ xa.
GChuf

7

Tôi đến bữa tiệc muộn nhưng tôi đã tìm thấy một số hướng dẫn hữu ích trong trang trợ giúp github và tôi muốn chia sẻ chúng ở đây.

Đôi khi, Git không thể thực hiện thay đổi của bạn đối với một kho lưu trữ từ xa mà không làm mất các cam kết. Khi điều này xảy ra, thúc đẩy của bạn bị từ chối.

Nếu một người khác đã đẩy đến cùng một nhánh với bạn, Git sẽ không thể đẩy các thay đổi của bạn:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Bạn có thể khắc phục điều này bằng cách tìm nạp và hợp nhất các thay đổi được thực hiện trên nhánh từ xa với các thay đổi mà bạn đã thực hiện cục bộ:

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

Hoặc, bạn có thể chỉ cần sử dụng git pullđể thực hiện cả hai lệnh cùng một lúc:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work

4

thử lệnh này

$ git push -f -u origin <name of branch>

I E $ git push -f -u origin master


Điều đó hiệu quả với trường hợp của tôi trong khi những người khác thì không. Đôi khi bạn chỉ cần nói git -f -u
gcr

1

Ghi khóa trên kho lưu trữ cục bộ được chia sẻ

Tôi đã gặp vấn đề này và không có lời khuyên nào ở trên giúp tôi. Tôi đã có thể tìm nạp mọi thứ một cách chính xác. Nhưng đẩy mãi không thành. Nó là một kho lưu trữ cục bộ nằm trên thư mục windows với một số khách hàng làm việc với nó thông qua trình điều khiển thư mục chia sẻ VMWare. Có vẻ như một trong những hệ thống đã khóa kho lưu trữ Git để viết. Sau khi dừng hệ thống VMWare có liên quan, điều này khiến mọi thứ được sửa chữa ngay lập tức. Hầu như không thể tìm ra được hệ thống nào gây ra lỗi, vì vậy tôi phải dừng từng cái một cho đến khi thành công.


1

Tôi đã sử dụng lời khuyên ở đây và nó khiến tôi khó hiểu khi nó hợp nhất mã cục bộ của tôi trực tiếp để thành thạo. .... vì vậy hãy coi tất cả chỉ bằng một hạt muối. Đồng nghiệp của tôi nói rằng điều sau đây đã giúp giải quyết vấn đề, cần phải bổ nhiệm lại chi nhánh của tôi.

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch

0

Trong Eclipse, hãy làm như sau:

Kho lưu trữ GIT> Điều khiển từ xa> Nguồn gốc> Nhấp chuột phải và nói tìm nạp

Kho lưu trữ GIT> Theo dõi từ xa> Chọn chi nhánh của bạn và nói hợp nhất

Đi tới dự án, nhấp chuột phải vào tệp của bạn và nói Tìm nạp từ ngược dòng.


0
  1. chuyển mã sang một nhánh mới - git branch -b tmp_branchyouwantmergedin
  2. thay đổi nhánh bạn muốn hợp nhất - git checkout mycoolbranch
  3. đặt lại nhánh mà bạn muốn hợp nhất - git branch reset --hard HEAD
  4. hợp nhất nhánh tmp thành nhánh mong muốn - git branch merge tmp_branchyouwantmergedin
  5. đẩy về nguồn gốc

0

Đây là một giải pháp khác để giải quyết vấn đề này

>git pull
>git commit -m "any meaning full message"
>git push

-1
  1. Hoàn tác cam kết cục bộ. Điều này sẽ chỉ hoàn tác cam kết và giữ lại các thay đổi trong bản sao làm việc
git reset --soft HEAD~1
  1. Kéo các thay đổi mới nhất
git pull
  1. Bây giờ bạn có thể cam kết các thay đổi của mình trên đầu mã mới nhất
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.