Git - Bagaimana cara memperbaiki rebase interaktif "rusak"?

184

Saya berhasil membuat sedikit kekacauan di repositori git lokal saya. Saya mencoba untuk memperbaiki komit yang rusak dengan menggunakan instruksi berikut . Sebelum menjalankan "git commit --amend" (dan setelah git rebase --interactive) saya memutuskan bahwa perubahan saya tidak benar dan saya menjalankan "git reset HEAD --hard". Bukan ide yang bagus, saya katakan.

Sekarang rebase interaktif tampaknya "macet". Git menunjukkan cabang saat ini sebagai (| REBASE-m). Setiap perintah (cd .., ls, git rebase ...) di dalam repositori saya memberikan kesalahan berikut:

cat: .git / rebase-merge / head-name: Tidak ada file atau direktori seperti itu

Begini cara git rebase --abort terlihat seperti:

$ git rebase --abort
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/head-name: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/orig-head: No such file or directory
HEAD is now at 4c737fb Revert "Modified file names"
rm: cannot remove `c:/_work/project/src/git/.git/rebase-merge/done': Permission denied
rm: cannot remove directory `c:/_work/project/src/git/.git/rebase-merge': Directory
not empty
cat: .git/rebase-merge/head-name: No such file or directory

Inilah hasil dari git rebase --continue:

$ git rebase --continue
cat: c:/_work/project/src/git/.git/rebase-merge/prev_head: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/end: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/msgnum: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/onto: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
prev_head must be defined
cat: .git/rebase-merge/head-name: No such file or directory

Ada ide? Saya ingin mengatur ulang situasi kembali ke keadaan sebelum saya memulai operasi rebase yang dipikirkan dengan baik.

Inilah cara git log --oneline menunjukkan situasinya:

4c737fb Revert "Modified file names"
247ac02 Modified file names
33141e6 Message modifications
10a4a04 Modified db script

Dan ini baik-baik saja.

Saya menggunakan msysgit v1.7.0.2.

Mikael Koskinen
sumber
58
git rebase --quitbekerja untuk saya
Juan Caicedo

Jawaban:

160

Sepertinya Git mencoba menghapus .git/rebase-mergedirektori tetapi tidak dapat menghapusnya sepenuhnya. Sudahkah Anda mencoba menyalin folder itu? Juga menyalin.git/rebase-apply foldernya jika ada.

Martin Owen
sumber
7
Terima kasih telah menunjukkannya. Saya dapat memperbaiki masalah saya hanya dengan me-restart komputer. Saya tidak yakin apa yang salah karena entah bagaimana setiap akses ke folder .git \ rebase-merge menyebabkan "Access ditolak" -error.
Mikael Koskinen
19
Reboot tidak bekerja untuk saya tapi git rebase --abort(dari stackoverflow.com/a/4757777/146044 ) melakukan pekerjaan.
backus
3
Hanya me-restart git shell (windows) bekerja untuk saya ( git rebase --aborttidak berfungsi)
mhand
4
sebuah kata peringatan ... saya memiliki 4 jam perubahan di direktori kerja saya ketika saya melihat kesalahan rebase yang rusak. mencoba git rebase --abortitu menghapus perubahan saya yang tidak dipentaskan ... kesalahan memang hilang
George Ananda Eman
117
me-reboot atau git rebase --abortmasih memberi saya kesalahan. git rebase --quitbekerja untukku.
Flávio Rodrigues
198

Saya terjebak dalam hal ini. Saya membuat file kepala-nama, dan kemudian saya mengalami kesalahan lain mengatakan tidak dapat menemukan file ke, jadi saya membuat file itu. Lalu saya mendapat yang lain kesalahan mengatakan tidak bisa membaca '. Git / rebase-apply / ke': Tidak ada file atau direktori tersebut.

Jadi saya melihat dokumentasi git untuk rebasing dan menemukan perintah lain:

git rebase --quit

Ini membuat saya kembali ke cabang saya tanpa perubahan, dan saya bisa memulai rebase saya lagi, bagus seperti baru.

Laura Slocum
sumber
51
git rebase --quitApakah itu!
Steven Shaw
5
--quitbekerja. --aborttidak karena rebase dibatalkan setengah jalan
Kalob Taulien
1
Saya memiliki kesalahan terkait rebase yang sama, hanya dengan pesan kesalahan yang berbeda. Mencoba: $ git rebase --abortOutput: error: could not read '.git/rebase-apply/head-name': No such file or directoryAkhirnya, solusi ini memperbaiki masalah saya:git rebase --quit
af
Terpilih. git rebase --quitbenar-benar menyelamatkan saya. Gejala yang sama seperti yang dijelaskan, tetapi saya datang setelah mencoba melakukan git pull --rebase, yang karena beberapa alasan gagal. Catatan Saya telah mengaktifkan autostash (git versi 2.27.0.windows.1) dan menjalankan VS2019 (menunjuk pada repo itu) pada saat yang sama - mencurigai beberapa kombinasi dari ini mengacaukannya.
ErrCode
90

Saya memiliki masalah yang sama karena proses zombie vim.exe. Membunuhnya di Task Manager, diikuti dengan git rebase --abortmemperbaikinya.

pengguna584317
sumber
ini juga masalah saya. Saya menggunakan handleperintah sysinternals dan melihat bahwa suatu proses (sh.exe) file terkunci. Menggunakannya pskill <pid>untuk saya.
Paul Oliver
Saya memiliki masalah yang sama, tetapi dengan Sublime Text untuk saya.
Toivo Säwén
35

Terima kasih @Laura Slocum untuk jawaban Anda

Saya mengacaukan semuanya saat rebasing dan mendapat KEPALA yang terpisah dengan

 error: could not read orig-head

yang mencegah saya menyelesaikan rebasing.

KEPALA yang terlepas tampaknya berisi persis kondisi rebase yang saya inginkan, jadi saya berlari

rebase --quit

dan setelah itu saya memeriksa cabang temp baru untuk mengikatnya ke kepala terpisah.

Dengan membandingkannya dengan cabang yang ingin saya rebase, saya bisa melihat cabang temp baru persis di negara bagian yang ingin saya jangkau. Terima kasih

Ruth
sumber
7

Punya masalah yang sama di Eclipse. Tidak dapat Rebase => batalkan dari Eclipse.

Mengeksekusi git rebase - bank dari Git Bash Bekerja untuk saya.

Praveen Hiremath
sumber
7

Pada Windows, jika Anda tidak mau atau tidak dapat memulai ulang mesin lihat di bawah.

Instal Process Explorer: https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

Di Process Explorer, Temukan> Pegangan File atau DLL ...

Ketikkan nama file yang disebutkan dalam kesalahan (untuk kesalahan saya itu adalah 'git-rebase-todo' tetapi dalam pertanyaan di atas, 'selesai').

Process Explorer akan menyorot proses memegang kunci pada file (bagi saya itu 'grep').

Matikan prosesnya dan Anda dapat membatalkan aksi git dengan cara standar.

Darren Yeats
sumber
5

Buat file dengan nama ini:

touch .git/rebase-merge/head-name

dan daripada digunakan git rebase

Tehila Dabush
sumber
3

Dalam kasing kasus saya git rebase --abortdan git rebase --continuesedang melempar:

error: tidak dapat membaca '. git / rebase-apply / head-name': Tidak ada file atau direktori tersebut

Saya berhasil memperbaiki masalah ini dengan menghapus secara manual: .git\rebase-applydirektori.

Dariusz
sumber
2

Saya menggunakan git version 2.19.2.windows.1.

satu-satunya hal yang berhasil bagi saya adalah menghapus .git/rebase-apply/direktori dan melakukan git reset --hard.

Spongman
sumber
1

Dalam kasus saya itu karena saya telah membuka SmartGit's Log di masing-masing proyek Git dan Total Commander di direktori proyek masing-masing. Ketika saya menutup keduanya saya bisa rebase tanpa masalah.

Semakin saya memikirkannya, semakin saya mencurigai Total Commander, yaitu Windows yang memiliki kunci pada direktori yang terbuka, git rebase mencoba melakukan sesuatu dengannya.

Saran ramah: Ketika Anda mencoba untuk memperbaiki sesuatu, selalu lakukan perubahan satu per satu. ;)

meridius
sumber
1

Saya telah mencoba semua langkah di atas tetapi tidak ada yang berhasil untuk saya. Akhirnya, menyalakan kembali komputer berfungsi untuk masalah ini: D

Mohammed Asif
sumber
1

Dengan SublimeText 3 di Windows, masalahnya diperbaiki dengan hanya menutup jendela Sublime yang digunakan untuk edisi komit interaktif.

LeBorgne
sumber
0

Setelah Anda menyelesaikan rebasing X jumlah komit dengan memuaskan, perintah terakhir harus git rebase --continue. Itu menyelesaikan proses dan keluar dari mode rebase.

diptia
sumber
0

Saya memiliki masalah yang sama. Saya menggunakan proses explorer seperti yang disarankan dalam posting lain (saya tidak dapat menemukan posting itu) dan menemukan proses mana yang memiliki kunci pada file dan membunuhnya. kemudian jalankan --continue atau --abort sesuai kebutuhan

pengguna3739537
sumber
0

Dalam kasus saya setelah menguji semua opsi ini dan masih mengalami masalah saya mencoba sudo git rebase --abortdan melakukan semuanya

Dani.Rangelov
sumber
Berhati-hatilah jika Anda melakukan ini di tengah-tengah rebase yang sebenarnya. Baru saja kehilangan perubahan saya: '(
Freeman L
Itu dianggap "rusak", maka Anda mulai lagi dengan rebase
Dani.Rangelov
0

mencoba yang lain kecuali reboot, yang berhasil bagi saya adalah rm -fr .git/REBASE_HEAD

Jeremy Veless
sumber
0

Jika Anda berada di bawah status dan rebase tidak berfungsi lagi,

$ git status
rebase in progress; onto (null)
You are currently rebasing.
  (all conflicts fixed: run "git rebase --continue")

Kemudian pertama jalankan,

$ git rebase -quit

Dan kemudian mengembalikan keadaan sebelumnya dari reflog,

$ git reflog
97f7c6f (HEAD, origin/master, origin/HEAD) HEAD@{0}: pull --rebase: checkout 97f7c6f292d995b2925c2ea036bb4823a856e1aa
4035795 (master) HEAD@{1}: commit (amend): Adding 2nd commit
d16be84 HEAD@{2}: commit (amend): Adding 2nd commit
8577ca8 HEAD@{3}: commit: Adding 2nd commit
3d2088d HEAD@{4}: reset: moving to head~
52eec4a HEAD@{5}: commit: Adding initial commit

Menggunakan,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or
Sazzad Hissain Khan
sumber
-3

Saya menggunakan git di gerhana dan saya mengalami masalah yang sama.

Akhirnya saya menemukan bahwa entri menu "Rebase ..." untuk sementara diubah menjadi sub-menu.

Team-> Rebase -> Abort

Ini berhasil untuk saya.

Agiva Siwa
sumber