Apakah ada cara saya bisa menyembunyikan hanya perubahan bertahap saya? Skenario saya mengalami masalah adalah ketika saya telah mengerjakan beberapa bug pada waktu tertentu, dan memiliki beberapa perubahan yang tidak dipentaskan. Saya ingin dapat mem-stage file-file ini satu per satu, membuat file .patch saya, dan menyimpannya hingga kode disetujui. Dengan cara ini, ketika disetujui saya dapat menyimpan seluruh sesi saya saat ini, pop bug itu dan dorong kode tersebut.
Apakah saya salah tentang hal ini? Apakah saya salah paham bagaimana git dapat bekerja dengan cara lain untuk menyederhanakan proses saya?
Jawaban:
Ya, Ini mungkin dengan STASH GANDA
git stash --keep-index
. Perintah ini akan membuat simpanan dengan SEMUA perubahan Anda ( bertahap dan tidak bertahap ), tetapi akan meninggalkan perubahan bertahap di direktori kerja Anda (masih dalam keadaan bertahap).git stash push -m "good stash"
"good stash"
telah dipentaskan .Sekarang jika Anda memerlukan file yang belum dipentaskan sebelum disimpan, cukup terapkan simpanan pertama ( yang dibuat dengan
--keep-index
) dan sekarang Anda dapat menghapus file yang Anda simpan"good stash"
.Nikmati
sumber
-u
sakelar.git stash apply --index
opsi unstages perubahan Anda gunakan . Ini akan mencoba untuk menjaga status un (bertahap) Anda. Lebih mudah untuk menghapus perubahan yang tidak diinginkan dari pohon yang bekerja sekarang.Dengan git terbaru, Anda dapat menggunakan
--patch
opsiDan git akan meminta Anda untuk setiap perubahan pada file Anda untuk ditambahkan atau tidak menjadi simpanan.
Anda hanya menjawab
y
ataun
Alias UPD untuk DOUBLE STASH :
Sekarang Anda dapat mengatur file Anda dan kemudian jalankan
git stash-staged
.Akibatnya file yang dipentaskan Anda akan disimpan ke simpanan .
Jika Anda tidak ingin menyimpan file yang dipentaskan dan ingin memindahkannya ke simpanan. Kemudian Anda dapat menambahkan alias lain dan menjalankan
git move-staged
:sumber
-u|--include-untracked
opsigit-stash
Saya membuat skrip yang menyimpan hanya apa yang saat ini dipentaskan dan meninggalkan yang lainnya. Ini luar biasa ketika saya mulai membuat terlalu banyak perubahan yang tidak terkait. Cukup tahap apa yang tidak terkait dengan komit yang diinginkan dan simpanan saja.
(Terima kasih kepada Bartłomiej untuk titik awalnya)
sumber
Berikut ini adalah kalimat sederhana:
Dan untuk menambahkan pesan cukup:
sumber
Untuk mencapai hal yang sama ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Ledakan. File yang tidak Anda inginkan disimpan. Semua file yang Anda inginkan sudah siap untuk Anda.
sumber
Dalam skenario ini, saya lebih suka membuat cabang baru untuk setiap masalah. Saya menggunakan awalan temp / jadi saya tahu bahwa saya bisa menghapus cabang ini nanti.
Tahap file yang memperbaiki bug1 dan komit.
Anda kemudian dapat memilih komitmen dari cabang masing-masing sesuai kebutuhan dan mengirimkan permintaan tarik.
sumber
Mengapa Anda tidak melakukan perubahan untuk bug tertentu dan membuat tambalan dari komit itu dan pendahulunya?
Kemudian, untuk membuat tambalan yang sesuai, gunakan
git format-patch
:Ini akan membuat dua file:
0001-fix-bug-123.patch
dan0002-fix-bug-321.patch
Atau Anda dapat membuat cabang terpisah untuk setiap bug, sehingga Anda dapat menggabungkan atau mengganti perbaikan bug secara terpisah, atau bahkan menghapusnya, jika mereka tidak berhasil.
sumber
git stash --keep-index
adalah solusi yang baik ... kecuali itu tidak bekerja dengan benar di jalur yang telah dihapus, yang telah diperbaiki di Git 2.23 (Q3 2019)Lihat komit b932f6a (16 Jul 2019) oleh Thomas Gummerer (
tgummerer
) .(Digabung oleh Junio C Hamano -
gitster
- di commit f8aee85 , 25 Jul 2019)sumber
Menyimpan hanya indeks (perubahan bertahap) di Git lebih sulit dari yang seharusnya. Saya telah menemukan jawaban @ Joe untuk bekerja dengan baik, dan mengubah sedikit variasi menjadi alias ini:
Ini mendorong baik perubahan bertahap dan tidak bertahap menjadi simpanan sementara, meninggalkan perubahan bertahap. Itu kemudian mendorong perubahan bertahap ke simpanan, yang merupakan simpanan yang ingin kita pertahankan. Argumen diteruskan ke alias, seperti
--message "whatever"
akan ditambahkan ke perintah simpanan ini. Akhirnya, muncul simpanan sementara untuk mengembalikan keadaan semula dan menghapus simpanan sementara, dan akhirnya "menghapus" perubahan simpanan dari direktori kerja melalui aplikasi tambalan terbalik.Untuk masalah sebaliknya dari menyembunyikan hanya perubahan yang tidak dipentaskan (alias
stash-working
) lihat jawaban ini .sumber
Apakah benar-benar perlu untuk mengerjakan beberapa bug sekaligus? Dan dengan "sekaligus," maksud saya "memiliki file yang diedit untuk beberapa bug pada saat yang sama." Karena kecuali Anda benar-benar membutuhkan itu, saya hanya akan mengerjakan satu bug pada satu waktu di lingkungan Anda. Dengan begitu Anda dapat menggunakan cabang & rebase lokal, yang menurut saya jauh lebih mudah daripada mengelola simpanan / panggung yang kompleks.
Katakanlah master ada di commit B. Sekarang kerjakan bug # 1.
Sekarang Anda menggunakan bug1 cabang. Buat beberapa perubahan, komit, tunggu ulasan kode. Ini bersifat lokal, jadi Anda tidak memengaruhi orang lain, dan itu seharusnya cukup mudah untuk membuat tambalan dari git diffs.
Sekarang Anda sedang mengerjakan bug2. Pergi kembali ke master dengan
git checkout master
. Buat cabang barugit checkout -b bug2
,. Buat perubahan, komit, tunggu ulasan kode.Mari kita berpura-pura bahwa orang lain melakukan E & F pada master saat Anda sedang menunggu peninjauan.
Ketika kode Anda disetujui, Anda dapat mengaktifkannya kembali untuk menguasainya dengan langkah-langkah berikut:
Ini akan menghasilkan sebagai berikut:
Kemudian Anda dapat mendorong, menghapus cabang bug1 lokal Anda, dan pergilah. Satu bug pada satu waktu di ruang kerja Anda, tetapi dengan menggunakan cabang lokal repositori Anda dapat menangani beberapa bug. Dan ini menghindari tarian panggung / simpanan yang rumit.
Jawab pertanyaan ctote di komentar:
Nah, Anda dapat kembali menyimpan untuk setiap bug, dan hanya bekerja dengan satu bug pada satu waktu. Atleast yang menyelamatkan Anda dari masalah pementasan. Tetapi setelah mencoba ini, saya pribadi merasa merepotkan. Stash agak berantakan dalam grafik log git. Dan yang lebih penting, jika Anda mengacaukan sesuatu, Anda tidak dapat kembali. Jika Anda memiliki direktori kerja yang kotor dan Anda menghapus simpanan, Anda tidak dapat "membatalkan" pop itu. Jauh lebih sulit untuk mengacaukan komitmen yang sudah ada.
Jadi
git rebase -i
.Ketika Anda rebase satu cabang ke cabang lain, Anda bisa melakukannya secara interaktif (flag -i). Ketika Anda melakukan ini, Anda memiliki opsi untuk memilih apa yang ingin Anda lakukan dengan setiap komit. Pro Git adalah buku yang luar biasa yang juga online dalam format HTML, dan memiliki bagian yang bagus tentang rebasing & squashing:
http://git-scm.com/book/ch6-4.html
Saya akan mencuri contoh kata demi kata mereka untuk kenyamanan. Berpura-puralah Anda memiliki riwayat komit berikut, dan Anda ingin rebase & squash bug1 ke master:
Inilah yang akan Anda lihat ketika Anda mengetik
git rebase -i master bug1
Untuk menekan semua komit dari cabang ke dalam komit tunggal, pertahankan komit pertama sebagai "pilih" dan ganti semua entri "pilih" selanjutnya dengan "squash" atau cukup "s". Anda akan mendapatkan kesempatan untuk mengubah pesan komit juga.
Jadi ya, meremasnya agak menyebalkan, tapi saya masih akan merekomendasikannya karena terlalu banyak menggunakan simpanan.
sumber
git checkout master; git checkout -b bug2
bisa disingkat menjadigit checkout -b bug2 master
. Hal yang sama berlaku untukgit checkout bug1; git rebase master; git checkout master; git merge bug1
, yang identik dengangit rebase master bug1; git push . bug1:master
(memang,push
triknya tidak jelas)Dari komentar Anda kepada Mike Monkiewicz, saya sarankan untuk menggunakan model yang lebih sederhana: Gunakan cabang pengembangan reguler, tetapi gunakan opsi squash penggabungan untuk mendapatkan satu komit di cabang master Anda:
Keuntungan dari prosedur ini adalah Anda dapat menggunakan alur kerja normal git.
sumber
Setelah membuat alias:
Berikut
git diff
mengembalikan daftar--staged
file--name-only
Dan kemudian kami melewati daftar ini sebagai
pathspec
untukgit stash
commad.Dari
man git stash
:sumber
Untuk memangkas perubahan yang tidak disengaja, terutama penghapusan beberapa file, lakukan hal berikut:
dengan kata lain, simpel sampah itu dan buang semuanya bersama simpanan itu.
Diuji dalam git versi 2.17.1
sumber