Apakah mungkin untuk menarik hanya satu file di Git?

177

Saya sedang mengerjakan cabang Git yang memiliki beberapa tes yang rusak, dan saya ingin menarik (menggabungkan perubahan, tidak hanya menimpa) tes ini dari cabang lain di mana mereka sudah diperbaiki.

Saya tahu saya bisa melakukannya

git pull origin that_other_branch

tetapi ini akan mencoba untuk menggabungkan banyak file lain, untuk itu saya belum siap.

Apakah mungkin untuk menarik dan menggabungkan hanya file yang ditentukan (dan bukan segalanya) dari cabang lain itu?

Ini bukan duplikat permintaan tarik Git untuk hanya satu file karena semua jawaban untuk pertanyaan itu adalah bagaimana mengembalikan file yang diubah secara lokal ke versi repositori, tanpa mengubah cabang apa pun.

Audrius Meskauskas
sumber
7
Saya yakin tidak ada entri di halaman ini yang memberikan jawaban untuk pertanyaan itu. Pertanyaannya berarti menarik hanya satu file dari server jauh, tidak menarik semua file dan memeriksa secara lokal hanya satu file. Jadi pertanyaannya harus diulang, atau jawaban yang dipilih tidak ditandai sebagai solusi untuk pertanyaan itu.
mljrg

Jawaban:

153

Anda dapat mengambil dan kemudian memeriksa hanya satu file dengan cara ini:

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

Mengenai git checkoutperintah: <revision> - nama cabang, yaitu origin/master <yourfilepath>tidak termasuk nama repositori (yang bisa Anda dapatkan dari mengklik copy pathtombol pada halaman file di GitHub), yaituREADME.md

aleroot
sumber
23
Kode hash yang diperlukan oleh -m switch dapat dicetak dengan git branch -v. Luar biasa!
Audrius Meskauskas
2
Luar biasa. Ini telah membantu saya lebih dari satu kali. Untuk memperjelas, flag -m tampaknya senang dengan hash dari commit yang ingin Anda tarik file tunggal Anda.
rd108
1
Ini juga bekerja untuk saya. Meskipun demikian, saya menjalankan git log pada cabang jarak jauh saya untuk menemukan pengembalian: mis. $ Git log remote / origin / master
Dan
6
Apakah mungkin untuk menarik file tertentu tanpa menarik file lain?
merasa baik dan pemrograman
3
@aleroot apa singkatan <revision>?
Wakan Tanka
240

Berikut adalah metode yang sedikit lebih mudah saya baru saja temukan ketika meneliti ini:

git fetch {remote}
git checkout FETCH_HEAD -- {file}
Chris
sumber
4
fatal: referensi tidak valid: FETCH_HEAD
Antony D'Andrea
4
Jawaban ini mungkin tidak memiliki contoh yang bagus. Tidak jelas apakah seseorang perlu melakukan selanjutnya.
Dr_Zaszuś
@ Chris apakah kita perlu {remote} jika kita sudah di Cabang? Jika ya, mengapa?
Cloud Cho
2
Tidak sama dengan tarikan, yang akan mencoba penggabungan, itulah sebabnya kami ingin menggunakan tarikan.
JosephK
22
git checkout master -- myplugin.js

master = nama cabang

myplugin.js = nama file

Mawardy
sumber
dan adakah cara untuk kembali?
liyuan
1
jangan lupa untuk 'git pull' sebelumnya;)
matson kepson
16

@ Jawaban Mawardy berhasil untuk saya, tetapi perubahan saya ada di remote jadi saya harus menentukan asal

git checkout origin/master -- {filename}
Luke Flournoy
sumber
2

Ya, inilah prosesnya:

# 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

sumber