git switch branch tanpa membuang perubahan lokal

182

Baiklah, katakanlah suatu hari kita membuat banyak modifikasi dan ketika kita berkomitmen, kita perhatikan kita sedang mengerjakan cabang yang salah.

Bagaimana kita bisa memaksa git untuk berganti cabang tanpa membuang perubahan lokal .

Saya mungkin akan membahas hal ini dengan cara yang naif sementara saya menunggu jawaban, tetapi saya ingin tahu apakah ada prosedur yang benar karena saya akan berbohong jika saya mengatakan ini belum terjadi pada saya sebelumnya ...

  • Cadangkan repo yang diubah
  • git reset --hard
  • git checkout right-branch
  • Kembalikan perubahan
  • git commit -m "changes"
megawac
sumber

Jawaban:

343

Ada banyak cara berbeda tergantung pada seberapa jauh Anda berada dan cabang mana yang Anda inginkan.

Mari kita lakukan kesalahan klasik:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

Jadi sekarang Anda ingin perubahan ini, yang Anda belum berkomitmen untuk master, aktif develop.

  1. Jika Anda tidak memiliki sebuah developbelum, metode ini sepele:

    $ git checkout -b develop
    

    Ini menciptakan developcabang baru mulai dari manapun Anda berada sekarang. Sekarang Anda dapat melakukan dan hal-hal baru sudah aktif develop.

  2. Anda memiliki sebuah develop. Lihat apakah Git akan membiarkan Anda beralih tanpa melakukan apa pun:

    $ git checkout develop
    

    Ini akan berhasil, atau mengeluh. Jika berhasil, bagus! Komit saja. Jika tidak ( error: Your local changes to the following files would be overwritten ...), Anda masih memiliki banyak opsi.

    Mungkin yang termudah adalah git stash(karena semua jawaban lain yang mengalahkan saya untuk mengklik postkata). Jalankan git stash saveatau git stash push, 1 atau sekadar polos git stashyang merupakan kependekan dari save/ push:

    $ git stash
    

    Ini mengkomit kode Anda (ya, itu benar-benar membuat komit) menggunakan metode non-branch-y yang aneh. Komit yang dibuatnya bukan "on" cabang apa pun tetapi sekarang disimpan dengan aman di repositori, jadi Anda sekarang dapat beralih cabang, lalu "menerapkan" simpanan:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    Jika semuanya berjalan dengan baik, dan Anda menyukai hasilnya, Anda harus git stash dropmenyimpannya. Ini menghapus referensi ke commit non-branch-y yang aneh. (Mereka masih dalam repositori, dan kadang-kadang dapat diambil dalam keadaan darurat, tetapi untuk sebagian besar tujuan, Anda harus menganggap mereka hilang pada saat itu.)

The applylangkah melakukan penggabungan perubahan disembunyikan, menggunakan mesin merge Git yang kuat yang mendasari, hal yang sama menggunakan ketika Anda melakukan penggabungan cabang. Ini berarti Anda bisa mendapatkan "gabungkan konflik" jika cabang yang Anda kerjakan secara tidak sengaja, cukup berbeda dari cabang yang Anda maksudkan sedang dikerjakan. Jadi ide yang baik untuk memeriksa hasilnya dengan cermat sebelum Anda menganggap bahwa simpanan diterapkan dengan bersih, bahkan jika Git sendiri tidak mendeteksi adanya konflik gabungan.

Banyak orang menggunakan git stash pop, yang merupakan kependekan dari git stash apply && git stash drop. Sejauh ini tidak apa-apa, tetapi itu berarti bahwa jika aplikasi menghasilkan kekacauan, dan Anda memutuskan Anda tidak ingin melanjutkan jalan ini, Anda tidak bisa mendapatkan simpanan kembali dengan mudah. Itu sebabnya saya merekomendasikan applyhasil yang terpisah , periksa, drophanya jika / ketika puas. (Ini tentu saja memperkenalkan titik lain di mana Anda dapat mengambil rehat kopi lagi dan melupakan apa yang Anda lakukan, kembali, dan melakukan hal yang salah , jadi itu bukan obat yang sempurna.)


1 The savedi git stash saveadalah kata kerja tua untuk menciptakan simpanan baru. Git versi 2.13 memperkenalkan kata kerja baru untuk membuat hal-hal lebih konsisten dengan popdan untuk menambahkan lebih banyak opsi ke perintah penciptaan. Git versi 2.16 secara resmi menghentikan kata kerja yang lama (meskipun masih bekerja di Git 2.23, yang merupakan rilis terbaru pada saat saya mengedit ini).

torek
sumber
3
Bagaimana jika saya ingin beralih ke cabang lain tanpa berkomitmen ke cabang saat ini (mis. Perubahan belum selesai) dan kemudian beralih kembali untuk melanjutkan?
stt106
@ stt106: Anda masih harus berkomitmen, tetapi Anda bisa melakukannya, seperti dalam jawaban ini dan lainnya, melalui git stashsehingga komit — karena git stash, Anda mendapatkan dua komit per entri simpanan, dalam pengaturan yang tidak biasa — tidak ada cabang. Namun, kecuali untuk kasus khusus jangka pendek, saya biasanya lebih suka membuat komit normal. Anda bisa git reset --softatau git reset --mixednanti, atau menggunakannya git commit --amenduntuk mendorongnya ke samping, ketika Anda kembali bekerja di cabang itu. (Dalam Git modern, Anda juga dapat menggunakan git worktree add, yang mungkin merupakan solusi yang lebih baik.)
torek
"Ini akan berhasil, atau mengeluh." Mana yang akan menjadi alasan kesuksesan atau kesalahan saat melakukan checkout?
nanocv
semua perubahan lokal saya hilang ketika saya beralih dengan langkah-langkah di atas saya berada di cabang <a> dan melakukan perubahan saya dan saya ingin pindah ke <b> cabang dan mendorong semua perubahan saya di sana. ketika saya melakukan simpanan git dan pindah ke cabang lain itu menarik semua file cabang <b> dan perubahan lokal saya hilang
Mukul Munjal
38

Gunakan simpanan git

git stash

Ini mendorong perubahan ke stack. Saat Anda ingin menariknya, gunakan kembali

 git stash apply

Anda bahkan dapat menarik item individual. Untuk sepenuhnya menerbangkan simpanan:

 git stash clear
sinar
sumber
7
Perintah terakhir mungkin seharusnya git stash drop; git stash clearakan menghapus seluruh tumpukan simpanan, termasuk simpanan yang mungkin tidak terkait dengan set perintah ini.
Leland
15
  • git stash untuk menyimpan perubahan yang tidak dikomit
  • git stash list untuk daftar simpanan simpanan Anda yang tidak disimpan
  • git stash apply stash@{x} di mana x dapat 0,1,2..tidak ada simpanan yang telah Anda buat
patah kaki
sumber
4

Anda dapat:

  • Gunakan git stashuntuk menyimpan perubahan Anda atau,

  • Buat cabang lain dan komit perubahan Anda di sana, lalu gabungkan cabang itu ke direktori kerja Anda

X3074861X
sumber