Konteks: Saya sedang mengerjakan master menambahkan fitur sederhana. Setelah beberapa menit saya menyadari itu tidak begitu sederhana dan seharusnya lebih baik bekerja di cabang baru.
Ini selalu terjadi pada saya dan saya tidak tahu bagaimana cara beralih ke cabang lain dan mengambil semua perubahan yang tidak dikomit ini dengan saya meninggalkan cabang master bersih. Saya seharusnya git stash && git stash branch new_branch
hanya mencapai itu, tetapi inilah yang saya dapatkan:
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Apakah Anda tahu jika ada cara untuk mencapai ini?
Jawaban:
Tidak perlu disimpan.
tidak menyentuh perubahan lokal Anda. Itu hanya membuat cabang dari KEPALA saat ini dan mengatur KEPALA di sana. Jadi saya kira itulah yang Anda inginkan.
--- Edit untuk menjelaskan hasil master checkout ---
Apakah Anda bingung karena
checkout master
tidak membuang perubahan Anda?Karena perubahan hanya bersifat lokal, git tidak ingin Anda kehilangannya terlalu mudah. Saat mengganti cabang, git tidak menimpa perubahan lokal Anda. Hasil dari Anda
checkout master
adalah:, yang berarti file kerja Anda tidak bersih. git memang mengubah HEAD, tetapi tidak menimpa file lokal Anda. Itulah sebabnya status terakhir Anda masih menunjukkan perubahan lokal, meskipun Anda aktif
master
.Jika Anda benar-benar ingin membuang perubahan lokal, Anda harus memaksa checkout
-f
.Karena perubahan Anda tidak pernah dilakukan, Anda akan kehilangan mereka.
Cobalah untuk kembali ke cabang Anda, komit perubahan Anda, lalu checkout master lagi.
Anda harus mendapatkan
M
pesan setelah checkout pertama, tetapi kemudian tidak lagi setelahcheckout master
, dangit status
seharusnya tidak menunjukkan file yang dimodifikasi.--- Edit untuk menghapus kebingungan tentang direktori kerja (file lokal) ---
Sebagai jawaban atas komentar pertama Anda, perubahan lokal hanya ... baik, lokal. Git tidak menyimpannya secara otomatis, Anda harus mengatakannya untuk menyimpannya nanti. Jika Anda melakukan perubahan dan tidak secara eksplisit melakukan atau menyembunyikannya, git tidak akan membuat versinya. Jika Anda mengubah HEAD (
checkout master
), perubahan lokal tidak ditimpa sejak tidak disimpan.sumber
git checkout
"Memperbarui file di pohon yang bekerja untuk mencocokkan versi dalam indeks atau pohon yang ditentukan.". Itu mengasumsikan perubahan Anda dalam sistem file Anda akan PERGI setelah itu. Tanpa ada kesempatan untuk mendapatkannya kembali. Bahkan jika Anda mengatakan mereka tidak mau, ini masih meninggalkan perasaan yang sangat buruk. Saya tidak percaya ini sama sekali . Entah dokumentasinya benar-benar buruk atau perilaku default git benar-benar berbahaya. Orang tidak harus percaya pada beberapa heuristik "automagic" untuk mendeteksi bahwa dalam hal ini Anda tidak ingin kehilangan perubahan Anda.checkout
tidak bertentangan dengan perubahan lokal Anda, checkout berfungsi dan meninggalkan perubahan lokal sendiri. Saya mengerti perasaan buruk, halaman manual mungkin harus mengatakan "Pembaruan file yang tidak dimodifikasi di pohon kerja". Git tidak di sisi lain membuatnya terlalu mudah untuk kehilangan perubahan lokal.git checkout
baik membiarkan perubahan lokal Anda sendiri, atau menolak jika ada konflik.git checkout <other_branch> -f
. Anda akan kehilangan perubahan lokal tanpa peringatan.Mencoba:
sumber
Dua hal yang dapat Anda lakukan:
atau
(
git checkout -
<- tanda hubung adalah jalan pintas untuk cabang sebelumnya yang Anda kunjungi)(
git stash -u
<--u
cara itu juga membutuhkan perubahan yang tidak dipentaskan)sumber
Jika Anda menggunakan klien GitHub Windows (seperti saya) dan Anda berada dalam situasi membuat perubahan tanpa komitmen yang ingin Anda pindahkan ke cabang baru, Anda dapat dengan mudah "Membuat cabang baru" melalui klien GitHub. Ini akan beralih ke cabang yang baru dibuat dan menyimpan perubahan Anda.
sumber
Jika Anda ingin perubahan yang tidak dikomit saat ini di cabang saat ini pindah ke cabang baru, gunakan perintah berikut untuk membuat cabang baru dan salin perubahan yang tidak dikomit secara otomatis.
Ini akan membuat cabang baru dari cabang Anda saat ini (dengan anggapan sebagai master), salin perubahan yang tidak dikomit dan beralih ke cabang baru.
Komit perubahan Anda ke cabang baru.
Karena, cabang baru dibuat, sebelum mendorongnya ke jarak jauh, Anda perlu mengatur upstream. Gunakan perintah di bawah ini untuk mengatur upstream dan mendorongnya ke jarak jauh.
Setelah Anda menekan perintah ini, cabang baru akan dibuat di remote dan cabang lokal baru Anda akan didorong ke remote.
Sekarang, jika Anda ingin membuang perubahan yang tidak dikomit dari cabang master, gunakan:
Ini akan membuang perubahan lokal yang tidak dikomit saat checkout.
sumber
Di klien GitHub terbaru untuk Windows , jika Anda memiliki perubahan yang tidak dikomit, dan pilih untuk membuat cabang baru.
Ini meminta Anda bagaimana menangani skenario yang tepat ini:
Hal yang sama berlaku jika Anda hanya mengganti cabang juga.
sumber