Có thể chỉ kéo một tệp trong Git?


177

Tôi đang làm việc trên một nhánh Git có một số thử nghiệm bị hỏng và tôi muốn kéo (hợp nhất các thay đổi, không chỉ ghi đè lên) các thử nghiệm này từ một nhánh khác nơi chúng đã được sửa.

Tôi biết tôi có thể làm

git pull origin that_other_branch

nhưng điều này sẽ cố gắng hợp nhất nhiều tập tin khác, vì tôi chưa sẵn sàng.

Có thể chỉ kéo và hợp nhất tệp đã chỉ định (chứ không phải mọi thứ) từ nhánh khác không?

Đây không phải là một bản sao của yêu cầu kéo Git cho chỉ một tệp vì tất cả các câu trả lời cho câu hỏi đó là làm thế nào để hoàn nguyên tệp đã thay đổi cục bộ thành phiên bản kho lưu trữ mà không thay đổi bất kỳ nhánh nào.


7
Tôi tin rằng không có mục nào trong trang này cung cấp câu trả lời cho câu hỏi. Câu hỏi có nghĩa là chỉ kéo một tệp từ máy chủ từ xa, không kéo tất cả các tệp và kiểm tra cục bộ chỉ một tệp. Vì vậy, câu hỏi nên được làm lại, hoặc câu trả lời được chọn không được đánh dấu là giải pháp cho câu hỏi.
mljrg

Câu trả lời:


153

Bạn có thể tìm nạp và sau đó chỉ kiểm tra một tệp theo cách này:

git fetch
git checkout -m <revision> <yourfilepath>
git add <yourfilepath>
git commit

Về git checkoutlệnh: <revision> - một tên nhánh, tức là origin/master <yourfilepath>không bao gồm tên kho lưu trữ (mà bạn có thể nhận được từ copy pathnút bấm trên trang tệp trên GitHub), tức làREADME.md


23
Mã băm được yêu cầu bởi -m switch có thể được in bằng git nhánh -v. Tuyệt vời!
Audrius Meskauskas

2
Thông minh. Điều này đã giúp tôi nhiều hơn một lần. Để làm rõ, cờ -m có vẻ hài lòng với hàm băm của cam kết mà bạn muốn kéo tệp duy nhất của mình.
lần thứ 108

1
Cái này cũng có tác dụng với tôi. Mặc dù vậy, tôi đã chạy nhật ký git trên chi nhánh từ xa của mình để tìm sự đảo ngược: ví dụ: $ git log từ xa / nguồn gốc / chủ
Dan

6
Có thể kéo tập tin cụ thể mà không cần kéo tập tin khác?
cảm thấy tốt và lập trình

3
@aleroot <revision> là viết tắt của từ gì?
Wakan Tanka

240

Đây là một phương pháp dễ dàng hơn một chút mà tôi vừa nghĩ ra khi nghiên cứu về điều này:

git fetch {remote}
git checkout FETCH_HEAD -- {file}

4
gây tử vong: tham chiếu không hợp lệ: FETCH_HEAD
Antony D'Andrea

4
Câu trả lời này có thể thiếu một ví dụ làm việc. Không rõ nếu một người cần phải cam kết tiếp theo.
Dr_Zaszuś

@Chris chúng ta có cần {remote} nếu chúng ta đã ở Chi nhánh không? Nếu đúng thì tại sao?
Đám mây Cho

2
Không giống như pull, sẽ cố gắng hợp nhất, đó là lý do tại sao chúng tôi muốn sử dụng pull.
JosephK

22
git checkout master -- myplugin.js

chủ = tên chi nhánh

myplugin.js = tên tệp


và có cách nào để trở lại?
liyuan

1
đừng quên 'git pull' trước đó;)
maton kepson

16

Câu trả lời của @ Mawardy có tác dụng với tôi, nhưng những thay đổi của tôi là từ xa nên tôi phải chỉ định nguồn gốc

git checkout origin/master -- {filename}

2

Vâng, đây là quá trình:

# Navigate to a directory and initiate a local repository
git init        

# Add remote repository to be tracked for changes:   
git remote add origin https://github.com/username/repository_name.git

# Track all changes made on above remote repository
# This will show files on remote repository not available on local repository
git fetch

# Add file present in staging area for checkout
git check origin/master -m /path/to/file
# NOTE: /path/to/file is a relative path from repository_name
git add /path/to/file

# Verify track of file(s) being committed to local repository
git status

# Commit to local repository
git commit -m "commit message"

# You may perform a final check of the staging area again with git status
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.