Git: Bagaimana cara memperbarui / checkout satu file dari master asal jauh?


363

Skenario:

  1. Saya membuat beberapa perubahan dalam satu file secara lokal dan menjalankan git add,git commit dangit push
  2. File didorong ke repositori master asal jarak jauh
  3. Saya memiliki repositori lokal lain yang digunakan melalui Capistrano dengan metode "remote_cache" dari repositori jarak jauh
  4. Sekarang saya tidak ingin menyebarkan seluruh aplikasi tetapi hanya memperbarui / checkout file tunggal itu.

Apakah ini entah bagaimana mungkin dengan git? Saya tidak dapat menemukan apa pun yang akan berhasil juga saya tidak bisa mengetahuinya. Dengan SVN saya baru saja melakukannya svn up filedan voila.


19
Anda mungkin ingin mempertimbangkan untuk mengubah jawaban yang diterima menjadi jawaban yang benar-benar menjawab pertanyaan Anda. ;)
langkah

6
Setelah lebih dari 6 tahun, saya percaya kita dapat dengan aman berasumsi bahwa ini tidak akan terjadi @ langkah ...
Félix Gagnon-Grenier

Dengan Git 2.23 (Agustus 2019), itu git restore -s origin/master -- path/to/file. Lihat jawaban saya di bawah ini .
VonC

Jawaban:


915

Hal ini dimungkinkan untuk dilakukan (dalam repositori yang digunakan)

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

Pengambilan akan mengunduh semua perubahan terbaru, tetapi tidak akan memasukkannya ke dalam kode yang Anda periksa saat ini (area kerja).

Kasir akan memperbarui pohon kerja dengan file tertentu dari perubahan yang diunduh ( origin/master).

Setidaknya ini bekerja untuk saya untuk perbaikan kesalahan ketik kecil itu, di mana rasanya aneh untuk membuat cabang dll hanya untuk mengubah satu kata dalam file.


1
Sangat berguna, ini bekerja dengan baik. Saya perlu mendapatkan file composer.json dan menjalankan pembaruan sebelum saya memperbarui sisa situs dalam produksi. Jika saya secara manual meletakkan file composer.json / lock di tempatnya, ketika saya melakukan pull, itu akan bertentangan mengatakan file sudah ada. Dengan melakukannya dengan cara ini, git mengenali file-file tersebut tanpa keluhan.
David

6
Ini adalah jawaban yang saya cari.
javadba

20
@Mymozaaa Tanda hubung ganda menunjukkan bahwa yang berikut adalah nama file. Ini untuk mencegah git menafsirkan nama file Anda sebagai cabang dalam kasus malang Anda punya dua dengan nama yang sama.
Joel Mellon

Masalahnya adalah bahwa Anda masih mengambil, dan jika itu repo besar, itu akan menjadi operasi yang mahal. Saya khawatir bahwa satu-satunya alternatif adalah menginstal gitweb pada remote dan kemudian mengaksesnya untuk mengambil file atau semacamnya.
Christian Goetze

pertanyaan kecil, setelah melakukan itu, saya akan ke mesin yang berbeda, lalu saya melakukan tindakan Anda yang tercantum di atas, tetapi kemudian git statussaya melihatnya sebagai Changes to be committed:- artinya, saya perlu mengkomitnya lagi? (hanya mencatat bahwa saya ingin me-refresh satu file yang tidak disentuh tetapi repo itu sendiri disentuh dalam mesin yang berbeda)
Ricky Levi

42

Kode berikut berfungsi untuk saya:

     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
Ini adalah solusi yang baik untuk repo yang dikloning di atas ssh, tetapi sepertinya ini tidak didukung di https: git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x Beri saya pesan kesalahan:fatal: Operation not supported by protocol.
Alderath

1
bagus dikombinasikan dengan tar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se

19

Dengan Git 2.23 (Agustus 2019) dan perintah baru (masih eksperimental) git restore, terlihat pada " Cara mengatur ulang semua file dari direktori yang berfungsi tetapi tidak dari area staging? ", Yaitu:

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

Idenya adalah: git restorehanya berurusan dengan file, bukan file dan cabang seperti git checkouthalnya.
Lihat " Bingung olehgit checkout ": di situlah git switchmasuk)


codersam menambahkan dalam komentar :

dalam kasus saya, saya ingin mendapatkan data dari hulu (dari mana saya bercabang).
Jadi baru saja diubah menjadi:

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

2
Sungguh melegakan bahwa perintah ini akhirnya ada ... Apa yang dilakukan orang git-cluefull sebelumnya? Saya memulihkan semuanya dan menyalin file individual yang saya butuhkan, tetapi itu menyakitkan.
Mike Wise

Ini bekerja untuk saya, tetapi dalam kasus saya, saya ingin mendapatkan data dari hulu (dari mana saya bercabang). Jadi baru saja berubah menjadigit restore -s upstream/master -- path/to/file
coderSam

@coderSam Dari Anda untuk umpan balik ini. Saya telah memasukkan komentar Anda dalam jawaban untuk lebih banyak visibilitas.
VonC

8

Yang dapat Anda lakukan adalah:

  1. Perbarui git repo lokal Anda:

    git fetch

  2. Bangun cabang lokal dan lakukan checkout:

    git branch pouet && git checkout pouet

  3. Terapkan komit yang Anda inginkan di cabang ini:

    git cherry-pick abcdefabcdef

    (abcdefabcdef adalah sha1 dari commit yang ingin Anda terapkan)


4
Selain itu, langkah kedua Anda juga dapat dilakukan dalam satu perintah sebagai git checkout -b pouet.
Greg Hewgill

4
'pouet' adalah nama cabang terbaik untuk contoh ini.
Hussard

2

Atau git simpanan (jika Anda memiliki perubahan) pada cabang Anda aktif, checkout master, tarik untuk perubahan terbaru, ambil file itu ke desktop Anda (atau seluruh aplikasi). Periksa cabang tempat Anda berada. Git simpanan berlaku kembali ke status Anda sebelumnya, lalu perbaiki perubahan secara manual atau seret untuk mengganti file.

Cara ini tidak terlalu keren tapi itu berfungsi jika kalian tidak bisa menemukan yang lain.


-10

Saya pikir saya telah menemukan hack yang mudah.

Hapus file yang Anda miliki di repositori lokal (file yang ingin Anda perbarui dari komit terbaru di server jauh)

Dan kemudian lakukan git pull

Karena file dihapus, tidak akan ada konflik


Itu menghapus semua perubahan yang akhirnya dibuat untuk file itu secara lokal, dan juga menarik semua file lainnya, yang secara khusus tidak ingin dilakukan oleh OP.
legrojan

Alih-alih memperbarui cabang jarak jauh, menghapus lokal adalah ide yang sangat buruk.
c0der512
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.