Kesalahan saat mengubah ke cabang master: perubahan lokal saya akan ditimpa oleh pembayaran

128

Pertanyaan ini mirip dengan pertanyaan ini , tetapi lebih spesifik.

Saya memiliki proyek dengan dua cabang ( stagingdan beta).

Saya mengembangkan staging, dan menggunakan mastercabang untuk memperbaiki bug. Jadi jika saya sedang mengerjakan pementasan dan saya melihat kesalahan, saya mengubah ke mastercabang:

git checkout master

dan lakukan hal-hal:

git add fileToAdd
git commit -m "bug fixed"

dan kemudian saya menggabungkan dengan kedua cabang:

git checkout staging
git merge master
git checkout beta
git merge beta

Dan tidak masalah jika ada file lain di pohon kerja.

Tetapi sekarang, ketika saya mencoba untuk mengubah ke mastercabang, saya mendapatkan kesalahan :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Saya pikir saya harus menghapus file dari area pementasan:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

tapi saya mendapatkan kesalahan yang sama. Jika saya melakukan git statussaya mendapatkanNo changes to commit

Manolo
sumber
4
Apakah Anda mencoba reset --hard? Jika Anda benar-benar yakin ingin membuang perubahan Anda. Atau gunakan simpanan jika tidak.
keltar
@keltar - Tidak. Saya tidak ingin membuang perubahan saya. Simpan saja di pohon kerja untuk komitmen nanti
Manolo
1
Saya tidak berpikir Anda dapat beralih cabang sambil menjaga perubahan yang tidak terikat, tetapi saya bisa dengan mudah salah - bukan bidang saya. Coba git add your-filedan lakukan.
keltar
@keltar - Saya pernah bekerja dengan cara ini sebelumnya. Saya tidak ingin melakukan perubahan apa pun stagingsekarang.
Manolo
Mungkin file bentrok Anda tidak berubah ketika Anda mencobanya sebelumnya. Anda memiliki perubahan, git harus menyimpannya di suatu tempat untuk dipulihkan nanti. Sangat tidak mungkin tidak mungkin tanpa komitmen. Tetapi jika Anda benar-benar tidak ingin - menggunakan simpanan, itulah alasan mengapa itu ada.
keltar

Jawaban:

128

Kesalahan Anda muncul ketika Anda telah mengubah file dan cabang tempat Anda beralih juga memiliki perubahan untuk file ini (dari titik gabungan terbaru).

Pilihan Anda, seperti yang saya lihat, adalah - komit, dan kemudian ubah komit ini dengan perubahan tambahan (Anda bisa memodifikasi komit di git, selama tidak pushdiedit); atau - gunakan simpanan:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash saveakan membuat simpanan yang berisi perubahan Anda, tetapi tidak terkait dengan komit atau bahkan cabang apa pun. git stash popakan menerapkan entri simpanan terbaru ke cabang Anda saat ini, memulihkan perubahan yang disimpan dan menghapusnya dari simpanan.

keltar
sumber
3
Terima kasih. Apakah Anda yakin bahwa ini tidak akan melakukan perubahan apa pun pada pohon kerja saya (bukan file yang ditambahkan)? Saya tidak ingin kehilangan perubahan saya: - /
Manolo
Ups, salah ketik addsaat sebenarnya save.. diperbarui. Maksud Anda, untuk file lain? git stash savetanpa parameter nama file akan menyimpan semua file yang diubah, jika Anda ingin (dan mengembalikannya ke status terakhir-komit). Dan memiliki salinan tambahan dari pohon direktori tidak ada salahnya, tapi saya selalu paranoid tentang itu.
keltar
Masalahnya akan menyimpan semua file yang dimodifikasi kecuali yang ingin saya tambahkan ke mastercabang. Juga, pilihannya adalah popperubahan di cabang lain?
Manolo
Saya tidak yakin apa yang Anda maksud. Ya, Anda dapat menerapkan simpanan di cabang lain, tetapi itu hanya akan mengganti konten file, bukan menggabungkannya.
keltar
1
@Honey itu tidak ada hubungannya dengan cabang, masalahnya adalah perubahan yang tidak terikat. Checkout, menurut definisi, harus mengatur ulang file Anda ke keadaan master, tetapi dengan melakukan itu akan kehilangan kontennya saat ini, dan karena konten ini tidak dilakukan, tidak mungkin untuk kembali ke status ini nanti, karena itu terjadi kesalahan sehingga Anda tidak akan kecewa karena perubahan yang hilang nanti.
keltar
151

Saya mengalami masalah yang sama dan menyelesaikannya dengan

git checkout -f branch

dan spesifikasinya agak jelas.

-f, --force

Saat berpindah cabang, lanjutkan meskipun indeks atau pohon kerja berbeda dari HEAD. Ini digunakan untuk membuang perubahan lokal.

Saat memeriksa jalur dari indeks, jangan gagal pada entri yang tidak digabungkan; sebaliknya, entri yang tidak digabungkan akan diabaikan.

KikiYu
sumber
7
Ketika git saya macet (tidak ada perubahan lokal tetapi masih kesalahan itu), solusi ini membantu saya!
Lukas
6
Terima kasih, Anda menyelamatkan layar saya agar tidak mengepal.
Burung Hantu
3
Saya kehilangan perubahan saya seperti itu
Jacek Dziurdzikowski
1
Ya, Anda akan kehilangan perubahan dengan melakukan ini, ini harus disertai dengan peringatan besar.
Alexander Mills
Saya ingin sebaliknya. master ada di belakang cabang saya dan saya sudah mengetahui informasi terbaru tentang master tetapi masih tidak dapat berpindah cabang. Pasti bug git.
jgmjgm
12

Anda dapat memaksa checkout cabang Anda, jika Anda tidak ingin mengkomit perubahan lokal Anda.

git checkout -f branch_name
Deepika Patel
sumber
1
Tidak sudoperlu, itu hanya akan merusak izin file. Itu adalah perintah git yang sama seperti yang diposting oleh @kiki_yu satu tahun sebelumnya, tetapi bahkan lebih buruk.
kenorb
2
Saya kehilangan perubahan saya seperti itu
Jacek Dziurdzikowski
2
@JacekDziurdzikowski Jadi, Anda kehilangan perubahan dua kali (lihat komentar di jawaban kiki_yu), keduanya dengan menerapkan solusi yang secara eksplisit menyebutkan bahwa membuang perubahan lokal adalah tujuannya . Apakah detektor sarkasme saya rusak atau ... Anda serius?
RomainValeri
@RomainValeri Hmm, saya rasa itu cara saya memperingatkan orang lain yang pemula dengan git (mereka harus menjadi pemula jika membaca posting ini) agar siap untuk mengucapkan selamat tinggal pada setiap perubahan yang mereka buat. Saya pikir waktu itu perubahan yang dilakukan di satu cabang harus tetap di cabang itu sampai saya membayarnya lagi. Petunjuk untuk pendatang baru yang juga berpikir seperti itu: gunakan git simpanan :)
Jacek Dziurdzikowski
Jawaban ganda, tanpa alasan. Jawaban pertama memiliki lebih banyak informasi.
MAChitgarha
9

Saya mengalami masalah yang sama dan menyelesaikannya dengan

git checkout -f branch

Hati-hati dengan -fsakelar. Anda akan kehilangan semua perubahan yang tidak mengikat jika Anda menggunakan -fsakelar. Meskipun mungkin ada beberapa kasus penggunaan yang berguna untuk digunakan -f, dalam banyak kasus, Anda mungkin ingin stashmengubah dan kemudian switchbercabang. The stashingprosedur yang dijelaskan di atas.

BeNiza
sumber
0

Anda dapat mengkomit di cabang saat ini, melakukan checkout ke cabang lain, dan akhirnya memilih ceri komit itu (sebagai pengganti penggabungan).

Vitaly Zdanevich
sumber
Akan lebih membantu jika Anda memberikan penjelasan lebih lanjut tentang ini.
MAChitgarha
-1

Jika Anda mendapatkan ini saat mencoba memeriksa cabang yang berbeda:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Ini berarti Anda memiliki beberapa perubahan yang perlu Anda lakukan pada cabang yang telah Anda periksa - atau Anda perlu menghapus atau menyimpannya seperti yang ditunjukkan sebagian besar poin di atas. 19 dari 20 kali saya jauh lebih cenderung hanya melakukan perubahan saya.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Sekarang setelah Anda selesai melakukannya, Anda dapat memeriksa cabang lain dan beralih bolak-balik dengan cukup mudah.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Pastikan Anda berdua berada di cabang kanan dan mendorong ke cabang kanan saat Anda menjalankan perintah git push origin $ {branch}. Catatan: jika proyek Anda terhubung langsung ke Intellij, Anda dapat melihat bahwa Anda mengubah cabang Anda di sudut kanan bawah jendela utama.

Tony Fraser
sumber