2012-06-12 9 views
7

Tôi đang làm việc trên một dự án và tôi có một repo git trung tâm. Dự án này là một bộ xương là một đường cơ sở cho một số nhánh.Git Tracking Upstream

Có thể định cấu hình vùng làm việc cục bộ của tôi cho một ngã ba để theo dõi trung tâm của dự án dưới dạng gốc và theo dõi tổng thể của bộ xương dưới dạng nhánh riêng biệt có tên là thượng nguồn theo dõi tổng thể của bộ xương để chọn thay đổi khung sườn không?

Tôi đoán tôi muốn công việc của tôi là một cái gì đó như:

Tạo Skeleton >> Fork Skeleton >> Skeleton Kéo Những thay đổi từ Fork 2 >> Fork 1 Kéo Những thay đổi từ Skeleton

Có một quá trình tốt hơn để làm những gì tôi đã mô tả?

Trả lời

7

đọc trang "Step 3: Configure remotes" của GitHub "Fork một Repo" (Tôi biết bạn đã không đề cập GitHub, nhưng nó vẫn còn có liên quan)

  • origin là địa chỉ từ xa của ngã ba của bạn, mà bản sao địa phương của bạn có thể kéo từ/push to
  • upstream là địa chỉ từ xa của repo ban đầu của bạn Skeleton (bạn có thể thêm nó với một git remote add upstream https://..../Skeleton.git)

Vì vậy, thượng nguồn không phải là một chi nhánh.

Nhưng bạn có thể định nghĩa một chi nhánh địa phương mà sẽ có cho chi nhánh thượng nguồn chủ chi nhánh theo dõi từ xa từ repo ngược dòng, với git branch:

git branch --set-upstream upstream_master upstream/master 

Tuy nhiên, bạn không cần một chi nhánh địa phương, đặc biệt là nếu bạn sẽ không bao giờ thực hiện các cam kết mới trên đó: bạn có thể so sánh trực tiếp chủ của mình với số upstream/master, sau git fetch upstream, chọn những gì bạn cần từ upstream/master.

+0

Đó là dọc theo dòng của những gì tôi đã cố gắng để làm điều đó nhắc nhở câu hỏi này. Lệnh 'git branch --set-upstream upstream_master upstream/master' sẽ không hoạt động trực tiếp sau' git remote add upstream/srv/repos/git/skeleton.git'. Tại sao vậy? Tôi đã vô tình khắc phục sự cố đang cố gỡ rối. Tôi đã không chính xác muốn chạy 'git fetch upstream' trong cây làm việc chính của tôi, nhưng việc sử dụng nó để khắc phục sự cố sau đó cho phép tôi thêm một nhánh theo dõi từ xa vào luồng ngược/chủ.Tôi cho rằng đó là vì nhánh phía xa/thượng nguồn không có trong repo của tôi cho đến lúc đó. –

+0

trực tiếp sau 'remote add'? Trước tiên, bạn cần 'git fetch upstream', để nhánh theo dõi từ xa' upstream/master' được tìm nạp và đặt vào repo cục bộ của bạn. 'Git fetch' không sửa đổi bất kỳ tệp cục bộ nào của bạn. – VonC

1

Theo mô tả của bạn, bạn nên rebase dĩa trên bộ xương bất cứ khi nào nó thay đổi, sử dụng

$ git rebase upstream 

này sẽ làm thay đổi tình hình như sau

initially: 
1 - 2 - 3 <- upstream 
     \- 4 <- fork 

upstream changes: 
1 - 2 - 3 - 5 - 6 <- upstream 
     \- 4 <- fork 

after rebase: 
1 - 2 - 3 - 5 - 6 <- upstream 
       \- 4 <- fork 

Nói cách khác, ngã ba của bạn sẽ trông giống như thể nó được tách ra từ phiên bản mới nhất của bộ xương.

Những bất lợi của phương pháp này là nó thay đổi lịch sử của các nhánh ... Nếu bạn không muốn điều này, bạn chỉ có thể hợp nhất thượng nguồn vào ngã ba (không cần phải chọn anh đào).

+0

Nếu tệp đã bị xóa ở thượng nguồn sau ngã ba và trước khi rebase, điều gì sẽ xảy ra khi git áp dụng thay đổi cho các tệp đó? –

+0

Nếu bạn không sửa đổi các tệp, chúng sẽ bị xóa trong quá trình rebase. Nếu bạn đã sửa đổi chúng, bạn sẽ có xung đột mà bạn phải giải quyết thủ công. – Sjlver