Pertanyaan Hanya menyimpan satu file dari beberapa file yang telah berubah dengan Git?


Bagaimana saya bisa menyimpan hanya satu dari beberapa file yang diubah di cabang saya?


2437
2018-06-14 20:52


asal


Jawaban:


PERINGATAN

Sebagaimana dicatat dalam komentar, ini menempatkan semuanya ke dalam simpanan, baik dipentaskan maupun tidak. The --keep-index hanya meninggalkan indeks sendirian setelah simpanan selesai. Ini dapat menyebabkan konflik gabungan saat nanti Anda mencabut simpanannya.


Ini akan menyimpan semua yang belum Anda tambahkan sebelumnya. Hanya git add hal-hal yang ingin Anda simpan, lalu jalankan.

git stash --keep-index

Misalnya, jika Anda ingin membagi commit lama ke lebih dari satu changeset, Anda dapat menggunakan prosedur ini:

  1. git rebase -i <last good commit>
  2. Tandai beberapa perubahan sebagai edit.
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Perbaiki hal-hal seperlunya. Jangan lupa untuk git add ada perubahan.
  7. git commit
  8. git stash pop
  9. Ulangi, dari # 5, jika perlu.
  10. git rebase --continue

1216
2017-11-30 21:28



Anda juga bisa menggunakan git stash save -p "my commit message". Dengan cara ini Anda dapat memilih bakhil mana yang harus ditambahkan ke simpanan, seluruh file dapat dipilih juga.

Anda akan diminta dengan beberapa tindakan untuk setiap bingkah:

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help

2612
2017-07-31 11:59



Karena git pada dasarnya tentang mengelola semua repositori konten dan indeks (dan bukan satu atau beberapa file), git stash penawaran, tidak mengherankan, dengan semua direktori kerja.

Sebenarnya, sejak Git 2.13 (Q2 2017), Anda dapat menyimpan file individual, dengan:

git stash push [--] [<pathspec>...]

Lihat "Perubahan simpanan ke file tertentu" untuk lebih.


Jawaban asli (di bawah, Juni 2010) adalah tentang memilih secara manual apa yang ingin Anda simpulkan.

Casebash komentar:

Ini (itu stash --patch solusi asli) bagus, tetapi sering saya telah memodifikasi banyak file sehingga menggunakan patch sangat mengganggu

bukzor's menjawab (upvoted, November 2011) menyarankan solusi yang lebih praktis, berdasarkan
git add + git stash --keep-index.
Pergi lihat dan upvote jawabannya, yang seharusnya menjadi jawaban resmi (bukan milik saya).

Tentang opsi itu, chhh menunjukkan alur kerja alternatif di komentar:

kamu harus "git reset --soft"setelah simpanan semacam itu untuk mendapatkan pementasan yang jelas kembali:
  Untuk mencapai keadaan semula - yang merupakan area pementasan yang jelas dan hanya dengan beberapa modulasi yang tidak bertahap, seseorang dapat dengan lembut mengatur ulang indeks untuk mendapatkan (tanpa melakukan apa pun seperti Anda - bukzor - lakukan).


(Jawaban awal Juni 2010: simpanan manual)

Namun, git stash save --patch dapat memungkinkan Anda untuk mencapai stashing parsial Anda setelah:

Dengan --patch, Anda dapat secara interaktif memilih bongkahan dari dalam diff antara KEPALA dan pohon kerja yang akan disembunyikan.
  Entri simpanan dikonstruksi sedemikian rupa sehingga status indeksnya sama dengan status indeks penyimpanan Anda, dan hasil kerjanya hanya berisi perubahan yang Anda pilih secara interaktif. Perubahan yang dipilih kemudian digulirkan kembali dari worktree Anda.

Namun itu akan menyimpan indeks lengkap (yang mungkin bukan yang Anda inginkan karena mungkin termasuk file lain yang sudah diindeks), dan sebagian worktree (yang bisa terlihat seperti yang Anda ingin simpanan).

git stash --patch --no-keep-index

mungkin lebih cocok.


Jika --patchtidak berfungsi, proses manual mungkin:

Untuk satu atau beberapa file, solusi antara adalah:

  • salin mereka di luar repo Git
    (Sebenarnya, eleotlecram mengusulkan suatu alternatif yang menarik)
  • git stash
  • salin kembali
  • git stash # kali ini, hanya file yang Anda inginkan disimpan
  • git stash pop stash@{1} # Terapkan ulang semua modifikasi file Anda
  • git checkout -- afile # mengatur ulang file ke konten HEAD, sebelum modifikasi lokal

Pada akhir proses yang agak rumit itu, Anda hanya akan memiliki satu atau beberapa file yang disembunyikan.


237
2018-06-14 21:23



Kapan git stash -p (atau git add -p dengan stash --keep-index) akan terlalu rumit, saya merasa lebih mudah digunakan diff, checkout dan apply:

Untuk "menyimpan" file / dir tertentu saja:

git diff path/to/dir > stashed.diff
git checkout path/to/dir

Kemudian sesudahnya

git apply stashed.diff

76
2018-02-12 13:44



Katakanlah Anda memiliki 3 file

a.rb
b.rb
c.rb

dan Anda ingin menyimpan hanya b.rb dan c.rb tetapi tidak a.rb

kamu bisa melakukan sesuatu seperti ini

# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" 

# then stash the other files
git stash save "stash message"

# then undo the previous temp commit
git reset --soft HEAD^
git reset

Dan Anda selesai! HTH.


43
2017-10-31 07:10



Menggunakan git stash push, seperti ini:

git stash push [--] [<pathspec>...]

Sebagai contoh:

git stash push -- my/file.sh

Ini tersedia sejak Git 2.13, dirilis pada musim semi 2017.


33
2017-08-15 13:10



Cara lain untuk melakukan ini:

# Save everything
git stash 

# Re-apply everything, but keep the stash
git stash apply

git checkout <"files you don't want in your stash">

# Save only the things you wanted saved
git stash

# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}

git checkout <"files you put in your stash">

Saya datang dengan ini setelah saya (sekali lagi) datang ke halaman ini dan tidak menyukai dua jawaban pertama (jawaban pertama tidak menjawab pertanyaan dan saya tidak terlalu suka bekerja dengan -p mode interaktif).

Gagasannya sama dengan apa yang disarankan @VonC menggunakan file di luar repositori, Anda menyimpan perubahan yang Anda inginkan di suatu tempat, menghapus perubahan yang tidak Anda inginkan dalam simpanan Anda, dan kemudian menerapkan kembali perubahan yang Anda lepaskan. Namun, saya menggunakan simpanan git sebagai "suatu tempat" (dan sebagai hasilnya, ada satu langkah tambahan di akhir: menghapus cahnge yang Anda masukkan ke dalam simpanan, karena Anda memindahkannya keluar dari jalan juga).


25
2018-02-05 10:16