2009-03-18 31 views
460

Tôi không phải là một bậc thầy git, nhưng tôi đã làm việc với nó một thời gian, với một số 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 có thể git pull, miễn là tôi không có các thay đổi nổi bật, tất nhiên.Làm thế nào để bạn nhận được git để luôn luôn kéo từ một chi nhánh cụ thể?

Gần đây, tôi phải hoàn nguyên về 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 thiết lập chi nhánh của tôi trở lại làm chủ. Bây giờ, tôi không thể kéo bằng cách sử dụng git pull thẳng mà thay vào đó, phải chỉ định git pull origin master, điều này gây phiền nhiễu và cho tôi biết rằng tôi không hiểu đầy đủ về những gì đang diễn ra.

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

UPDATE:

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

UPDATE 2: Để được rõ ràng, tôi hiểu rằng phương pháp ban đầu của tôi có thể là không chính xác, nhưng tôi cần phải sửa chữa repo này vì vậy mà tôi chỉ đơn giản là có thể sử dụng git pull một lần nữa. Hiện nay, git pull kết quả trong:

-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ể nói git pull mà chi nhánh để hợp nhất, và nó hoạt động một cách chính xác, nhưng git pull không hoạt động như nó đã làm ban đầu trước khi git checkout tôi.

+0

.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 đó? –

+0

Bạn có cam kết ở trên cùng của 4f82a29 không? –

+0

Pat, tôi không thực hiện bất kỳ cam kết nào trên đầu trang của nó. Đây là trên máy chủ và chúng tôi cần quay lại phiên bản ổn định để ẩn một lỗi mà 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ỉ muốn quay trở 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. –

Trả lời

709

Dưới [branch "master"], hãy thử thêm dòng sau vào tập tin cấu hình Git của repo (.git/config):

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

này cho Git 2 điều:

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

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

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

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

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

+0

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

+0

Xem câu trả lời của Đầu để tránh phải chỉnh sửa tệp cấu hình theo cách thủ công – pjb3

4

Câu hỏi trực tiếp 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 để kéo từ cấu hình nhánh của bạn.

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

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

+0

Có, bạn đã đúng. Các repo tôi lấy ví dụ của tôi từ là một trường hợp đặc biệt. Đã sửa. –

23

Git pull kết hợp hai hành động - lấy cam kết mới từ kho lưu trữ từ xa trong các ngành theo dõi và sau đó sáp nhập chúng vào chi 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ó nhánh hiện tại, bạn chỉ có HEAD trỏ đến cam kết cuối cùng bạn đã thực hiện. Vì vậy, git pull không có tất cả thông 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 rằng đã giới thiệu lỗi, cách dễ nhất để xử lý này là với git revert ghi lại một mới cam kết mà Undoes các lỗi quy định cam kết:

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

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

Nếu lỗi được giới thiệu trong cam kết hợp nhất, thì quy trình này sẽ không hoạt động. Xem How-to-revert-a-faulty-merge.

+0

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

+0

Tôi chỉ hiểu 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

10

Không muốn để chỉnh sửa tập tin git config của tôi, tôi theo các thông tin trong @ mipadi của bưu chính, sử dụng:

$ git pull origin master 
+13

Điểm chính là làm điều này tự động thay vì chỉ định nó. – Eric

137

Nếu bạn thích, bạn có thể thiết lập các tùy chọn này qua dòng commmand (thay vì chỉnh sửa file config) như sau:

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

Hoặc, nếu bạn đang như tôi, và muốn điều này trở thành mặc định trên tất cả các dự án của bạn, kể cả những bạn có thể làm việc trên trong thời gian tới, sau đó thêm nó như là một thiết lập cấu hình toàn cầu:

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

+1 để biết từ ma thuật "refs/heads/master". Tôi đã không gặp khó khăn trong việc tìm ra cách để đặt biến, nhưng hoàn toàn không có đầu mối những gì để đặt nó * *, và các trang người đàn ông không được giúp đỡ nhiều. Cuối cùng tôi đã tìm thấy đúng chỗ trong tài liệu sau khi tôi tìm thấy câu trả lời này. Đối với những người tò mò: từ kỳ diệu đề cập đến một đường dẫn tập tin trong '.git', trong đó git xuất hiện để giữ mã băm của' master 'hiện hành cam kết. – mokus

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

này sẽ bổ sung thêm các thông tin sau để tập config của bạn:

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

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

rebase = true 
+0

Tôi thấy đây là cách dễ nhất để làm cho git cư xử như được hỏi, đặc biệt 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 nhánh, mỗi lần một nhánh) – s3v3n

+1

nhận được lỗi 'fatal: Không phải là tên đối tượng hợp lệ: 'origin/master'.' mặc dù' origin' là một từ xa hợp lệ và 'master' tồn tại, như thường lệ, trong cả hai repos. –

+2

Ken, trước tiên bạn cần phải "git fetch origin" để lấy tên nhánh từ xa. –

6

Ngoài ra còn có một cách để cấu hình Git, nó luôn kéo và đẩy nhánh từ xa tương đương đến nhánh hiện đang được kiểm tra với bản sao làm việc. Nó được gọi là chi nhánh theo dõi mà git ready recommends setting by default.

Đối với kho tiếp theo 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, mà không phải là cấu hình khác:

git config --global branch.autosetupmerge true 

Kind of magic, IMHO nhưng điều này có thể giúp đỡ trong trường hợp trong đó chi nhánh cụ thể luôn là chi nhánh hiện tại.

Khi bạn có branch.autosetupmerge thiết lập để true và kiểm một chi nhánh cho lần đầu tiên, Git sẽ cho bạn biết về việc theo dõi các 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ẽ đẩy để mà chi nhánh tương ứng tự độ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 [email protected]:bigben87/webbit.git 
    1bf578c..268fb60 gh-pages -> gh-pages 
45

Tôi thấy khó ghi nhớ chính xác đối số git config hoặc git branch 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 ce:

git pull origin master 
git push -u origin master 

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

+1

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

+0

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 tài liệu giải thích tại sao. – vfclists

Các vấn đề liên quan