Không thể đẩy tới GitHub - tiếp tục nói cần hợp nhất


743

Tôi mới sử dụng GitHub . Hôm nay tôi đã gặp một số vấn đề khi tôi đang cố gắng đẩy mã của mình lên GitHub.

Pushing to git@github.com:519ebayproject/519ebayproject.git
To git@github.com:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:519ebayproject/519ebayproject.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 chưa đẩy bất cứ thứ gì trong kho lưu trữ, vậy tại sao tôi cần phải kéo một cái gì đó?


6
Lưu ý rằng điều này cũng có thể xảy ra đối với các chi nhánh được truy cập trước đó cục bộ, đã có các cam kết trong kho lưu trữ ngược dòng. Có một cách dễ dàng để chỉ nhanh chóng chuyển tiếp một nhánh cũ như vậy hoặc đơn giản là để git quên nó trong kho lưu trữ cục bộ?
Thorbjørn Ravn Andersen

50
@ ThorbjørnRavnAndersen - Tôi đã cố gắng khắc phục tình huống này bằng cách sử dụng 'git đẩy -f', điều này dường như khiến git quên đi các vấn đề tưởng tượng của nó :)
Echelon

6
Nhìn thấy một khiếu nại về điều này từ người mới git. Lý do là khi họ tạo một dự án mới trên GitHub, họ để lại tickbox "Khởi tạo với readme" hoặc chọn các tùy chọn .gitignore / GPL, vì vậy dự án mới đã có một cam kết mà họ không có cục bộ, do đó gây nhầm lẫn do lỗi ở trên.
Ruslan Kabalin

4
@Echelon tùy chọn -f để buộc đẩy là nguy hiểm. Tôi chỉ sử dụng nó trong một dự án nhóm và 6 cam kết là "sọc", đơn giản là bị xóa khỏi máy chủ và không có cách nào để lấy lại chúng!
Deleplace

42
Nó hợp thời trang để ca ngợi git. Nhưng hầu như mọi nhà phát triển tôi đã nói chuyện, đều đồng ý rằng cá nhân họ ghét git. Bây giờ họ sử dụng git, họ dành nhiều thời gian hơn cho việc kiểm soát nguồn so với những gì họ đã sử dụng khi họ sử dụng perforce hoặc TFS.
nhà phát

Câu trả lời:


762

Điều này có thể khiến kho lưu trữ từ xa bị mất các xác nhận; sử dụng nó một cách cẩn thận.

Nếu bạn không muốn hợp nhất nhánh từ xa vào nhánh cục bộ của mình (xem sự khác biệt với git diff ) và muốn thực hiện một lực đẩy, hãy sử dụng lệnh đẩy với -f

git push -f origin <branch>

nơi originlà tên của bạn từ xa repo.

Thông thường, lệnh từ chối cập nhật một ref từ xa không phải là tổ tiên của ref cục bộ được sử dụng để ghi đè lên nó. Cờ này vô hiệu hóa kiểm tra. Điều này có thể khiến kho lưu trữ từ xa bị mất các xác nhận; sử dụng nó một cách cẩn thận.


1
Điều này làm việc cho tôi cho một repo mà tôi có trên Github nhưng, tôi đã có một mô hình con từ Heroku trong ứng dụng của mình. và tôi đã phải mang các tập tin ra khỏi mô hình con và sau đó đẩy ứng dụng được cập nhật lên Heroku.
JGallardo

24
Hãy chắc chắn rằng bạn đã đọc dòng cuối cùng của bình luận về bài viết này! "Điều này có thể khiến kho lưu trữ từ xa bị mất các cam kết; hãy cẩn thận sử dụng nó." Thực hiện các động tác đẩy trong môi trường nhóm là một điều nguy hiểm và thường nên tránh.
Adam Kalnas

Điều này cũng có thể THÊM tất cả lịch sử từ kho lưu trữ ban đầu vào điều khiển từ xa bằng cách sử dụng cherry-pick để di chuyển 'chỉ' một cam kết. Yêu cầu khôi phục từ bản sao lưu ...
rickfoosusa

Điều đáng nói là nếu bạn đang sử dụng Github, điều này có thể ghi đè lên Yêu cầu kéo mở mà bạn đã tạo trước đây bằng các cam kết gần đây nhất của mình. Từ Github Docs : "Lực đẩy có thể làm hỏng yêu cầu kéo của bạn".
Armfoot

Điều này làm việc cho tôi. Tôi đã thử $ git pull origin master -vnhưng nó cho lỗi fatal: refusing to merge unrelated histories. Sau đó, tôi đã thử điều này và nó hoạt động và các tệp cục bộ của tôi xuất hiện trên repo từ xa github.
Vir

238

Như tin nhắn cho bạn biết,

Hợp nhất các thay đổi từ xa (ví dụ: 'git pull')

Sử dụng git pullđể kéo các thay đổi mới nhất từ ​​kho lưu trữ từ xa sang kho lưu trữ cục bộ của bạn. Trong trường hợp này, việc kéo các thay đổi sẽ yêu cầu hợp nhất vì bạn đã thực hiện các thay đổi đối với kho lưu trữ cục bộ của mình.

Tôi sẽ cung cấp một ví dụ và một hình ảnh để giải thích. Giả sử lần rút cuối cùng của bạn từ nguồn gốc / chi nhánh là tại Cam kết B. Bạn đã hoàn thành và cam kết một số công việc (Cam kết C). Đồng thời, một người khác đã hoàn thành công việc của họ và đẩy nó đến nguồn gốc / chi nhánh (Cam kết D). Sẽ cần phải có một sự hợp nhất giữa hai nhánh này.

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

Bởi vì bạn là người muốn thúc đẩy, Git buộc bạn phải thực hiện hợp nhất. Để làm như vậy, trước tiên bạn phải kéo các thay đổi từ nguồn gốc / chi nhánh.

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

Sau khi hoàn thành việc hợp nhất, bây giờ bạn sẽ được phép chuyển nhanh nguồn gốc / chi nhánh sang Cam kết E bằng cách đẩy các thay đổi của bạn.

Git yêu cầu bạn xử lý việc hợp nhất chính mình, bởi vì việc hợp nhất có thể dẫn đến xung đột.


7
Nếu bạn không muốn hợp nhất thì sao? Và chỉ để lại D là một nhánh phụ (ít nhất là bây giờ). Sau đó, tôi có thể cam kết nhiều hơn sau C; ai đó có thể cam kết nhiều hơn sau D. Có gì vội vàng hợp nhất? Làm thế nào tôi có thể đẩy một chi nhánh phụ mà không sáp nhập? ~~~
Steve Pitchers

3
local / nhánh và origin / Branch có nghĩa là đại diện cho cùng một nhánh nhưng trên các máy khác nhau (local vs origin); để đẩy cục bộ / chi nhánh là cập nhật nguồn gốc / chi nhánh. Nếu bạn muốn trạng thái của nhánh của mình hiển thị cho người khác (ví dụ về nguồn gốc) nhưng bạn không muốn hợp nhất với nguồn gốc / nhánh, thì bạn nên tạo một nhánh mới của local / nhánh (nhánh git [name]) và đẩy nhánh đó về nguồn gốc (git push -u origin [name])
Jake Greene

1
Giải thích tuyệt vời. Video này cho thấy một minh chứng ngắn gọn về vấn đề và cách giải quyết vấn đề như @JakeGreene mô tả, cũng như hai cách để tránh vấn đề này ngay từ đầu khi thiết lập kho lưu trữ mới.
Kevin Markham

4
một số năm sau đó, nó chỉ có vẻ như câu trả lời này là rất rất giống với này khác
superjos

1
Đối với tôi git pullcũng được in Already up-to-date. Hóa ra tôi không ở chi nhánh i mặc dù tôi là một chi nhánh CHÍNH (có thể từ một sự hợp nhất thất bại?). Điều này là hiển nhiên sau khi chạy git branch. Sau khi chạy git checkout mybranchmọi thứ làm việc như mong đợi.
strider

200

Bạn đã cập nhật mã của mình trước khi đẩy?

Sử dụng git pull origin mastertrước khi bạn đẩy bất cứ điều gì.

Tôi giả sử rằng bạn đang sử dụng originlàm tên cho điều khiển từ xa của bạn.

Bạn cần phải kéo trước khi đẩy, để cập nhật kho lưu trữ cục bộ trước khi bạn đẩy thứ gì đó (chỉ trong trường hợp người khác đã cập nhật mã github.com). Điều này giúp giải quyết xung đột cục bộ.


1
Làm thế nào tôi có thể biết tên kho lưu trữ? Khi tôi gõ git pull origin mastergit phàn nàn rằng'origin' does not appear to be a git repository
ziyuang

3
'nguồn gốc' là một điều khiển từ xa. Bạn có thể sử dụng git remote --verboseđể xem tất cả các điều khiển từ xa được cấu hình trong thư mục git của bạn. Thông tin hiển thị trên màn hình cũng sẽ bao gồm đường dẫn "git@github.com" hoặc đường dẫn HTTPS, từ đó bạn sẽ có thể xác định nơi cần đẩy. Hi vọng điêu nay co ich !
AYK

16
git pull origin masterhiển thị Đã cập nhật. nhưng sau đó khi cố gắng nhấn vào origin_branch, điều này nói cùng một cảnh báo được đề cập trong câu hỏi. Bất cứ đề nghị nào !!
CoDe

2
@Shubh bạn đã bao giờ giải quyết vấn đề? Tôi nhận được điều tương tự!
gốc

3
@OrigenAlchemist yes..since Tôi chỉ là nhà phát triển làm việc ở chi nhánh địa phương từ xa ... vì vậy tôi đã buộc đẩy chi nhánh địa phương .. và điều đó ghi đè tất cả các thay đổi của chi nhánh mở trên máy chủ với những thay đổi của tôi từ hệ thống cục bộ. git push -f <remote> <branch>ví dụ: git push origin <your_local_branch> kiểm tra chủ đề này .
CoDe

122

Điều này thường xảy ra khi bạn git commitvà cố gắng git pushthay đổi trước đó git pullingtrên chi nhánh xnơi người khác đã thực hiện thay đổi.

Dòng chảy bình thường sẽ như dưới đây,

BƯỚC 1 : git stashnhững thay đổi không được cam kết tại địa phương của bạn trên chi nhánh đó.

BƯỚC 2 : git pull origin branch_name -vđể pull and mergethay đổi được cam kết cục bộ trên chi nhánh đó ( cung cấp thông báo hợp nhất này và khắc phục xung đột nếu có. )

BƯỚC 3 : git stash popcác stashthay đổi ed ( Sau đó, bạn có thể làm cho các cam kết trên các tập tin popped nếu bạn muốn hoặc đã đẩy những thay đổi cam kết (STEP4) đầu tiên và làm mới cam kết các file sau này. )

BƯỚC 4 : git push origin branch_name -vnhững thay đổi được hợp nhất.

Thay thế branch_namebằng master(cho masterchi nhánh).


3
commitđâu Bạn không nên cam kết thay đổi của bạn sau stash pop?
mehmet

Tôi nên. Tôi thường đẩy mã đã hợp nhất trước và sau đó cam kết các thay đổi không được cam kết tại địa phương. Bạn có thể cam kết và đẩy cùng một lúc là tốt. Chỉ cần ưu tiên.
nguyện

51

Giải pháp đầu tiên và đơn giản (Không khuyến nghị)

  • Hãy thử lệnh này git push -f origin master.
  • Lệnh này sẽ ghi đè lên kho lưu trữ từ xa (GitHub)

Giải pháp được đề nghị

  • Chạy các lệnh sau:
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

Nếu điều này không hiệu quả thì hãy làm theo

  • Xóa .gitthư mục khỏi thư mục.
  • Sau đó thực hiện các lệnh sau:

    git init
    git add .
    git commit -m "First Commit"
    git remote add origin [url]
    git push -u origin master
    

HOẶC LÀ

git push -f origin master 

Chỉ sử dụng git push -f origin masternếu -ukhông làm việc cho bạn.

Điều này sẽ giải quyết hầu hết mọi loại lỗi xảy ra trong khi đẩy tệp của bạn.


4
Xóa repo git của bạn và mất toàn bộ lịch sử cam kết của bạn là một giải pháp "Khuyến nghị"? Có vẻ vội vàng.
Nils Guillermin

@Nils Guillermin Nó phụ thuộc vào tình huống của bạn. Nếu tôi đang làm việc trên một dự án lớn, nơi tôi phải khắc phục tất cả các xung đột hợp nhất thì tôi sẽ sử dụng vscode để xem xét và hợp nhất tất cả các thay đổi một cách dễ dàng. Cảm ơn ý kiến ​​của bạn mặc dù.
Smit Patel

47

Đôi khi chúng tôi quên mất việc kéo và làm rất nhiều công việc trong môi trường địa phương.

Nếu ai đó muốn đẩy mà không cần kéo,

git push --force

đang làm việc. Điều này không được khuyến khích khi làm việc với người khác, nhưng khi công việc của bạn là một điều đơn giản hoặc một dự án đồ chơi cá nhân, nó sẽ là một giải pháp nhanh chóng.


$ git đẩy - chủ nguồn gốc
shaurya uppal

2
Điều này làm việc cho tôi: dự án cá nhân với 0 cộng tác viên khác. Tôi đã thử một số "giải pháp" được đề xuất khác ở đây trên SO, không có giải pháp nào khắc phục được vấn đề rất đơn giản: Tôi đã thực hiện một địa phương reset --hardcho một cam kết cũ hơn và sau đó thực hiện thêm một vài lần nữa. Sau đó, tôi chỉ muốn pushnhưng repo từ xa đã không chuẩn bị để cho tôi. WarrenP thực sự có thể giúp người học git bằng cách ít runic hơn. Có lẽ anh ta không muốn.
mike gặm nhấm

2
Hoặc không sử dụng nó, hoặc học cách sử dụng nó đúng. Nếu bạn buộc đẩy vào một kho lưu trữ trung tâm quan trọng được chia sẻ bởi một nhóm, bạn sẽ mất tất cả quyền truy cập đẩy vào tất cả các kho lưu trữ quan trọng. Những gì bạn làm trên repo cá nhân của riêng bạn, để tránh học những cách khác, cuối cùng sẽ ảnh hưởng đến khả năng làm việc của bạn trên repos được chia sẻ. Nếu bạn biết những gì đã xảy ra trước khi đẩy lực, đôi khi một lực đẩy là ok. Nếu bạn không, nó không bao giờ ổn.
Warren P

35

Một số bạn có thể gặp phải lỗi này vì Git không biết bạn đang cố gắng đẩy chi nhánh nào.

Nếu thông báo lỗi của bạn cũng bao gồm

error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

sau đó bạn có thể muốn làm theo các mẹo hữu ích từ Jim Kubicek, Cấu hình Git thành Chỉ đẩy Chi nhánh hiện tại , để đặt chi nhánh mặc định thành hiện tại.

git config --global push.default current

32
git pull origin branch_name --rebase

Điều này làm việc với tôi - lệnh git pull origin branch_name --rebasesẽ kéo các thay đổi từ rebasenhánh tên từ xa lúc đầu, sau đó là nhánh hiện tại trên đỉnh của nó.


20

Ngoài các câu trả lời ở trên, những điều sau đây có hiệu quả với tôi: -

Kịch bản -

  1. Tôi đã đẩy my_branch để khởi tạo thành công.
  2. Tôi đã thực hiện một vài thay đổi.
  3. Khi tôi cố gắng đẩy lại, (sau khi thực hiện thêm, tất nhiên là cam kết), tôi đã gặp lỗi được đề cập ở trên.

Giải pháp -

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

Bằng chứng


1
Bạn đã giúp tôi. Tôi đã có một thời gian khó khăn để nhận thấy rằng tôi cần phải kiểm tra đến một chi nhánh khác và kéo nó từ xa, mặc dù tôi đã kéo trên một chi nhánh khác bằng cách sử dụng --allcờ.
MZanetti

18

Tôi có cùng một vấn đề, những gì tôi đã làm là lần đầu tiên tôi đẩy nó bằng vũ lực bằng cách sử dụng

git push --force

Tôi đã làm điều này sau khi tôi cam kết các tệp và nhận được một lỗi như bạn đã nhận. Nó đã cam kết tất cả các tệp và nó đã đẩy chúng. Sau đó, lần tiếp theo tôi được đẩy lên github. Tôi đã làm những gì nó yêu cầu và sau đó mọi chuyện vẫn ổn. Hy vọng điều này cũng làm việc cho bạn :)


Nó sẽ hoạt động nhưng nó có thể không phải là những gì bạn muốn! Nó có nghĩa là bạn về cơ bản chỉ là bỏ qua những thay đổi mà sẽ mất đi mãi mãi.
cuộn

3
git push --set-upstream origin master --force
Huyền thoại

1
Cách tuyệt vời để phá hủy một kho lưu trữ. Nếu bạn buộc đẩy bạn sẽ phá hủy lịch sử. Ngoài ra nhiều cơ sở mã git chuyên nghiệp sẽ không cho phép bạn làm điều này.
Oliver Dixon

Đây là một câu trả lời trùng lặp và dù sao bản gốc cũng không phải là lời khuyên tuyệt vời.
moopet

Đây thực sự là những gì tôi muốn làm nhưng tôi chỉ thử với Gitlab và Gitlab không cho phép điều này trên "các nhánh được bảo vệ" theo thiết kế
jeffery_the_wind

13

Tôi đã đề cập đến điều này trong hướng dẫn của mình, Cách sử dụng GitHub: Hướng dẫn cho người mới bắt đầu .

Khi bạn tạo một kho lưu trữ mới trên GitHub, GitHub có thể yêu cầu bạn tạo một tệp readme. Nếu bạn tạo tệp readme trực tiếp trên GitHub, trước tiên bạn sẽ cần thực hiện yêu cầu 'kéo' trước khi yêu cầu 'đẩy' thành công. Các lệnh này sẽ 'kéo' kho lưu trữ từ xa, hợp nhất nó với các tệp hiện tại của bạn và sau đó 'đẩy' tất cả các tệp trở lại GitHub:

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master

Tôi biết đây là một năm sau, nhưng trong số tất cả những câu trả lời này, bạn là người duy nhất thực sự giải thích lý do tại sao tôi gặp rắc rối trong ngày 1 với github. Sự khác biệt giữa kéo và lấy mặc dù là gì?
Xander Luciano

1
Tìm nạp cho phép bạn chọc ngoáy trong các thay đổi mà không hợp nhất chúng vào chi nhánh địa phương của bạn. Kéo là một phím tắt để tìm nạp và sau đó hợp nhất. Tôi chắc rằng bạn đã tìm ra điều đó trong 13 tháng qua. Tôi chỉ đi ngang qua vì tôi đã tạo ra một mớ hỗn độn của riêng mình. ;-)
wolfhoundjlie

6

Tôi đã nhận được thông báo lỗi được đề cập ở trên khi tôi cố gắng đẩy chi nhánh hiện tại của mình foobar:

git checkout foobar
git push origin foo

Hóa ra tôi có hai chi nhánh địa phương theo dõi cùng một chi nhánh từ xa:

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

Nó làm việc cho tôi để đẩy chi nhánh hiện tại của tôi bằng cách sử dụng:

git push origin foobar:foo

... và dọn dẹp với git branch -d


6

git push -f gốc BRANCHNAME

Chỉ sử dụng lệnh trên nếu bạn chắc chắn rằng bạn không cần mã chi nhánh từ xa nếu không hãy hợp nhất trước và sau đó đẩy mã


5
Đây là một bản sao của một câu trả lời xấu.
moopet

5

Nếu bạn không muốn tham gia vào dự án hiện tại của mình (và có khả năng phải đối mặt với xung đột hợp nhất mà bạn không quan tâm để giải quyết) và bạn không muốn tạo một chi nhánh khác (Điều này sẽ rất tẻ nhạt để quản lý một chi nhánh khác) và bạn không Tôi không muốn thực hiện bất kỳ forcelệnh git rủi ro và vĩnh viễn nào (mà ngay cả sau khi đọc những gì họ làm tôi thường ngạc nhiên về ý nghĩa của việc thực hiện nó).

Giải pháp : Bạn có thể chỉ cần kéo nội dung thư mục của bạn vào thư mục khác, kéo dự án vào thư mục trống hiện tại của bạn, kéo nội dung đã kéo vào thùng rác, sau đó kéo dự án chính xác của bạn trở lại thư mục. Bạn sẽ có thể đẩy đúng cách và nhận được kết quả mong muốn. Tôi chỉ mất chưa đến 10 giây để làm điều này.

Đối với những người sẽ nói với tôi điều này là không phù hợp nếu không nêu ra bất kỳ hậu quả nào, hoặc mọi người bảo tôi sử dụng một lệnh gây cho tôi những phiền toái trong tương lai, tôi nói: "Phương pháp này thực sự khiến tôi mất chưa đến 10 giây." Nếu tôi gặp lệnh git chỉ mất chưa đến 10 giây để thực hiện và có hiệu quả chính xác, tôi sẽ chấp nhận điều đó. Cho đến lúc đó, tôi đang sử dụng phương pháp này.

Một nhược điểm của phương pháp này là lịch sử cam kết của bạn sẽ xuất hiện tuyến tính khi bạn thực sự hợp nhất trong một nhánh mà không hợp nhất được ghi lại. Đây có thể không phải là phương pháp tốt nhất khi làm việc với các nhóm. Làm việc trên các chi nhánh trong những trường hợp đó!


4

Chỉ có vấn đề tương tự nhưng trong trường hợp của tôi, tôi đã gõ sai chi nhánh trên điều khiển từ xa. Vì vậy, có vẻ như đó là một nguồn khác của vấn đề này ... hãy kiểm tra kỹ xem bạn đang đẩy đến đúng chi nhánh.


1
Và tôi đã có một điều tương tự, nơi tôi đã nhớ lại một lệnh trước đó, đó là cho một kho lưu trữ hoàn toàn khác!
Clare Macrae

4

Tôi đã trải qua cùng một vấn đề và hóa ra tôi đã ở một chi nhánh (địa phương) khác so với tôi nghĩ tôi là VÀ chi nhánh địa phương chính xác đứng sau các cam kết từ xa.

Giải pháp của tôi: kiểm tra chi nhánh chính xác, chọn cherry từ chi nhánh địa phương khác, kéo git và đẩy git


4

Tôi đã có một vấn đề tương tự và hóa ra quy trình làm việc của tôi để giữ cho chi nhánh của tôi cập nhật là có lỗi. Tôi đã làm như sau:

Ở 'chủ' địa phương của tôi

git fetch upstream
git merge upstream/master --ff-only

sau đó trở lại chi nhánh địa phương của tôi

git rebase master

Điều này hoạt động tốt cho một luồng git trước đó nhưng không phải với github. Các git rebaselà vấn đề ở đây gây ra các vấn đề với đồng bộ (và tôi thừa nhận đó là một cái gì đó tôi đã phải chấp nhận mà không hiểu đầy đủ) và không may đưa tôi vào một vị trí mà git push -fđã trở thành lẽ là lựa chọn dễ dàng nhất. Không tốt.

Luồng mới của tôi là cập nhật chi nhánh trực tiếp bằng cách sử dụng git mergenhư sau:

Trong chi nhánh địa phương của tôi

git fetch upstream
git merge upstream/master

Không nhanh chóng chuyển tiếp, vì tôi sẽ có những thay đổi tất nhiên trong chi nhánh địa phương.

Như bạn có thể nói, tôi không phải là chuyên gia về git nhưng tôi đáng tin cậy rằng quy trình làm việc này có thể sẽ tránh được các vấn đề cụ thể mà tôi gặp phải.


3

Trong trường hợp của tôi, tôi đã kiểm tra "mybranch" và đã thực hiện git pull, vì vậy tôi không thể hiểu tại sao việc đẩy không hoạt động. Cuối cùng, tôi nhận ra rằng tôi đã đẩy nhầm chi nhánh. Tôi đã gõ git push origin masterthay vì git push origin mybranch.

Vì vậy, nếu bạn đã hoàn thành git pullvà vẫn nhận được thông báo này, hãy đảm bảo rằng bạn đang đẩy chi nhánh chính xác.


3

Tên chi nhánh của bạn có giống với tên chi nhánh từ xa không?

Nếu không, bạn nên kiểm tra một nhánh mới có cùng tên với nhánh từ xa và thử đẩy lại.

Giả sử nhánh từ xa bạn muốn đẩy là [ thử nghiệm ] và nhánh cục bộ của bạn được đặt tên là [ thử nghiệm ].

Nếu bạn không ở trong nhánh thử nghiệm , trước tiên hãy chuyển sang nó.

git checkout test

Sau đó mở một chi nhánh mới và đặt tên cho nó thử nghiệm .

git checkout -b testing

Bây giờ, đã đến lúc đẩy nó:

git push [remote repo] testing

2
Chỉ cần sử dụng $git branch -M <new_name>để đổi tên chi nhánh địa phương.
COMS

3

Tôi đã giải quyết vấn đề này tại kho GIT của tôi. Không cần rebasehoặc forcecam kết trong trường hợp này. Sử dụng các bước dưới đây để giải quyết điều này -

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

hy vọng nó sẽ giúp


2

Một giải pháp khác là tiến lên đầu của điều khiển từ xa bằng cách thực hiện một cam kết khác nếu bạn có thể. Sau khi bạn kéo cái đầu tiên tiến này vào cây con địa phương thì bạn sẽ có thể đẩy nó ra một lần nữa.


2

Tôi đã gặp một lỗi tương tự trong khi đẩy các thay đổi mới nhất vào kho lưu trữ Git trần mà tôi sử dụng cho gitweb . Trong trường hợp của tôi, tôi đã không thực hiện bất kỳ thay đổi nào trong kho lưu trữ trần, vì vậy tôi chỉ cần xóa kho lưu trữ trần của mình và nhân bản lại:

git clone --bare <source repo path> <target bare repo path>

2

Nếu bạn chắc chắn rằng không ai thực hiện thay đổi đối với kho git của bạn và rằng bạn đang làm việc trên phiên bản mới nhất, git pullthì không có nghĩa là một giải pháp trong trái tim bạn ...

Sau đó, đây có lẽ là những gì đã xảy ra, bạn đã sử dụng git commit --amend

Nó cho phép bạn kết hợp các thay đổi theo giai đoạn với cam kết trước đó thay vì cam kết nó như một ảnh chụp hoàn toàn mới. Nó cũng có thể được sử dụng để chỉ cần chỉnh sửa thông điệp cam kết trước đó mà không thay đổi ảnh chụp nhanh của nó.

Hướng dẫn ATLASSIAN: viết lại lịch sử

Tuy nhiên, không nên thực hiện git commit --amend nếu bạn đã đẩy cam kết lên GitHub , điều này là do "sửa đổi không chỉ thay đổi cam kết gần đây nhất mà nó thay thế hoàn toàn. Đối với Git, nó sẽ trông giống như một cam kết hoàn toàn mới" có nghĩa là với nhà phát triển khác trên GitHub của bạn, lịch sử trông giống như A-> B-> C nhưng đối với bạn thì có vẻ như A-> B-> D, nếu GitHub cho phép bạn push, mọi người khác sẽ phải tự sửa lịch sử của họ

Đây là lý do tại sao bạn nhận được thông báo lỗi ! [rejected] master -> master (non-fast-forward), nếu bạn biết rằng không ai rút được thay đổi mới nhất của bạn, bạn có thể làm git push --force, điều này sẽ thay đổi lịch sử git trong repo công khai của bạn . Mặt khác ... bạn có thể thực hiện git pull, nhưng tôi tin rằng điều này sẽ có kết quả tương tự như bạn đã không trải quagit commit --amend , nó sẽ tạo ra một cam kết mới (ví dụ: lịch sử git sau khi kéo git: A-> B-> C-> D )

để biết thêm chi tiết: Cách thay đổi cam kết mới nhất của bạn


2

Một lựa chọn khác: đổi tên cục bộ chi nhánh của bạn thành một cái gì đó mới.

Sau đó, bạn sẽ có thể đẩy nó vào kho lưu trữ từ xa, ví dụ nếu đó là cách bạn giữ một bản sao (sao lưu) và đảm bảo không có gì bị mất.

Bạn có thể tìm nạp chi nhánh từ xa để có một bản sao cục bộ và kiểm tra sự khác biệt giữa (i) những gì điều khiển từ xa (với tên chi nhánh cũ) và (ii) bạn có gì (với tên chi nhánh mới) và quyết định làm gì . Vì bạn không biết về sự khác biệt của điều khiển từ xa ở nơi đầu tiên (do đó là vấn đề), nên việc hợp nhất hoặc buộc thay đổi ở đâu đó là quá tàn bạo.

Nhìn vào sự khác biệt, chọn chi nhánh bạn muốn làm việc, chọn cherry thay đổi từ chi nhánh khác hoặc hoàn nguyên các thay đổi bạn không muốn trên chi nhánh bạn có, v.v.

Sau đó, bạn nên ở trong một vị trí để quyết định xem bạn muốn buộc phiên bản sạch của mình lên điều khiển từ xa, hoặc thêm các thay đổi mới, hoặc bất cứ điều gì.


1

Vấn đề với lệnh đẩy là kho lưu trữ cục bộ và từ xa của bạn không khớp. NẾU bạn khởi tạo readme theo mặc định khi tạo kho lưu trữ mới từ trung tâm git, sau đó, nhánh chính được tạo tự động. Tuy nhiên, khi bạn cố gắng đẩy mà không có bất kỳ chi nhánh. bạn không thể đẩy ... Vì vậy, cách tốt nhất là tạo repo mà không cần khởi tạo readme mặc định.


1

Vấn đề này thường xảy ra do tạo tệp readme.md, được tính là một cam kết, không được đồng bộ hóa cục bộ trên hệ thống và thiếu phía sau đầu, do đó, nó hiển thị yêu cầu kéo git. Bạn có thể thử tránh tập tin readme và sau đó thử cam kết. Nó đã làm việc trong trường hợp của tôi.


0

Một nguyên nhân khác của vấn đề này (dường như không quá phổ biến) ...

Máy chủ của tôi đứng sau ~ 12 giờ khi tôi thực hiện một cú đẩy

Tôi đã cấu hình NTP trên máy chủ SYNC đồng hồ của tôi.

Tôi đã thực hiện một cú đẩy git mới dẫn đến lỗi được thảo luận trong bài viết này.


0

Nếu có bất kỳ cơ hội git pullin Already up-to-datethì bạn có thể muốn kiểm tra git push.defaultparam toàn cầu (In ~/.gitconfig). Đặt nó vào simplenếu nó ở trong matching. Câu trả lời dưới đây giải thích tại sao:

Git - Sự khác biệt giữa Push.default "khớp" và "đơn giản" là gì

Ngoài ra, cũng đáng kiểm tra nếu chi nhánh địa phương của bạn đã hết hạn sử dụng git remote show originvà thực hiện thao tác kéo nếu cần


0

sử dụng git pull https://github.com/username/repository Đó là vì Github và kho lưu trữ từ xa không đồng bộ. Nếu bạn pullrepo và sau đó Pushmọi thứ sẽ được đồng bộ hóa và lỗi sẽ biến mất.

`


0

git pull đã in up-to-date

giải pháp:

bạn có thể được tạo một kho lưu trữ / dự án trong điều khiển từ xa (máy chủ) và thêm một số tệp vào đó, sau đó lại tạo một Thư mục trong git cục bộ và khởi tạo của bạn git init- đây là lỗi , bạn không nên tạo git initcục bộ, thay vào đó hãy sao chép dự án vào cục bộ của bạn sử dụnggit clone

sau đó kéo

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.