Saya menyembunyikan perubahan saya. Sekarang saya ingin melepaskan hanya beberapa file dari simpanan. Bagaimana saya bisa melakukan ini?
Saya menyembunyikan perubahan saya. Sekarang saya ingin melepaskan hanya beberapa file dari simpanan. Bagaimana saya bisa melakukan ini?
Jawaban:
Seperti yang disebutkan di bawah ini , dan dirinci dalam " Bagaimana cara mengekstrak satu file (atau perubahan ke file) dari simpanan git? ", Anda dapat menerapkan penggunaan git checkout
atau git show
mengembalikan file tertentu.
git checkout stash@{0} -- <filename>
Itu menimpa filename
: pastikan Anda tidak memiliki modifikasi lokal, atau Anda mungkin ingin menggabungkan file simpanan sebagai gantinya .
(Sebagai berkomentar oleh Jaime M. , untuk shell tertentu seperti tcsh di mana Anda perlu untuk melarikan diri karakter khusus, sintaks akan: git checkout 'stash@{0}' -- <filename>
)
atau untuk menyimpannya di bawah nama file lain:
git show stash@{0}:<full filename> > <newfile>
(perhatikan bahwa di sini
<full filename>
adalah nama path lengkap dari file relatif ke direktori teratas proyek (pikirkan: relatif terhadapstash@{0}
)).
Yucer menyarankan dalam komentar :
Jika Anda ingin memilih secara manual, perubahan mana yang ingin Anda terapkan dari file itu:
git difftool stash@{0}..HEAD -- <filename>
Vivek menambahkan dalam komentar :
Sepertinya "
git checkout stash@{0} -- <filename>
" mengembalikan versi file pada saat simpanan dilakukan - TIDAK berlaku (hanya) perubahan simpanan untuk file itu.
Untuk melakukan yang terakhir:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(seperti yang dikomentari oleh peterflynn , Anda mungkin perlu | git apply -p1
dalam beberapa kasus, menghapus satu ( p1
) slash utama dari jalur diff tradisional)
Seperti yang dikomentari: "unstash" ( git stash pop
), maka:
git add
)git stash --keep-index
Poin terakhir adalah apa yang memungkinkan Anda menyimpan beberapa file sambil menyimpan yang lainnya.
Ini diilustrasikan dalam " Cara menyimpan hanya satu file dari banyak file yang telah berubah ".
git stash pop
karena konflik file. Jawaban Balamurugan A membantu saya dalam kasus itu.
unstash
berarti pop
, seperti yang menurut saya mungkin dalam banyak kasus, ini hanya menjawab sebagian pertanyaan. Bagaimana Anda kemudian menghapus potongan-potongan yang diterapkan secara selektif dari simpanan untuk menghindari konflik dan / atau kebingungan kemudian ketika muncul perubahan yang tersisa?
git checkout stash@{N} <File(s)/Folder(s) path>
Misalnya. Untuk mengembalikan hanya file ./test.c dan folder ./include dari simpanan terakhir,
git checkout stash@{0} ./test.c ./include
-a
bendera saat membuat simpanan.
Saya pikir jawaban VonC mungkin adalah yang Anda inginkan, tetapi inilah cara untuk melakukan "git apply" selektif:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
apa pun.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- backticks diperlukan agar PS tidak menafsirkan kawat gigi secara khusus, dan sc
itu diperlukan karena >
operator PS default ke UTF-16 (sebenarnya UCS-2) yang mungkin bukan yang Anda inginkan. Jawaban @Balamurugan A tidak menderita dari masalah ini.
Pertama daftar semua simpanan
git stash list
↓
stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'
Kemudian tunjukkan file mana yang ada di simpanan (mari pilih simpanan 1):
git stash show 1 --name-only
//Hint: you can also write
//git stash show stash@{1} --name-only
↓
ajax/product.php
ajax/productPrice.php
errors/Company/js/offlineMain.phtml
errors/Company/mage.php
errors/Company/page.phtml
js/konfigurator/konfigurator.js
Kemudian terapkan file yang Anda sukai:
git checkout stash@{1} -- <filename>
atau seluruh folder:
git checkout stash@{1} /errors
Ini juga berfungsi tanpa --
tetapi disarankan untuk menggunakannya. Lihat posting ini .
Juga konvensional untuk mengenali tanda hubung ganda sebagai sinyal untuk menghentikan interpretasi opsi dan memperlakukan semua argumen berikut secara harfiah.
git stash pop
menyebabkan kesalahan pada file yang tidak terlacak. Terima kasih.
Jika Anda git stash pop
(tanpa konflik) itu akan menghapus simpanan setelah diterapkan. Tetapi jika Anda git stash apply
akan menerapkan patch tanpa menghapusnya dari daftar simpanan. Kemudian Anda dapat mengembalikan perubahan yang tidak diinginkan dengangit checkout -- files...
git stash pop
dan ADA konflik, Anda harus memperbaikinya secara manual dan simpanan TIDAK akan dihapus.
Satu lagi cara:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
atau show
akan menimpa file Anda secara buta alih-alih hanya menerapkan perubahan. "Satu lagi jalan" adalah pernyataan yang meremehkan.
path/to/file2
Anda inginkan berbeda dengan file yang sama di ruang kerja Anda. Meninggalkan jalan kedua berfungsi baik untukku. - Dan saya mendapatkan pesan kesalahan menggunakan -R
opsi ("terapkan tambalan secara terbalik", mencoba menambal versi simpanan ?!). Jadi versi kerja saya terlihat seperti git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Untuk pengguna Windows: kurung kurawal memiliki arti khusus di PowerShell. Anda bisa mengelilinginya dengan tanda kutip tunggal atau melarikan diri dengan backtick. Sebagai contoh:
git checkout 'stash@{0}' YourFile
Tanpa itu, Anda mungkin menerima kesalahan:
Unknown switch 'e'