Cấu hình của bạn chỉ định hợp nhất với <tên nhánh> từ xa, nhưng không có ref nào được tìm nạp.?


202

Tôi nhận được lỗi này cho kéo:

Cấu hình của bạn chỉ định hợp nhất với ref 'refs / Heads / Feature / Sprint4 / ABC-123-Branch' từ xa, nhưng không có ref nào được tìm nạp.

Lỗi này không đến với bất kỳ chi nhánh nào khác.
Điều đặc biệt về nhánh này là nó được tạo từ cam kết trước đó của nhánh khác.

Tập tin cấu hình của tôi trông như:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = <url here>
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch

Bạn có thể chia sẻ lệnh bạn đang sử dụng để thực hiện hợp nhất không?
dchayka

1
Vấn đề này có thể xảy ra khi chi nhánh từ xa đã bị xóa. Kiểm tra lại nếu nó thực sự ở đó.
Benny Neugebauer

4
Độc giả tương lai: Nếu bạn biết chi nhánh từ xa tồn tại, hãy kiểm tra xem bạn có bỏ qua trường hợp hay không. Tôi đã thiết lập một nhánh cục bộ để theo dõi một nhánh từ xa, nhưng đã gõ tên của điều khiển từ xa trong tất cả các chữ cái viết thường. Chỉ cần cấu hình lại cục bộ để theo dõi nguồn gốc / BranchName thay vì nguồn gốc / tên nhánh
Jerreck

Tôi vừa gặp lỗi này và vấn đề đơn giản hơn nhiều so với câu trả lời bên dưới, tôi đã mất kết nối VPN. Vì vậy, đây cũng là lỗi bạn gặp phải nếu git không thể truy cập máy chủ gốc từ xa.
Ben Thurley

Máy chủ git của tôi đã ra. Đó là nguyên nhân.
dellasavia

Câu trả lời:


147

Điều này có nghĩa là gì

Từ xa ngược dòng của bạn, điều khiển từ xa mà bạn gọi là originHayno có hoặc không bao giờ có (không thể nói từ thông tin này một mình) một nhánh có tên feature/Sprint4/ABC-123-Branch. Có một lý do đặc biệt phổ biến cho điều đó: ai đó (có thể không phải bạn, hoặc bạn nhớ) đã xóa chi nhánh trong kho Git khác đó.

Phải làm gì

Điều này phụ thuộc vào những gì bạn muốn . Xem phần thảo luận bên dưới. Bạn có thể:

  • tạo hoặc tạo lại chi nhánh trên điều khiển từ xa, hoặc
  • xóa chi nhánh địa phương của bạn, hoặc
  • Bất cứ điều gì khác mà bạn có thể nghĩ đến.

Thảo luận

Bạn phải đang chạy git pull(nếu bạn đang chạy, git mergebạn sẽ nhận được một thông báo lỗi khác hoặc không có thông báo lỗi nào cả).

Khi bạn chạy git fetch, Git của bạn sẽ liên lạc với một Git khác, dựa trên urldòng trong [remote "origin"]phần cấu hình của bạn. Git đó chạy một lệnh ( upload-pack) trong số những thứ khác, gửi cho Git của bạn một danh sách tất cả các nhánh. Bạn có thể sử dụng git ls-remoteđể xem cách thức hoạt động của nó (thử nó, nó mang tính giáo dục). Đây là một đoạn về những gì tôi nhận được khi chạy nó trên kho Git cho gitchính nó:

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

Các refs/heads/mục liệt kê tất cả các nhánh tồn tại trên điều khiển từ xa, 1 cùng với ID cam kết tương ứng (đối với refs/tags/các mục, ID có thể trỏ đến các đối tượng thẻ thay vì cam kết).

Git của bạn lấy từng tên nhánh này và thay đổi nó theo fetch(các) dòng trong cùng remotephần đó. Trong trường hợp này, ví dụ Git của bạn thay thế refs/heads/masterbằng refs/remotes/origin/master. Git của bạn thực hiện điều này với mỗi tên chi nhánh đi qua.

Nó cũng ghi lại tên gốc trong tệp đặc biệt FETCH_HEAD(bạn có thể thấy tệp này nếu bạn nhìn trộm vào .gitthư mục của riêng bạn ). Tập tin này lưu tên và ID được tìm nạp.

Các git pulllệnh có nghĩa là như một vết cắt tiện ngắn: nó chạy git fetchtrên thích hợp từ xa, và sau đó git merge(hoặc, nếu có chỉ thị, git rebase) với bất cứ đối số là cần thiết để hợp nhất (hoặc rebase) theo chỉ dẫn của [branch ...]phần. Trong trường hợp này, [branch "feature/Sprint4/ABC-123-Branch"]phần của bạn nói để tìm nạp origin, sau đó hợp nhất với bất kỳ ID nào được tìm thấy dưới tên refs/heads/feature/Sprint4/ABC-123-Branch.

Vì không có gì được tìm thấy dưới tên đó, git pullphàn nàn và dừng lại.

Nếu bạn chạy bước này như hai bước riêng biệt, git fetchvà sau đó git merge(hoặc git rebase), Git của bạn sẽ xem xét remotes/origin/các nhánh theo dõi từ xa được lưu trong bộ nhớ cache của bạn để xem những gì sẽ hợp nhất với hoặc khởi động lại. Nếu có một chi nhánh như cùng một lúc, bạn vẫn có thể có chi nhánh từ xa theo dõi. Trong trường hợp này, bạn sẽ không nhận được thông báo lỗi. Nếu không bao giờ có một nhánh như vậy, hoặc nếu bạn đã chạy git fetchvới --prune(loại bỏ các nhánh theo dõi từ xa đã chết), do đó bạn không có nhánh theo dõi từ xa tương ứng, bạn sẽ nhận được một khiếu nại, nhưng origin/feature/Sprint4/ABC-123-Branchthay vào đó , nó sẽ đề cập đến .

Trong cả hai trường hợp , chúng ta có thể kết luận rằng feature/Sprint4/ABC-123-Branchhiện không tồn tại trên điều khiển từ xa có tên origin.

Nó có thể đã tồn tại cùng một lúc và có lẽ bạn đã tạo chi nhánh địa phương của mình từ chi nhánh theo dõi từ xa. Nếu vậy, có lẽ bạn vẫn có nhánh theo dõi từ xa. Bạn có thể điều tra để xem ai đã xóa chi nhánh khỏi điều khiển từ xa và tại sao, hoặc bạn có thể chỉ cần đẩy thứ gì đó để tạo lại hoặc xóa chi nhánh theo dõi từ xa và / hoặc chi nhánh địa phương của bạn.


1 Vâng, tất cả những gì nó sẽ thừa nhận , ít nhất là. Nhưng trừ khi họ đặc biệt ẩn một số ref, danh sách bao gồm tất cả mọi thứ.


Cảm ơn đã giải thích những gì lệnh git pull thực sự làm. Tôi đã có thể khắc phục sự cố của mình bằng cách chạy git fetch và sau đó hợp nhất.
fizch

11
Để xóa tham chiếu chi nhánh từ xa không tồn tại trong kho lưu trữ cục bộ của bạn, hãy sử dụnggit remote prune origin
Yoav

1
@ Ben-Uri: có, hoặc, chạy git fetch --prune originhoặc được đặt fetch.prunethành truetrong cấu hình của bạn (cả ba đều có ý định làm điều tương tự, mặc dù trong một vài phiên bản Git, một số trong số này không đáng tin cậy lắm).

1
Bạn cần git checkout <your remote branch>và tất cả đều tốt (trong một số trường hợp).
Alexander Shtang

2
@JonathanBenn: bạn có thể sử dụng git branch --set-upstream-to=origin/master masterđể chuyển đổi cài đặt ngược dòng cho địa phương của bạn master. Xóa và tạo lại có tác dụng phụ (giả sử bạn sử dụng kiểu DWIM git checkout masterđể tạo nó), với một hiệu ứng phụ bổ sung buộc bạn masterphải khớp với origin/master.

71

Điều này cũng có thể xảy ra nếu bạn / ai đó đổi tên chi nhánh. Vì vậy, hãy làm theo các bước sau (nếu bạn biết rằng tên chi nhánh được đổi tên) Giả sử tên chi nhánh trước đó là wrong-branch-namevà ai đó đã đổi tên thành correct-branch-nameSo.

git checkout correct-branch-name

git pull (bạn sẽ thấy "Cấu hình của bạn chỉ định ..")

git branch --unset-upstream

git push --set-upstream origin correct-branch-name

git pull (bạn sẽ không nhận được tin nhắn trước đó)


1
Nó thậm chí không cần thiết git pushvà nó sẽ không hoạt động nếu chi nhánh hiện tại nằm phía sau điều khiển từ xa. git pull origin correct-branch-nameLà đủ.
Pierre

1
Lệnh để thiết lập ngược dòng là sai ở trên. Thực hiện thao tác kéo git sau, --unset-upflow, trong đầu ra của pull bạn có thể thấy một lỗi, với lệnh đặt ngược dòng, như bên dưới, nhánh git --set-upstream-to = origin / <nhánh > mybranch
Ankit Marothi

Làm việc tốt cho tôi sau khi xóa một số tệp lớn khỏi repo của tôi và cần đẩy trở lại một repo mới tôi vừa tạo
larrytech

40

Kiểm tra nếu chi nhánh từ xa của bạn có sẵn để kéo. Tôi có cùng một vấn đề, cuối cùng nhận ra chi nhánh từ xa đã bị ai đó xóa.


4
Tôi cũng vậy!
Aerin

3
Sau khi yêu cầu kéo, sáp nhập (tức là người đã thực hiện hợp nhất) có tùy chọn xóa nhánh được sáp nhập vào nhánh đích. Nếu bạn cố gắng kéo vào thời điểm đó, bạn sẽ gặp lỗi này.
Artokun

đó là sự thật :)
Malhaar Punjabi

7

Đối với tôi đó là một vấn đề nhạy cảm trường hợp. Chi nhánh địa phương của tôi là Version_feature2 thay vì Version_Feature2. Tôi kiểm tra lại chi nhánh của mình bằng cách sử dụng vỏ chính xác và sau đó git pull hoạt động.


2
Điều này hóa ra cũng là vấn đề của tôi. Không cần thiết rõ ràng với tên chi nhánh khá dài / phức tạp.
Håkon K. Olafsen

6

Lỗi này cũng có thể được nhận khi tên nhánh gốc có một số vấn đề.

Ví dụ: chi nhánh gốc là team1-Teamvà chi nhánh địa phương đã được thanh toán dưới dạng team1-team. Sau đó, điều này Ttrong -Teamttrong -teamcó thể gây ra lỗi như vậy. Điều này đã xảy ra trong trường hợp của tôi. Vì vậy, bằng cách thay đổi tên cục bộ bằng tên của nhánh gốc, lỗi đã được giải quyết.


6

Trong trường hợp của tôi, tôi chỉ đơn giản là thiếu cam kết ban đầu ở chi nhánh từ xa, vì vậy chi nhánh địa phương không tìm thấy gì để kéo và nó đã đưa ra thông báo lỗi đó.

Tôi đã làm:

git commit -m 'first commit' // on remote branch
git pull // on local branch

4

Tôi đã gặp một lỗi tương tự khi nguyên nhân thực tế là đĩa của tôi đã đầy. Sau khi xóa một số tập tin, git pullbắt đầu làm việc như tôi mong đợi.


4

Tôi tiếp tục chạy vào vấn đề này. Trong trường hợp của tôi, nhận xét của @ Jerreck về sự khác biệt trường hợp trong tên chi nhánh là nguyên nhân gây ra lỗi này. Một số công cụ Windows không nhận thức được độ nhạy trường hợp.

Để tắt phân biệt chữ hoa chữ thường trong git, hãy chạy lệnh này:

git config --global core.ignorecase true

Lưu ý rằng điều này sẽ tác động nhiều hơn tên chi nhánh. Ví dụ: nếu bạn có "Foo.h" và "foo.h" trong cùng một thư mục (không phải là ý tưởng tuyệt vời khi xây dựng phần mềm cho Windows) thì tôi nghi ngờ bạn không thể tắt phân biệt chữ hoa chữ thường.


2

Chỉ cần kiểm tra nếu ai đó đã xóa chi nhánh ở xa.


1

Trong trường hợp của tôi, tôi đã xóa chi nhánh ban đầu mà chi nhánh hiện tại của tôi bắt nguồn từ đó. Vì vậy, trong tệp .git / config tôi đã có:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.0.5
    rebase = false

simil2.0.5 đã bị xóa. Tôi đã thay thế nó bằng cùng tên chi nhánh:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.1.12
    rebase = false

va no đa hoạt động


1

Bạn có thể dễ dàng liên kết chi nhánh địa phương của mình với một chi nhánh từ xa bằng cách chạy:

git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull

0

Đối với tôi điều này xảy ra bởi vì tôi đã hợp nhất một nhánh dev thành master bằng giao diện web và sau đó cố gắng đồng bộ hóa / kéo bằng VSCode mở trên nhánh dev. (Thật kỳ lạ là tôi không thể thay đổi thành master mà không gặp lỗi này.)

git pull
Your configuration specifies to merge with the ref 'refs/heads/dev'
from the remote, but no such ref was fetched.'

Điều đó có nghĩa là không tìm thấy nó refs / Heads / dev - đối với tôi, việc xóa thư mục cục bộ và sao chép lại sẽ dễ dàng hơn.


0

Tôi chỉ gặp lỗi chính xác khi thực hiện "git pull" khi đĩa của tôi đã đầy. Tạo một số không gian và tất cả bắt đầu hoạt động tốt trở lại.


0

Bạn có thể chỉnh sửa các ~/.gitconfigtập tin trong thư mục nhà của bạn. Đây là nơi lưu tất cả các cài đặt --global.

Hoặc, sử dụng git config --global --unset-all remote.origin.urlvà sau khi chạy git fetchvới url kho lưu trữ.


0

Tôi đã phải đối mặt với cùng một vấn đề trong đó chi nhánh hiện tại của tôi là dev và tôi đã kiểm tra chi nhánh MR và thực hiện git pull sau đó. Một cách giải quyết dễ dàng mà tôi đã thực hiện là tôi đã tạo một thư mục mới cho MR Branch và thực hiện git pull ở đó theo sau là git clone.

Vì vậy, về cơ bản tôi đã duy trì các thư mục khác nhau để đẩy mã đến các chi nhánh khác nhau.


0

Tôi chỉ gặp lỗi tương tự, khi tôi không sử dụng đúng trường hợp. Tôi có thể kiểm tra 'tích hợp'. Git bảo tôi thực hiện git pullđể cập nhật chi nhánh của mình. Tôi đã làm điều đó, nhưng nhận được lỗi được đề cập. Tên chi nhánh chính xác là 'Tích hợp' với chữ 'I'. Khi tôi kiểm tra chi nhánh đó và kéo, nó hoạt động mà không gặp vấn đề gì.


-2

Nếu một hoạt động khác chỉ hoạt động, điều đó có nghĩa là internet của bạn không được kết nối.


Một số downvote và đây là nguyên nhân tôi đã nhận được lỗi này. Tôi đã có Internet nhưng đã mất VPN vào máy chủ git của mình. Sau khi kết nối lại với VPN, kéo hoạt động tốt.
Ben Thurley
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.