git: Ganti cabang dan abaikan perubahan apa pun tanpa melakukan


318

Saya sedang mengerjakan cabang git dan siap untuk melakukan perubahan saya, jadi saya membuat komitmen dengan pesan komit yang bermanfaat. Saya kemudian dengan linglung membuat perubahan kecil pada kode yang tidak layak disimpan. Saya sekarang ingin mengganti cabang, tapi git memberi saya,

kesalahan: Anda memiliki perubahan lokal ke "X"; tidak bisa berganti cabang.

Bisakah saya mengganti cabang tanpa melakukan komitmen? Jika demikian, bagaimana saya bisa mengatur ini? Jika tidak, bagaimana cara saya keluar dari masalah ini? Saya ingin mengabaikan perubahan kecil tanpa melakukan dan hanya mengubah cabang.


1
Saya percaya ini hanya terjadi ketika perubahan dilakukan untuk komit tetapi tidak dilakukan? checkout git berfungsi dengan baik untuk mengubah cabang jika Anda belum menentukan file menggunakan git add atau sejenisnya.
Jeremy Wall

1
Hai Jeremy, Apa yang Anda maksud dengan 'dipentaskan'? Memaksa pengguna untuk melakukan file sebelum perubahan cabang sepertinya bukan alur kerja yang hebat. Sebagai contoh, jika saya berada di repositori master dan dengan cepat ingin memeriksa sesuatu di cabang. Saya harus mengkomit kode ke master terlebih dahulu, walaupun kode itu setengah ditulis! Apakah Anda mengatakan bahwa memang, mungkin untuk checkout cabang dalam situasi ini?
Daniel Farrell

@boyfarrell Anda dapat menggunakan 'Git simpanan' untuk sementara menyimpan perubahan tanpa melakukan.
Howiecamp


1
ketika Anda beralih ke cabang tanpa melakukan perubahan di cabang lama, git mencoba untuk menggabungkan perubahan ke file di cabang baru. Jika penggabungan dilakukan tanpa konflik, cabang swithing akan berhasil dan Anda dapat melihat perubahan di cabang baru. Tetapi jika terjadi konflik, Anda akan mendapatkan error: You have local changes to '<filename>'; cannot switch branches.dan cabang tidak akan berubah. Anda bisa melakukannya git checkout -m <branch-name>untuk menggabungkan konflik dan checkout ke cabang dan menyelesaikan konflik sendiri, atau git checkout -f <branch-name>mengabaikan perubahan.
samad montazeri

Jawaban:


400

Anda perlu kondisi bersih untuk mengubah cabang. Checkout cabang hanya akan diizinkan jika tidak mempengaruhi 'file kotor' (seperti komentar Charles Bailey dalam komentar).

Jika tidak, Anda harus:

  • sembunyikan perubahan Anda saat ini atau
  • reset --hard HEAD (jika Anda tidak keberatan kehilangan perubahan kecil itu) atau
  • checkout -f (Saat berganti cabang, lanjutkan bahkan jika indeks atau pohon kerja berbeda dari HEAD. Ini digunakan untuk membuang perubahan lokal.)

Atau, baru-baru ini:

Lanjutkan bahkan jika indeks atau pohon kerja berbeda dari KEPALA.
Baik indeks dan pohon kerja dipulihkan agar sesuai dengan target switching.

Ini berbeda dari git switch -m <branch-name>, yang memicu gabungan tiga arah antara cabang saat ini, konten pohon kerja Anda, dan cabang baru selesai: Anda tidak akan kehilangan pekerjaan Anda yang sedang berlangsung dengan cara itu.


34
"Kamu perlu kondisi bersih untuk mengubah cabang." hanya benar jika perubahan cabang mempengaruhi 'file kotor'.
CB Bailey

10
Untuk metode simpanan, saya mengetik "git stash save", "git checkout otherbranch", lalu akhirnya "git stash pop".
Venkat D.

1
Saat ini saya tidak melihat pesan kesalahan ini, dan perubahan yang saya buat di satu cabang muncul di yang lain ketika saya melakukan "git status". apakah ada yang berubah?
Senthil A Kumar

2
Terima kasih. checkout -f adalah apa yang saya butuhkan. saya melakukan git reset --hard git clean -f git checkout mybranch -f
nologo

1
Ini adalah satu hal hebat yang Git salah dengan melanggar definisi dasar cabang. Tidak seperti git branch berarti dua ruang kerja yang sama sekali berbeda bercabang dari repositori.
nehem

125

Jika Anda ingin membuang perubahan,

git checkout -- <file>
git checkout branch

Jika Anda ingin menyimpan perubahan,

git stash save
git checkout branch
git stash pop

10
Memang apa yang dikatakan Romerun (harus lengkap): git stash save(ketika bekerja di cabang Y) kemudian git checkout branchXlakukan sesuatu git add/commit -mdll git checkout branchYdan git stash popuntuk mendapatkan kembali simpanan
Highmastdon

2
Mungkin begitu. Saya memiliki situasi di mana saya ingin melakukan apa yang dikatakan jawabannya, jika saya memahaminya dengan benar: menyimpan perubahan, beralih dari Y ke X, lalu pop perubahan dan lakukan pada X.
Ben Klein

1
perhatikan bahwa git stash savesekarang sudah usang dalam mendukunggit stash push
Argento

Alias ​​ini menyederhanakan kasus menjaga perubahan saat mengganti cabang.
Tom Hale

62

baik, seharusnya

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
Ya, simpanan adalah global, bukan cabang spesifik, jika saya simpanan pop setelah beralih cabang saya akan mendapatkan simpanan yang sama seperti pada cabang lainnya
Aditya Mittal

6
Harus dicatat git stashakan default kegit stash save
Charlie-Greenman

Terima kasih, ini sangat membantu saya
Govind Kumar


16

Perhatikan bahwa jika Anda telah menggabungkan cabang jarak jauh atau memiliki komit lokal dan ingin kembali ke HEAD jarak jauh, Anda harus melakukan:

git reset --hard origin/HEAD

HEAD sendiri hanya akan merujuk ke komit / penggabungan lokal - beberapa kali saya lupa bahwa ketika mengatur ulang dan berakhir dengan "repositori Anda adalah X berkomitmen di depan .." ketika saya sepenuhnya bermaksud untuk mem-nuke SEMUA perubahan / komitmen dan kembali ke cabang jarak jauh .


9

Jika Anda telah membuat perubahan pada file yang juga perlu diubah Git saat berpindah cabang, itu tidak akan membiarkan Anda. Untuk membuang perubahan yang berfungsi, gunakan:

git reset --hard HEAD

Kemudian, Anda akan dapat berganti cabang.


9

Tidak satu pun dari jawaban ini yang membantu saya karena saya masih memiliki file yang tidak terlacak bahkan setelah diatur ulang dan disimpan. Saya harus melakukan:

git reset --hard HEAD
git clean -d -f

4

beralih ke cabang baru kehilangan perubahan:

git checkout -b YOUR_NEW_BRANCH_NAME --force

beralih ke cabang yang ada kehilangan perubahan:

git checkout YOUR_BRANCH --force

4

Jawaban mudah:

adalah memaksa checkout cabang

git checkout -f <branch_name>

Memaksa memeriksa cabang memberitahu git untuk membatalkan semua perubahan yang Anda buat di cabang saat ini, dan memeriksa yang diinginkan.

atau jika Anda memeriksa komit

git checkout -f <commit-hash>


"Kupikir aku bisa berganti cabang tanpa melakukan. Jika demikian, bagaimana aku bisa mengatur ini? Jika tidak, bagaimana aku keluar dari masalah ini?"

Jawabannya adalah Tidak , itu benar-benar filosofi Git bahwa Anda melacak semua perubahan, dan bahwa setiap node (yaitu komit) harus diperbarui dengan perubahan terbaru yang Anda buat, kecuali Anda sudah membuat komitmen baru tentu saja.


Anda memutuskan untuk menyimpan perubahan?

Kemudian simpanan mereka gunakan

git stash

dan kemudian untuk melepaskan perubahan Anda di cabang yang diinginkan, gunakan

git stash apply

yang akan menerapkan Anda perubahan tetapi tetap di antrian simpanan juga. Jika Anda tidak ingin menyimpannya di tumpukan simpanan, maka letakan menggunakan

git stash pop

Itu setara dengan applydan kemudiandrop


2

Tutup terminal, hapus folder di mana proyek Anda berada, lalu tiru lagi proyek dan voilá Anda.


2
git tidak dirancang untuk mendorong Anda untuk menghapus proyek dan mengkloning lagi! jika Anda ingin mendapatkan versi terbaru dari asalnya, Anda tinggal reset --hard!
Ahmed Nour Jamal El-Din

2

Jika Anda ingin menyimpan perubahan dan mengubah cabang dalam satu perintah baris

git stash && git checkout <branch_name> && git stash pop

1

Pindahkan perubahan yang tidak dikomit ke cabang baru

Saya membuat .gitconfigalias untuk ini:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

Untuk mengubahnya new-branch-name, gunakan:

git spcosp new-branch-name

Dan perubahan file dan indeks yang tidak berkomitmen akan disimpan.


1

git checkout -f your_branch_name

git checkout -f your_branch_name

jika Anda memiliki masalah dalam mengembalikan perubahan:

git checkout .

jika Anda ingin menghapus direktori dan file yang tidak dilacak:

git clean -fd

0

Untuk beralih ke cabang lain tanpa melakukan perubahan ketika git simpanan tidak berfungsi. Anda dapat menggunakan perintah di bawah ini:

git checkout -f cabang-nama

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.