memindahkan file yang diubah ke cabang lain untuk check-in

422

Ini sering terjadi pada saya: Saya menulis beberapa kode, pergi untuk memeriksa perubahan saya, dan kemudian menyadari bahwa saya tidak berada di cabang yang tepat untuk memeriksa perubahan itu. Namun saya tidak dapat beralih ke cabang lain tanpa perubahan saya kembali. Apakah ada cara untuk memindahkan perubahan ke cabang lain untuk diperiksa di sana?

mainsocial
sumber

Jawaban:

751

git stash adalah temanmu

Jika Anda belum membuat komit, jalankan saja git stash. Ini akan menyimpan semua perubahan Anda.

Beralih ke cabang tempat Anda ingin perubahan itu berjalan dan dijalankan git stash pop.

Ada banyak kegunaan untuk simpanan git. Ini tentu saja salah satu alasan yang lebih berguna.

Sebuah contoh:

# work on some code
git stash
git checkout correct-branch
git stash pop
Bill Door
sumber
122
Tidak perlu menyembunyikan perubahan yang tidak dikomit, mereka akan pergi bersama Anda saat Anda memeriksa cabang. Stash lebih untuk penyimpanan jangka panjang untuk hal-hal sementara (hal-hal yang ingin Anda selesaikan dan komit nanti, tetapi Anda perlu melakukan hal lain sekarang).
Tekkub
2
Saya mengerti. Jadi saya harus menyembunyikan, beralih cabang dan kemudian muncul C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS
3
@Tekkub "penyimpanan jangka panjang untuk hal-hal sementara" yang mengatakan terasa sangat canggung, titik lain untuk menggunakan simpanan adalah mendorongnya dalam tumpukan jadi jika Anda tidak ingin membawanya ke atas dan mengerjakan sesuatu yang lain itu berguna dengan cara itu . Ya, Anda tidak harus tetapi hanya merasa lebih bersih dan lebih terkendali.
Atherion
bravo sayang! harus menambahkan apa yang harus Anda lakukan jika Anda membuat komitmen
Ishan Srivastava
2
@Tekkub Itu hanya berlaku jika cabang yang Anda pindahkan sudah mutakhir dengan cabang tempat Anda berada. Jika misalnya Anda secara tidak sengaja bekerja di cabang prod dan perlu beralih ke cabang tahap tetapi tahap telah berubah dalam simpanan waktu rata-rata adalah satu-satunya cara untuk melakukan peralihan.
danielson317
248

Jika Anda belum melakukan perubahan , cukup gunakan git checkoutuntuk pindah ke cabang baru dan kemudian lakukan secara normal - perubahan pada file tidak terikat ke cabang tertentu sampai Anda melakukan itu.

Jika Anda telah sudah berkomitmen perubahan Anda:

  1. Ketik git logdan ingat SHA dari komit yang ingin Anda pindahkan.
  2. Periksa cabang yang ingin Anda pindahkan komit.
  3. Ketik git cherry-pick SHAmengganti SHA dari atas.
  4. Beralih kembali ke cabang asli Anda.
  5. Gunakan git reset HEAD~1untuk mengatur ulang kembali sebelum komit salah cabang Anda.

cherry-pick mengambil komit yang diberikan dan menerapkannya ke kepala yang saat ini sedang diperiksa, sehingga memungkinkan Anda untuk menyalin komit ke cabang baru.

Amber
sumber
9
Anda bahkan tidak perlu memilih sakura di sini. git reset HEAD~N --softdan kemudian git checkout -buntuk memindahkan semua kode yang sekarang tidak berkomitmen ke cabang baru.
Aaron
19
perubahan pada file tidak terikat pada cabang tertentu sampai Anda mengkomitnya. <- ini. Ini memecahkan misteri bagi saya. Terima kasih.
Tschallacka
8
Saya mendapatkan kesalahan berikut ketika mencoba untuk beralih cabang: "perubahan lokal ke file berikut akan ditimpa oleh checkout". Jadi, sepertinya saya tidak bisa pindah ke cabang lain dan melakukan secara normal.
Mischa
3
@Mischa tidak berfungsi jika Anda beralih di antara dua cabang yang memiliki sejarah berbeda
watashiSHUN
1
@ Harun itu jauh lebih baik (untuk skenario pasca-komit)! Tolong buat jawaban yang terpisah.
Jacktose
16

Sayangnya ini terjadi pada saya secara teratur juga dan saya menggunakan git stashjika saya menyadari kesalahan saya sebelumnya git commitdan menggunakan git cherry-picksebaliknya, kedua perintah dijelaskan dengan cukup baik di jawaban lain

Saya ingin menambahkan klarifikasi untuk git checkout targetBranch: perintah ini hanya akan mempertahankan direktori kerja Anda dan melakukan snapshot jika targetBranch memiliki sejarah yang sama dengan cabang Anda saat ini

Jika Anda belum melakukan perubahan, cukup gunakan checkout git untuk pindah ke cabang baru dan kemudian lakukan secara normal

Pernyataan Amber tidak salah, ketika Anda pindah ke newBranch ,, git checkout -b newBranchpointer baru dibuat dan menunjuk ke komit yang sama persis dengan cabang Anda saat ini.
Bahkan, jika Anda memiliki cabang lain yang membagikan sejarah dengan cabang Anda saat ini (keduanya sama-sama komit), Anda dapat "memindahkan perubahan Anda" dengangit checkout targetBranch

Namun, biasanya cabang yang berbeda berarti sejarah yang berbeda, dan Git tidak akan memungkinkan Anda untuk beralih di antara cabang-cabang ini dengan direktori kerja yang kotor atau area pementasan. dalam hal ini Anda dapat melakukan git checkout -f targetBranch(membersihkan dan membuang perubahan) atau git stage+ git checkout targetBranch(membersihkan dan menyimpan perubahan), hanya menjalankan git checkout targetBranchakan memberikan kesalahan:

kesalahan: Perubahan lokal Anda ke file-file berikut akan ditimpa dengan checkout: ... Silakan lakukan perubahan Anda atau simpan sebelum Anda beralih cabang. Batalkan

watashiSHUN
sumber
5

Sebuah git soft reset akan menempatkan perubahan berkomitmen kembali ke dalam indeks Anda. Selanjutnya, checkout cabang yang ingin Anda komit. Kemudian git melakukan dengan pesan komit baru.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

Dari git docs :

git reset [<mode>] [<commit>]Formulir ini mengatur ulang kepala cabang saat ini ke dan mungkin memperbarui indeks (mengatur ulang ke pohon) dan pohon yang bekerja tergantung pada. Jika dihilangkan, default ke --mixed. Harus salah satu dari yang berikut:

--softTidak menyentuh file indeks atau pohon kerja sama sekali (tetapi me-reset kepala ke, sama seperti semua mode lakukan). Ini membuat semua file Anda yang diubah "Perubahan untuk dikomit", seperti yang dikatakan status git.

JSON C11
sumber