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.

Daniel Farrell
sumber
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
Tautan silang yang terkait erat Bagaimana cara memaksa "git pull" untuk menimpa file lokal?
user56reinstatemonica8
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.

VONC
sumber
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
Jamie Macey
sumber
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
romerun
sumber
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
22

Mengikuti,

$: git checkout -f

$: git checkout next_branch
cukup keras
sumber
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 .

ccliffe
sumber
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.

Greg Hewgill
sumber
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
Vishnu Viswanath
sumber
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
Jorge Avila
sumber
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

Kareem Jeiroudi
sumber
2

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

miguelacio
sumber
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
Vinit Solanki
sumber
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.

Tom Hale
sumber
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
Pedro Trujillo
sumber
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

rajkumar chilukuri
sumber