Bạn yêu cầu tôi kéo mà không cho tôi biết bạn muốn hợp nhất với chi nhánh nào


125

TL; DR: Tôi có một nhánh "được theo dõi" mà tôi không thể kéo.

Vì vậy, ở đây tôi đang ở trong "xô-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

Tôi muốn lấy các thay đổi từ xa của mình:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, lẻ, tôi nghĩ rằng tôi đã thêm "xô-4" làm nhánh theo dõi. Hãy xem nào:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:abcd/main.git
  Push  URL: git@github.com:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

Thật vậy, xô-4 được đánh dấu là "được theo dõi", nhưng bằng cách nào đó, nó được cấu hình để đẩy, nhưng không kéo.

Nhìn vào .git/configtệp của tôi , tôi thấy rằng tôi có các mục "từ xa" và "hợp nhất" cho hầu hết các chi nhánh của mình, nhưng không phải cho nhóm 4. Làm thế nào nó thậm chí được coi là "theo dõi" mà không có điều này?

[remote "origin"]
    url = git@github.com:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

Tôi thấy rằng giải pháp có khả năng ở đây là thêm remote/mergecác mục cho xô-4 trong tệp cấu hình của tôi. Nhưng làm thế nào nó được coi là "theo dõi" mà không có điều này? xô-4 được tạo cục bộ, sau đó được đẩy đến máy chủ từ repo này, vì vậy tôi nghi ngờ rằng bằng cách nào đó tôi đã không thiết lập theo dõi đúng cách cho chi nhánh này.

Có một số cấu hình tôi có thể thêm vào để làm cho tất cả các chi nhánh địa phương theo dõi điều khiển từ xa của họ đúng cách trong tương lai không?


2
Câu hỏi này chỉ cho tôi đi đúng hướng, tôi chỉ cần thêm một mục trong tệp .git / config cho nhánh tôi đang cố gắng kéo thì nó hoạt động tốt.
Ông Bungle

Yup tôi cũng vậy, và cách để làm điều đó là như Mark Longair đã mô tả bên dưới với nhánh git --set-upflow xô-4 origin / xô-4
Jonathon Horsman

Câu trả lời:


191

Nó nói bucket-4 pushes to bucket-4chỉ vì mặc định khi đẩy một nhánh là đẩy nó sang một cái có tên trùng khớp trên điều khiển từ xa. (Lưu ý rằng đây vẫn là mặc định, ngay cả khi nhánh cục bộ đang theo dõi một nhánh theo dõi từ xa và nhánh theo dõi từ xa tương ứng với một nhánh có tên khác trong kho lưu trữ từ xa.)

Cách đơn giản nhất để thiết lập liên kết giữa bạn bucket-4bucket-4trong originlà đảm bảo rằng lần sau bạn đẩy, bạn làm:

git push -u origin bucket-4

Ngoài ra, bạn có thể làm:

git branch --set-upstream-to origin/bucket-4

Để trả lời một vài câu hỏi của bạn trực tiếp:

Làm thế nào nó thậm chí được coi là "theo dõi" mà không có điều này?

Trong trường hợp này thì không - nó không theo dõi nhánh theo dõi từ xa theo bất kỳ ý nghĩa nào nếu không có branch.bucket-4.mergehoặc branch.bucket-4.remotetrong cấu hình git của bạn. Đầu ra từ git remote show originchỉ hiển thị cho bạn nơi nhánh sẽ được đẩy theo mặc định.

Có một số cấu hình tôi có thể thêm vào để làm cho tất cả các chi nhánh địa phương theo dõi điều khiển từ xa của họ đúng cách trong tương lai không?

Tôi không nghĩ rằng có. Khi bạn tạo bucket-4cục bộ, như tôi giả sử đã xảy ra, nhánh theo dõi từ xa không tồn tại, vì vậy nó không thể được thiết lập tại thời điểm đó - đó sẽ là hành vi mặc định rất khó hiểu. Bạn chỉ cần nhớ để thêm -uvào git pushnhánh đầu tiên của bạn vào kho lưu trữ ngược dòng của nó.

Tôi hy vọng đó là một số trợ giúp.


7
git branch --set-upstreamlàm việc hoàn hảo cho tôi trước khi thực hiện thao tác kéo
ohaal

chi nhánh git --set-upflow xô-4 origin / xô-4 làm việc cho tôi :-)
Aliza 24/12/13

Nếu bạn không muốn đẩy thì sao? Tôi có vấn đề tương tự nhưng tôi không muốn đẩy từ repo rằng vấn đề này xảy ra. Tôi vừa chuyển nguồn gốc từ xa và tôi muốn kéo xuống ĐẦU mới nhất cho nhánh dường như không còn được theo dõi nữa (mặc dù nó đã được theo dõi trước khi tôi chuyển nguồn gốc từ xa). Cuối cùng, tôi đã xóa bản sao có vấn đề và sao chép lại từ nguồn gốc mới.
địa lý

1
Thực tế khi thử git --set-upstream <branch> origin/<branch>bạn gặp lỗi vì cờ bị phản đối. Nó được khuyến nghị sử dụng git branch --track origin/<branch>hoặc --set-upstream-tonhư câu trả lời thứ hai được đề xuất. Tôi đoán câu trả lời có thể được cập nhật, @MarkLongair?
AymDev

Cảm ơn lời đề nghị, @AymDev - Tôi đã thực hiện thay đổi đó.
Mark Longair

6

git branch --set-upstream <branch> origin/<branch> đã không được chấp nhận ít nhất là vào ngày 1.8.2.3 (phiên bản của tôi).

Sử dụng git branch --set-upstream-to=origin/<branch> <branch>thay thế.


2
Ý của bạn là đây có phải là một nhận xét về câu trả lời của Mark không? Ngoài ra, nó thực sự không được dùng trong phiên bản Git 1.8.0 .
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.