Làm thế nào để kéo chi nhánh từ xa từ repo của người khác


266

Tôi đã có một dự án được lưu trữ trên GitHub mà ai đó đã rẽ nhánh. Trên ngã ba của họ, họ đã tạo ra một chi nhánh mới "foo" và thực hiện một số thay đổi. Làm thế nào để tôi kéo "foo" của họ vào một nhánh mới cũng được đặt tên là "foo" trong repo của tôi?

Tôi hiểu rằng họ có thể gửi yêu cầu kéo cho tôi, nhưng tôi muốn tự mình thực hiện quy trình này.

Giả sử như sau:

  1. Bởi vì họ đã rẽ nhánh dự án của tôi, cả hai repos của chúng tôi đều có chung 'lịch sử'
  2. Mặc dù GitHub cho thấy dự án của họ được chia rẽ từ kho của tôi, kho lưu trữ cục bộ của tôi không có bất kỳ tài liệu tham khảo nào cho dự án của người này. Tôi có cần thêm chúng như một điều khiển không?
  3. Tôi chưa có một chi nhánh gọi là "foo" - Tôi không biết nếu tôi cần phải tự tạo cái này trước.
  4. Tôi chắc chắn muốn điều này kéo vào một chi nhánh riêng chứ không phải chủ nhân của tôi.

Câu trả lời:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Điều này sẽ thiết lập một chi nhánh địa phương foo, theo dõi các chi nhánh từ xa coworker/foo. Vì vậy, khi đồng nghiệp của bạn đã thực hiện một số thay đổi, bạn có thể dễ dàng kéo chúng:

git checkout foo
git pull

Phản hồi ý kiến:

Thật tuyệt :) Và nếu tôi muốn thực hiện các thay đổi của riêng mình cho chi nhánh đó, tôi có nên tạo một "thanh" nhánh thứ hai từ "foo" và làm việc ở đó thay vì trực tiếp trên "foo" của mình không?

Bạn không cần phải tạo một chi nhánh mới, mặc dù tôi khuyên bạn nên làm điều đó. Bạn cũng có thể cam kết trực tiếp foovà yêu cầu đồng nghiệp của bạn kéo chi nhánh của bạn. Nhưng nhánh đó đã tồn tại và nhánh của bạn foocần được thiết lập như một nhánh ngược dòng với nó:

git branch --set-upstream foo colin/foo

giả sử colinlà kho lưu trữ của bạn (một điều khiển từ xa đến kho lưu trữ đồng nghiệp của bạn) được xác định theo cách tương tự:

git remote add colin git://path/to/colins/repo.git

3
Điều đó rất nhanh :) Bạn có thể muốn thêm rằng anh ta nên sử dụng git://URL từ trang kho lưu trữ GitHub của người khác thay cho //path/to/coworkers/repo.git. (Mô tả đó là điều khiến câu trả lời của tôi quá chậm;))
Mark Longair

Thật tuyệt :) Và nếu tôi muốn thực hiện các thay đổi của riêng mình cho chi nhánh đó, tôi có nên tạo một "thanh" chi nhánh địa phương thứ hai từ "foo" và làm việc ở đó thay vì trực tiếp trên "foo" của mình không?
Colin O'Dell

Hoặc có an toàn để làm việc trực tiếp trong "foo" của tôi và kéo / hợp nhất các thay đổi của anh ấy sau này không? Đó là thực hành tốt nhất ở đây?
Colin O'Dell

1
Hoàn hảo, đó chính xác là những gì tôi đang tìm kiếm :) Cảm ơn sự giúp đỡ của bạn !!
Colin O'Dell

1
Câu trả lời hay trong 3 phút!
Tieme

103

Không, bạn không cần thêm chúng dưới dạng điều khiển từ xa. Điều đó sẽ vụng về và đau đớn mỗi lần làm.

Lấy cam kết của họ:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Điều này tạo ra một nhánh địa phương có tên ournameforbranchgiống hệt như những gì theirbranchđã dành cho họ. Đối với ví dụ câu hỏi, đối số cuối cùng sẽ là foo:foo.

Lưu ý :ournameforbranchmột phần có thể được bỏ qua nếu nghĩ ra một cái tên không xung đột với một trong những nhánh của riêng bạn là phiền phức. Trong trường hợp đó, một tài liệu tham khảo được gọi FETCH_HEADlà có sẵn. Bạn có thể git log FETCH_HEADthấy cam kết của họ sau đó làm những việc như cherry-pickedanh đào chọn cam kết của họ.

Đẩy nó trở lại với họ:

Thông thường, bạn muốn sửa một cái gì đó của họ và đẩy nó trở lại ngay. Điều đó cũng có thể:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

Nếu làm việc trong trạng thái tách rời làm bạn lo lắng, bằng mọi cách, hãy tạo một nhánh sử dụng :ournameforbranchvà thay thế FETCH_HEADHEADở trên bằng ournameforbranch.


2
Cảm ơn bạn vì điều này, câu trả lời khác không hoạt động nếu cả bạn và người kia đều có các nhánh được đặt tên giống hệt (như masternhánh mặc định )
Công việc

2
Điều đáng nói là phương pháp này sẽ không hoạt động nếu bạn không có những thứ như khóa SSH được liên kết với tài khoản github của bạn, xem stackoverflow.com/questions/12940626
Przemek D

bạn không cần phải được thêm làm cộng tác viên để bạn có thể chuyển sang repo của họ chứ?
Mật ong

@Honey Chắc chắn! Đẩy giả định rằng bạn có các quyền cần thiết ở đầu từ xa để đẩy. Tìm nạp tương tự giả định đường dẫn có thể truy cập.
antak

Nếu bạn chạy git branch -m newbranchtrong khi ở trạng thái tách rời này, git sẽ mất trí và bắt đầu nói rằng repo của bạn không còn hiệu lực nữa. git initdường như sửa chữa nó và đưa bạn trở lại trạng thái mà bạn đã ở trước đây, với chi nhánh có tên là "newbranch".
Ian Hickson

14

Nếu câu trả lời của antak:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

mang đến cho bạn:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Sau đó (làm theo lời khuyên của Przemek D)

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

Sau đây là một giải pháp nhanh chóng phù hợp với GitHub để kiểm tra chi nhánh PR từ một ngã ba của người dùng khác. Bạn cần biết ID yêu cầu kéo (mà GitHub hiển thị cùng với tiêu đề PR).

Thí dụ:

Sửa mã không an toàn của bạn # 8
alice muốn hợp nhất 1 cam kết thành your_repo:mastertừher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Thay thế điều khiển từ xa của bạn nếu khác với origin.
Thay thế 8với ID yêu cầu kéo chính xác.


2
Điều này cần nhiều upvote. hoạt động bình thường và tránh được lỗi "nghiêm trọng: Không thể tìm thấy ref từ xa" mà tôi gặp phải với câu trả lời được bình chọn hàng đầu. Cảm ơn!
Michael Romrell

2 dòng mã dễ dàng. Cảm ơn đã chia sẻ điều này! Điều duy nhất ngọt ngào hơn điều này là hợp nhất các bản cập nhật trở lại vào yêu cầu kéo của họ một cách dễ dàng.
klewis

4

GitHub có một tùy chọn mới liên quan đến các câu trả lời trước, chỉ cần sao chép / dán các dòng lệnh từ PR:

  1. Cuộn xuống dưới cùng của PR để xem nút MergehoặcSquash and merge
  2. Nhấp vào liên kết bên phải: view command line instructions
  3. Nhấn biểu tượng Sao chép ở bên phải Bước 1
  4. Dán các lệnh trong thiết bị đầu cuối của bạn

2

Nếu repo rẽ nhánh được bảo vệ để bạn không thể đẩy trực tiếp vào nó và mục tiêu của bạn là thay đổi foo của họ, thì bạn cần phải đưa chi nhánh của họ vào repo của bạn như vậy:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Bây giờ bạn có một bản sao địa phương của foo không có liên kết ngược với nó. Bạn có thể cam kết thay đổi với nó (hoặc không) và sau đó đẩy foo của bạn đến repo từ xa của riêng bạn.

git push --set-upstream origin foo

Bây giờ foo đang ở trong repo của bạn trên GitHub và foo địa phương của bạn đang theo dõi nó. Nếu họ tiếp tục thay đổi foo, bạn có thể tìm nạp họ và hợp nhất vào foo của bạn.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
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.