2011-09-09 25 views
10

Vì vậy, đây là tình hình:'chỉ trạng thái git' của repo chỉ cho biết chi nhánh ở phía trước nguồn gốc/chủ. Tại sao?

tình trạng $ git
# Mở thạc sĩ ngành
# chi nhánh của bạn chạy nhanh của 'nguồn gốc/master' bởi [x] cam kết.
#

Có một số câu hỏi về vấn đề này trên SO đã có, nhưng không ai có vẻ quyết cụ thể các loại kịch bản tôi có. This answer cho một trong những câu hỏi đến gần nhất, nhưng không đi vào chi tiết.

tôi sẽ chỉ trích nó đúng nguyên văn:

Nếu bạn nhận được thông báo này sau khi làm một "git pull chi nhánh từ xa", hãy thử sau nó lên với một "git fetch".

Tìm nạp có vẻ như cập nhật đại diện cục bộ của nhánh từ xa, điều này không nhất thiết xảy ra khi bạn thực hiện "git pull remote branch".

Mẹo đó thực sự hiệu quả. Nhưng "không nhất thiết phải xảy ra?" Tại sao không? Tôi cần hiểu điều này. Kéo không làm gì?

Tôi không muốn tiếp quản câu hỏi đó, vì vậy, đây là kịch bản của tôi cụ thể:

Ba máy tính có liên quan. Máy Mac mà trên đó tôi phát triển, máy chủ gia đình của tôi, nơi có cuộc gọi git repo (tức là nguồn gốc/chủ) và một tài khoản Webfaction lấy từ máy chủ đó.

Tôi thực hiện cam kết và git push origin master chỉ trên máy Mac. Lệnh duy nhất được chạy trên Webfaction như là một phần của quy trình làm việc bình thường là git pull origin master (như một phần của tập lệnh triển khai Vải). Tôi không sửa đổi mã ở đó. Tôi là một nhà phát triển duy nhất, vì vậy không ai khác.

Từng giờ tôi đăng nhập vào Webfaction và kiểm tra mọi thứ, bao gồm git status. Chắc chắn, tôi luôn nhận được thông báo "Chi nhánh của bạn đang ở phía trước ...". Chạy git fetch làm cho tin nhắn biến mất.

Tôi sắp thêm git fetch vào tập lệnh Fabric được thực hiện với vấn đề này, nhưng tôi muốn biết lý do tại sao cần phải thực hiện, đặc biệt là trên bản sao chỉ xuất xứ/bản gốc. Tôi không sâu sắc trong Git mặc dù tôi sử dụng các chức năng cơ bản hàng ngày, do đó, một lời giải thích thân thiện với người mới sẽ được đánh giá cao.

Cập nhật theo yêu cầu, các bit có liên quan từ config:

[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = [email protected][server_address]:[path/to/repo.git] 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
+0

Bạn có thể đăng phần "nguồn gốc" của cấu hình git từ máy chủ Webfaction trong câu hỏi không? Tôi có cảm giác nó có thể liên quan đến nó. – Nic

+0

Lưu ý rằng tôi chưa sửa đổi tệp cấu hình đó theo bất kỳ cách nào. Nó được tạo ra với một tiêu chuẩn 'git clone' từ repo gốc. –

Trả lời

9

Ok, vì vậy ngay từ đầu, bạn đang làm mọi thứ chính xác. Tôi nghĩ rằng những nhận xét bạn thêm trước đây là một lời giải thích khá tốt:

Trong thuật ngữ đơn giản, "git pull" không một "git fetch" theo sau là một "git merge"

Đó là cách Tôi nghĩ về nó. Vì vậy, bạn không cần phải gọi một số git fetch sau khi đi thẳng git pull - nhưng, tôi gần như có thể đảm bảo với bạn, điều này hoạt động hoàn toàn tốt trên bất cứ điều gì XỬ LÝ chi nhánh master.

Trong một trong những bài viết liên quan, nó nói để loại bỏ các dòng sau:

[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this 

Và nó nên khắc phục vấn đề này - tuy nhiên, tôi không thể cung cấp một lời giải thích là tại sao các công trình này. Nó rất khó để nghiên cứu, nhưng tôi nghĩ rằng khi bạn gọi fetch, cấu hình git của bạn thực sự chỉ định chính xác những gì để lấy. Khi bạn đang chạy pull, tôi không chắc chắn rằng nó cho rằng master được đồng bộ hóa.

Tôi có thể đảm bảo với bạn rằng nếu bạn đã thực hiện việc này từ một chi nhánh không phải là tổng thể khác, bạn sẽ không thấy vấn đề này. Hy vọng rằng một trong những gitus git có thể giải thích dòng fetch trong cấu hình chi tiết.

Hơn nữa, tôi sẽ khuyên bạn nên chạy lệnh sau thay vì đó đặt các HEAD cho kho từ xa để đảm bảo nó là đồng bộ với địa phương của bạn một: git push -u origin master


Dưới đây là một câu hỏi thú vị:

Having a hard time understanding git-fetch


Ok, vì vậy tôi thử nghiệm này trên một trong những công việc của tôi và tìm thấy những điều sau đây.

Khi bạn thực hiện git pull origin master trên máy chủ từ xa, có một tệp trong thư mục .git/ tham chiếu đến vị trí HEAD của bạn. Hai tập tin để lưu ý:

ORIG_HEAD

FETCH_HEAD

Bạn sẽ nhận thấy rằng FETCH_HEAD của bạn là đúng, nhưng ORIG_HEAD cho thấy cũ cam kết, do đó lý do bạn nhận được Ahead by x. Khi bạn chạy git fetch, bạn sẽ thực sự sửa tham chiếu trong ORIG_HEAD và mọi thứ trở lại bình thường. Tôi đang tìm cách thay đổi dòng fetch trong cấu hình để khắc phục hành vi này.

+0

Được đánh dấu là đã được chấp nhận. Nhìn vào các câu hỏi khác về chủ đề này, tôi nghi ngờ rằng tôi thậm chí sẽ hiểu thêm bất kỳ giải thích kỹ thuật nào nữa (vì trong số những thứ khác, tôi thực sự không hiểu những gì "refspecs" và theo dõi các chi nhánh thường được đề cập trong các câu hỏi liên quan đến Git khác thực sự là .. .) –

+0

Tôi chỉ phải làm một git lấy về chủ của tôi vì một lý do nào đó. –

+0

Tôi đã có cùng một vấn đề trên các chi nhánh theo dõi từ xa không chính, và ở cấp độ git fetch hơn là git pull. git fetch remote branch dường như không cập nhật ORIG_HEAD như câu trả lời này cho biết, và git fetch thực hiện. @Nic - bạn có tìm thấy dòng tìm nạp tốt hơn cho tệp cấu hình để tạo lệnh dạng dài cũng cập nhật ORIG_HEAD không? –

1

Xem câu hỏi này: What is the difference between 'git pull' and 'git fetch'?

AFAIK một git pull sẽ xem xét các chi nhánh trên nguồn gốc và kéo xuống các thay đổi. Nhưng chỉ mục cục bộ của chi nhánh không được cập nhật. git fetch sẽ cập nhật chỉ mục của nhánh để nó hiểu những gì nên có. (về cơ bản những gì được tham chiếu trong câu trả lời mà bạn đã liên kết đến)

Tôi luôn tìm kiếm git trước khi kéo git. Thực sự tôi làm một git lấy bất cứ lúc nào tôi sẽ làm bất cứ điều gì với các ngành từ xa.

Cũng được liên kết với câu hỏi trên là mô tả rất tốt về tìm nạp, kéo và hợp nhất git. http://longair.net/blog/2009/04/16/git-fetch-and-merge/

+0

Câu trả lời được chấp nhận cho câu hỏi đó cho biết: 'Trong thuật ngữ đơn giản nhất, "git pull" thực hiện "git fetch" theo sau là "git merge".' Tôi vẫn còn bối rối như khi đó là thực sự là trường hợp và khi một git lấy riêng biệt là cần thiết. –

+0

melee đã giải thích điều này ở trên. Tôi cũng rất muốn biết tại sao nhánh chủ được đối xử khác với các nhánh khác. – jhanifen

5

Nếu bạn chạy git pull origin thay vì git pull origin master, sẽ không có vấn đề với thông báo Your branch is ahead of 'origin/master' by ... commits..

+0

Vâng, điều này thật thú vị. Khi tôi "kéo chủ gốc" có vẻ như chỉ lấy HEAD gốc/master ('* branch master -> FETCH_HEAD'), nhưng" pull origin "lấy toàn bộ nhánh (' 647e59e..e1d6c02 master -> origin/master'). – jarvisteve

0

Trong trường hợp của tôi - tôi có hai chi nhánh ở Gốc và mỗi lần tôi kéo một git kéo nó cho thấy rằng tôi đã đi trước nguồn gốc/chủ bởi x.Ngay cả sau khi đặt lại cứng nó về nguồn gốc/chủ như được hiển thị trong Reset local repository branch to be just like remote repository HEAD.

Giải pháp xảy ra khi tôi chỉ cần chạy git fetch và nó mang chi nhánh phát triển của tôi lên máy chủ sản xuất của tôi.

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