Làm thế nào để bạn có được git để luôn luôn kéo từ một chi nhánh cụ thể?


485

Tôi không phải là một bậc thầy về git, nhưng tôi đã làm việc với nó một thời gian rồi, với một vài dự án khác nhau. Trong mỗi dự án, tôi luôn luôn git clone [repository]và từ thời điểm đó, luôn luôn có thể git pull, miễn là tôi không có những thay đổi nổi bật, tất nhiên.

Gần đây, tôi phải trở lại một chi nhánh trước đó và làm như vậy với git checkout 4f82a29. Khi tôi đã sẵn sàng để kéo, tôi thấy rằng tôi phải đặt chi nhánh của mình trở lại thành chủ. Bây giờ, tôi không thể sử dụng đường thẳng git pullmà thay vào đó, phải chỉ định git pull origin master, điều này gây khó chịu và cho tôi biết rằng tôi không hiểu đầy đủ những gì đang diễn ra.

Điều gì đã thay đổi không cho phép tôi thực hiện thẳng git pullmà không chỉ định chủ gốc và làm cách nào để thay đổi lại?

CẬP NHẬT:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

CẬP NHẬT 2: Để rõ ràng, tôi hiểu rằng phương pháp ban đầu của tôi có thể không chính xác, nhưng tôi cần sửa lỗi repo này để tôi có thể đơn giản sử dụng git pulllại. Hiện tại, git pull cho kết quả:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

Tôi có thể cho biết git pullnhánh nào hợp nhất và nó hoạt động chính xác, nhưng git pullkhông hoạt động như ban đầu trước đó git checkout.


.Git / config của bạn trông như thế nào? Bạn đã làm gì sau khi bạn kiểm tra cam kết đó?
Ryan Graham

Bạn đã thực hiện các cam kết trên đầu trang 4f82a29?
Pat Notz

Pat, tôi đã không làm bất kỳ cam kết nào trên nó. Đây là trên một máy chủ và chúng tôi cần quay lại phiên bản ổn định để che giấu lỗi chúng tôi đã tạo. Hệ thống này không dành cho mục đích phát triển, vì vậy tôi chỉ đơn giản muốn quay lại, chờ trong khi chúng tôi sửa lỗi và sau đó kéo trở lại phiên bản đầu.
David Smith

2
Ryan, tôi đã cập nhật để bao gồm .git / config. Sau khi thanh toán, tôi không làm gì cả. Máy tính này là một máy chủ, không phải để phát triển.
David Smith

Câu trả lời:


731

Trong phần này [branch "master"], hãy thử thêm phần sau vào tệp cấu hình Git của repo ( .git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

Điều này nói với Git 2 điều:

  1. Khi bạn ở nhánh chính, điều khiển từ xa mặc định là gốc.
  2. Khi sử dụng git pulltrên nhánh chính, không có từ xa và nhánh được chỉ định, hãy sử dụng từ xa mặc định (gốc) và hợp nhất trong các thay đổi từ nhánh chính từ xa.

Tuy nhiên, tôi không chắc tại sao thiết lập này sẽ bị xóa khỏi cấu hình của bạn. Bạn cũng có thể phải làm theo các đề xuất mà người khác đã đăng, nhưng điều này có thể hoạt động (hoặc ít nhất là giúp đỡ).

Nếu bạn không muốn chỉnh sửa tệp cấu hình bằng tay, bạn có thể sử dụng công cụ dòng lệnh thay thế:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
Điều này cũng làm việc cho tôi, tôi đã kiểm tra một dự án từ github. Tôi đang chạy OS X 10.4
Sam Barnum

Cảm ơn bạn rất nhiều - điều này đã xảy ra với tôi trong một dự án dành cho nhà phát triển với một kho lưu trữ "máy chủ" và hai máy tính (mà tôi thường đẩy / kéo thường xuyên mà không gặp vấn đề gì trước sự cố), không biết tại sao, nhưng cách khắc phục đã có hiệu quả khỏe!
chesterbr

1
Bạn có ý gì bởi Under [nhánh "master"]
ianj

3
@ianj: Trong tệp cấu hình Git (từ gốc repo, .git/config).
mipadi

1
@ianj: Từ dòng lệnh, bạn luôn có thể làm $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/masterthay thế.
mipadi

139

Nếu bạn thích, bạn có thể đặt các tùy chọn này thông qua dòng commmand (thay vì chỉnh sửa tệp cấu hình) như vậy:

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

Hoặc, nếu bạn giống tôi và muốn đây là mặc định trong tất cả các dự án của bạn, bao gồm cả những dự án bạn có thể làm trong tương lai, thì hãy thêm nó dưới dạng cài đặt cấu hình chung:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
+1 để biết từ ma thuật "refs / Heads / master". Tôi đã không gặp khó khăn để tìm ra cách đặt biến, nhưng đã hoàn toàn không có manh mối gì để thiết lập nó để , và các trang người đàn ông không thể giúp ích nhiều. Cuối cùng tôi đã tìm thấy đúng chỗ trong các tài liệu sau khi tôi tìm thấy câu trả lời này. Đối với người tò mò: từ ma thuật đề cập đến một đường dẫn tệp .gittrong đó git xuất hiện để giữ mã băm của mastercam kết hiện tại.
mokus

84
git branch --set-upstream master origin/master

Điều này sẽ thêm thông tin sau vào configtập tin của bạn :

[branch "master"]
    remote = origin
    merge = refs/heads/master

Nếu bạn có branch.autosetuprebase = alwaysthì nó cũng sẽ thêm:

    rebase = true

1
Tôi thấy đây là cách dễ nhất để khiến git hoạt động như được hỏi, đặc biệt là nếu có nhiều chi nhánh hơn, không chỉ từ xa (ngay cả khi bạn phải làm điều này cho mỗi chi nhánh, đó là một lần trên mỗi chi nhánh)
s3v3n 21/03

2
Tôi vừa thử điều này và tôi nhận được lỗi fatal: Not a valid object name: 'origin/master'.mặc dù originlà một điều khiển từ xa hợp lệ và mastertồn tại, như thường lệ, trong cả hai repos.
Ken Williams

2
Ken, trước tiên bạn cần thực hiện "git fetch origin" để lấy tên nhánh từ xa.
Eric Lee

14
Git mới hơn muốn bạn sử dụng git branch --set-upstream-to=origin/master master.
orbeckst

52

Tôi cảm thấy khó nhớ chính xác git confighoặc các git branchđối số như trong câu trả lời của mipadi và Casey, vì vậy tôi sử dụng 2 lệnh này để thêm tham chiếu ngược dòng:

git pull origin master
git push -u origin master

Điều này sẽ thêm thông tin tương tự vào .git / config của bạn, nhưng tôi thấy dễ nhớ hơn.


1
Tôi đồng ý. Đây phải là câu trả lời đơn giản nhất.
linbianxiaocao

2
Câu trả lời của bạn nên bao gồm lý do tại sao nó hoạt động và tham khảo phần trong các tài liệu giải thích lý do tại sao.
vfclists

24

Git pull kết hợp hai hành động - tìm nạp các xác nhận mới từ kho lưu trữ từ xa trong các nhánh được theo dõi và sau đó hợp nhất chúng vào nhánh hiện tại của bạn .

Khi bạn kiểm tra một cam kết cụ thể, bạn không có chi nhánh hiện tại, bạn chỉ có CHÍNH chỉ vào cam kết cuối cùng bạn đã thực hiện. Vì vậy, git pullkhông có tất cả các tham số được chỉ định. Đó là lý do tại sao nó không hoạt động.

Dựa trên thông tin cập nhật của bạn, những gì bạn đang cố gắng làm là hoàn nguyên repo từ xa của bạn. Nếu bạn biết cam kết đã đưa ra lỗi, cách dễ nhất để xử lý lỗi này là git revertghi lại một cam kết mới hoàn tác xác nhận lỗi đã chỉ định:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

Vì đó là máy chủ của bạn mà bạn muốn thay đổi, tôi sẽ cho rằng bạn không cần phải viết lại lịch sử để che giấu lỗi cam kết.

Nếu lỗi được đưa vào trong một cam kết hợp nhất, thì quy trình này sẽ không hoạt động. Xem Làm thế nào để hoàn nguyên-a-bị lỗi-hợp nhất .


Bạn đang cho tôi một nền giáo dục tuyệt vời ở đây, điều mà tôi đánh giá cao, nhưng tôi có thể không mô tả tình huống của mình rất tốt, vì vậy đây không phải là một kết hợp chính xác cho quy trình làm việc của tôi. Có lẽ tôi sẽ gửi một câu hỏi khác để giải quyết điều đó. Cảm ơn, Paul! +1 cho bạn, thưa ông.
David Smith

Tôi chỉ đọc sai tình huống của bạn. Tôi rất vui vì bạn đã có câu trả lời bạn cần.
Paul

12

Ngoài ra còn có một cách để cấu hình Git, vì vậy, nó luôn kéo và đẩy nhánh từ xa tương đương đến nhánh hiện đang được kiểm tra để sao chép. Nó được gọi là một nhánh theo dõi mà git sẵn sàng khuyên bạn nên cài đặt theo mặc định .

Đối với kho lưu trữ tiếp theo phía trên thư mục làm việc hiện tại:

git config branch.autosetupmerge true

Đối với tất cả các kho Git, không được cấu hình theo cách khác:

git config --global branch.autosetupmerge true

Loại ma thuật, IMHO nhưng giúp sức này trong trường hợp chi nhánh cụ thểlúc nào cũng là chi nhánh hiện tại .

Khi bạn đã branch.autosetupmergeđặt truevà kiểm tra chi nhánh lần đầu tiên, Git sẽ cho bạn biết về việc theo dõi chi nhánh từ xa tương ứng:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Git sau đó sẽ tự động đẩy đến nhánh tương ứng đó:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

Không muốn chỉnh sửa tập tin cấu hình git của mình, tôi đã theo dõi thông tin trong bài đăng của @ mipadi và sử dụng:

$ git pull origin master

13
Vấn đề là làm điều này tự động chứ không phải chỉ định nó.
Eric

4

Câu hỏi ngay lập tức của bạn về cách làm cho nó kéo chủ, bạn cần phải làm những gì nó nói. Chỉ định refspec để lấy từ trong cấu hình chi nhánh của bạn.

[branch "master"]
    merge = refs/heads/master

Không phải đó là "refs / Heads / master" sao? Theo git-pull (1), đây là tên của chi nhánh tại trang web từ xa được hợp nhất theo mặc định.
Adam Monsen

Vâng, bạn đã đúng. Repo tôi lấy ví dụ của tôi là một trường hợp đặc biệt. Đã sửa.
Ryan Graham

0

Chỉ muốn thêm một số thông tin đó, chúng tôi có thể kiểm tra thông tin này xem có git pulltự động đề cập đến bất kỳ chi nhánh nào hay không.

Nếu bạn chạy lệnh, git remote show origin(giả sử nguồn gốc là tên viết tắt của điều khiển từ xa), git sẽ hiển thị thông tin này, cho dù có tham chiếu mặc định nào tồn tại git pullhay không.

Dưới đây là một đầu ra mẫu. (Lấy từ tài liệu git).

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Xin lưu ý phần hiển thị, nhánh cục bộ được cấu hình cho git pull.

Trong trường hợp này, git pullsẽ đề cập đếngit pull origin master

Ban đầu, nếu bạn đã nhân bản kho lưu trữ, sử dụng git clone, những thứ này sẽ tự động được chăm sóc. Nhưng nếu bạn đã thêm một điều khiển từ xa bằng cách sử dụng git remote add, thì những điều này bị thiếu trong cấu hình git. Nếu đó là trường hợp, thì phần hiển thị "Nhánh cục bộ được định cấu hình cho 'git pull':", sẽ bị thiếu từ đầu ra củagit remote show origin .

Các bước tiếp theo để làm theo nếu không có cấu hình tồn tại git pull, đã được giải thích bằng các câu trả lời khác.

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.