Git: Làm thế nào để cập nhật / kiểm tra một tập tin từ chủ gốc từ xa?


362

Kịch bản:

  1. Tôi thực hiện một số thay đổi trong một tệp cục bộ và chạy git add, git commitgit push
  2. Các tập tin được đẩy đến kho lưu trữ nguồn gốc từ xa
  3. Tôi có một kho lưu trữ cục bộ khác được triển khai thông qua Capistrano với phương thức "remote_cache" từ kho lưu trữ từ xa đó
  4. Bây giờ tôi không muốn triển khai toàn bộ ứng dụng mà chỉ cập nhật / kiểm tra tệp duy nhất đó.

Đây có phải là cách nào đó có thể với git? Tôi đã không thể tìm thấy bất cứ điều gì sẽ làm việc và tôi không thể tìm ra nó. Với SVN tôi mới làm svn up filevà thì đấy.


19
Bạn có thể muốn xem xét thay đổi câu trả lời được chấp nhận thành câu trả lời thực sự trả lời câu hỏi của bạn. ;)
các bước

6
Sau hơn 6 năm, tôi tin rằng chúng ta có thể giả định một cách an toàn rằng điều này sẽ không xảy ra @steps ...
Félix Gagnon-Grenier

Với Git 2.23 (tháng 8 năm 2019), nó là như vậy git restore -s origin/master -- path/to/file. Xem câu trả lời của tôi dưới đây .
VonC

Câu trả lời:


914

Có thể làm (trong kho được triển khai)

git fetch
git checkout origin/master -- path/to/file

Việc tìm nạp sẽ tải xuống tất cả các thay đổi gần đây, nhưng nó sẽ không đưa nó vào mã kiểm tra hiện tại của bạn (khu vực làm việc).

Thanh toán sẽ cập nhật cây làm việc với tệp cụ thể từ các thay đổi được tải xuống ( origin/master).

Ít nhất điều này hiệu quả với tôi đối với những sửa lỗi đánh máy nhỏ, nơi cảm thấy kỳ lạ khi tạo một nhánh, v.v. chỉ để thay đổi một từ trong một tệp.


1
Siêu tiện dụng, điều này làm việc tuyệt vời. Tôi cần lấy tệp composer.json và chạy cập nhật trước khi cập nhật phần còn lại của trang web trong sản xuất. Nếu tôi đã đặt các tệp composer.json / lock theo cách thủ công, khi tôi thực hiện thao tác kéo, nó sẽ xung đột khi nói rằng các tệp đã tồn tại. Bằng cách làm theo cách này, git đã nhận ra các tệp mà không có khiếu nại.
David

6
Đây là câu trả lời tôi đang tìm kiếm.
javadba

20
@Mymozaaa Dấu gạch ngang kép chỉ định tên tiếp theo là tên tệp. Đó là để ngăn git diễn giải tên tệp của bạn thành một nhánh trong trường hợp không may bạn có hai tên có cùng tên.
Joel Mellon

Vấn đề là bạn vẫn đang tìm nạp và nếu đó là một repo lớn, đó sẽ là hoạt động đắt tiền. Tôi sợ rằng sự thay thế duy nhất sẽ là cài đặt gitweb trên điều khiển từ xa và sau đó truy cập nó để lấy tệp hoặc như vậy.
Christian Goetze

Câu hỏi nhỏ, sau khi làm điều đó, tôi sẽ đến một máy khác, sau đó tôi thực hiện các hành động của bạn được liệt kê ở trên, nhưng sau đó git statustôi thấy chúng là Changes to be committed:- có nghĩa là tôi cần phải thực hiện lại chúng? (chỉ lưu ý rằng tôi muốn làm mới một tệp chưa được xử lý nhưng bản thân repo được chạm vào một máy khác)
Ricky Levi

42

Mã sau làm việc cho tôi:

     git fetch
     git checkout <branch from which file needs to be fetched> <filepath> 

19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

1
Đây là một giải pháp tốt cho các repos được nhân bản qua ssh, nhưng có vẻ như điều này không được hỗ trợ qua https: git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x Cung cấp cho tôi thông báo lỗi:fatal: Operation not supported by protocol.
Alderath

1
đã được kết hợp tốt đẹp với tar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se

19

Với Git 2.23 (tháng 8 năm 2019) và lệnh mới (vẫn đang thử nghiệm) git restore, được xem trong phần " Cách đặt lại tất cả các tệp từ thư mục làm việc nhưng không phải từ khu vực tổ chức? ", Đó sẽ là:

git fetch
git restore -s origin/master -- path/to/file

Ý tưởng là: git restorechỉ giao dịch với các tệp, không phải các tệp các nhánh như git checkouthiện tại.
Xem " Bối rối bởigit checkout ": đó là nơi git switchđến)


codersam thêm vào trong các ý kiến :

trong trường hợp của tôi, tôi muốn lấy dữ liệu từ thượng nguồn của mình (từ đó tôi rẽ nhánh).
Vì vậy, chỉ cần thay đổi thành:

git restore -s upstream/master -- path/to/file

2
Thật là nhẹ nhõm khi lệnh này cuối cùng tồn tại ... Những người git-cluefull đã làm gì trước đây? Tôi đã khôi phục lại toàn bộ và sao chép các tập tin cá nhân tôi cần, nhưng điều đó thật đau đớn.
Mike Wise

Điều này làm việc cho tôi, nhưng trong trường hợp của tôi, tôi muốn lấy dữ liệu từ thượng nguồn của mình (từ đó tôi rẽ nhánh). Vì vậy, chỉ cần đổi thànhgit restore -s upstream/master -- path/to/file
coderSam

@coderSam Hơn bạn cho phản hồi này. Tôi đã bao gồm nhận xét của bạn trong câu trả lời để dễ nhìn hơn.
VonC

8

Những gì bạn có thể làm là:

  1. Cập nhật repo git địa phương của bạn:

    git fetch

  2. Xây dựng một chi nhánh địa phương và kiểm tra trên đó:

    git branch pouet && git checkout pouet

  3. Áp dụng cam kết bạn muốn trên chi nhánh này:

    git cherry-pick abcdefabcdef

    (abcdefabcdef là sha1 của cam kết bạn muốn áp dụng)


4
Bên cạnh đó, bước thứ hai của bạn cũng có thể được thực hiện trong một lệnh như git checkout -b pouet.
Greg Hewgill

4
'Pouet' là tên chi nhánh tốt nhất cho ví dụ này.
Hussard

2

Hoặc git stash (nếu bạn có thay đổi) trên nhánh bạn đang ở, kiểm tra tổng thể, lấy các thay đổi mới nhất, lấy tệp đó vào máy tính để bàn của bạn (hoặc toàn bộ ứng dụng). Kiểm tra chi nhánh bạn đã ở. Git stash áp dụng trở lại trạng thái bạn đang ở, sau đó sửa các thay đổi theo cách thủ công hoặc kéo nó thay thế tệp.

Cách này không hay lắm nhưng nó không hoạt động nếu các bạn không thể tìm ra thứ gì khác.


-10

Tôi nghĩ rằng tôi đã tìm thấy một hack dễ dàng.

Xóa tệp mà bạn có trên kho lưu trữ cục bộ (tệp mà bạn muốn cập nhật từ cam kết mới nhất trong máy chủ từ xa)

Và sau đó làm một git pull

Bởi vì tập tin bị xóa, sẽ không có xung đột


Điều đó loại bỏ tất cả các thay đổi cuối cùng được thực hiện cho tệp đó cục bộ và cũng kéo tất cả các tệp khác, đó là điều đặc biệt mà OP không muốn làm.
legrojan

Thay vì cập nhật chi nhánh từ xa, loại bỏ cục bộ là ý tưởng rất tồi.
c0der512
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.