Saya sudah membaca posting serupa tentang topik ini, dan tidak bisa seumur hidup saya mencari tahu bagaimana melakukan ini dengan benar.
Saya memeriksa sekitar 1000 file yang tidak saya inginkan, dan saya lebih suka tidak harus melalui 1by1 dan menghapus semuanya dari repo.
- Saya memiliki
master
Cabang terpencil . - Saya memiliki
master
Cabang setempat .
Keduanya revisi yang sama.
Saya ingin mengembalikan kendali jarak jauh saya dengan 1 commit.
Katakanlah sejarah saya di master
is A--B--C--D--E
.
Saya ingin mengembalikan ke lokal saya D
.
Kemudian dorong ke remote sehingga hash saya saat ini akan menjadi D baik remote dan lokal.
Saya mengalami masalah dalam melakukan ini.
Saya menggunakan Git Tower tetapi saya merasa nyaman dengan baris perintah. Ada bantuan?
UPDATE: Komentar luar biasa di bawah ini. Menggunakan reset tampaknya sebagian tidak dianjurkan terutama jika repositori dibagikan dengan pengguna lain. Apa cara terbaik untuk membatalkan perubahan komit sebelumnya tanpa menggunakan hard reset ? Apakah ada cara?
git revert
untuk melakukan tanpa reset keras dan tanpa mengganggu pengguna.Jawaban:
Jika belum ada yang menarik repo jarak jauh Anda, Anda dapat mengubah KEPALA cabang Anda dan mendorongnya ke repo jarak jauh tersebut:
(atau, jika Anda memiliki akses langsung ke repo jarak jauh, Anda dapat mengubah referensi KEPALA meskipun repo telanjang )
Catatan, seperti yang dikomentari oleh alien-technology dalam komentar di bawah ini , pada Windows (sesi CMD), Anda perlu
^^
:Pembaruan sejak 2011:
Menggunakan
git push --force-with-lease
( yang saya sajikan di sini , diperkenalkan pada 2013 dengan Git 1.8.5) lebih aman.Lihat Schwern 's jawaban untuk ilustrasi.
Maka saya akan menyarankan sesuatu yang tidak menulis ulang sejarah:
git revert
secara lokal komit terakhir Anda (membuat komit baru yang membalikkan apa yang dilakukan komit sebelumnya)git revert
.sumber
reset --hard HEAD^
dan tidakreset --hard HEAD^^
mengatur ulang komit terakhir.Atur cabang satu revisi kembali (
HEAD^
berarti satu revisi kembali):Dorong perubahan ke asal:
Anda harus memaksa mendorong karena jika tidak git akan mengenali bahwa Anda ketinggalan
origin
satu komit dan tidak ada yang akan berubah.Melakukannya dengan
--force
memberitahu git untuk menimpaHEAD
repo jarak jauh tanpa menghormati kemajuan apa pun di sana.sumber
git push origin master
, Git dapat membuat komit baru di remote karena cabang lokal berada di depan dengan setidaknya sekali komit? Lebih jauh lagi, yang terakhir harus secara substansial berbeda dari apa yang kepala di repo jarak jauh untuk?Jika Anda ingin mengembalikan komit terakhir, dengarkan:
Langkah 1:
Periksa komit lokal Anda dengan pesan
Langkah 2:
Hapus komit terakhir tanpa mengatur ulang perubahan dari cabang lokal (atau master)
ATAU jika Anda tidak ingin file komit terakhir dan pembaruan mendengarkan
Langkah 3:
Kami dapat memperbarui file dan kode dan sekali lagi perlu mendorong dengan paksa itu akan menghapus komit sebelumnya. Itu akan membuat komitmen baru.
Itu dia!
sumber
Dengan memasukkan perintah di bawah ini Anda dapat melihat riwayat komit git Anda -
$ git log
Katakanlah riwayat Anda pada cabang tertentu adalah seperti - commit_A, commit_B, commit_C, commit_D. Di mana, commit_D adalah komit terakhir dan ini adalah tempat HEAD tetap. Sekarang, untuk menghapus komit terakhir Anda dari lokal dan jarak jauh, Anda perlu melakukan hal berikut:
Langkah 1: Hapus komit terakhir secara lokal dengan -
reset $ git --hard HEAD ~
Ini akan mengubah komit HEAD Anda menjadi commit_C
Langkah 2: Dorong perubahan Anda untuk komit HEAD baru ke jarak jauh
$ git dorong asal + KEPALA
Perintah ini akan menghapus komit terakhir dari jarak jauh.
PS perintah ini diuji pada Mac OSX dan harus bekerja pada sistem operasi lain juga (tidak mengklaim OS lain)
sumber
Untuk Mesin Windows, gunakan:
sumber
Ini versi terbaru dari prosedur yang lebih aman.
git push -f
akan mengganti repositori jarak jauh dengan perubahan Anda sendiri. Jika orang lain telah mendorong perubahan, mereka akan hilang.git push --force-with-lease
hanya akan mendorong rebase Anda jika repositori seperti yang Anda harapkan. Jika orang lain telah mendorong, push Anda akan gagal.Lihat – memaksa dianggap berbahaya; memahami git-force-with-lease .
Saya merekomendasikan aliasing ini sebagai
repush = push --force-with-lease
.Katakan pada mereka untuk
git pull --rebase=merges
. Alih-alih agit fetch origin
dangit merge origin/master
itu akangit fetch origin
dangit rebase -r origin/master
. Ini akan menulis ulang setiap perubahan lokal merekamaster
di atas yang baru dibuat ulangorigin/master
.-r
akan mempertahankan gabungan apa pun yang mungkin telah mereka buat.Saya sarankan menjadikan ini perilaku default untuk menarik. Aman, akan menangani rebasing orang lain, dan menghasilkan penggabungan yang tidak perlu.
sumber
--force-with-lease
.Saya memecahkan masalah seperti Anda dengan perintah ini:
sumber
Jika Anda memiliki akses langsung ke repo jarak jauh, Anda selalu dapat menggunakan:
Ini berfungsi karena tidak ada upaya untuk mengubah direktori kerja yang tidak ada. Untuk lebih jelasnya silakan lihat jawaban asli:
Bagaimana saya bisa membatalkan komit terakhir dalam repositori git bare?
sumber
Saya hanya ingin menghapus komit terakhir dari riwayat komit jauh dan menghapus juga. Berikut ini bekerja seperti pesona
sumber
Cara untuk mengatur ulang kepala dan melakukan pengembalian ke komit sebelumnya adalah melalui
Tetapi kadang-kadang itu mungkin tidak diterima di cabang terpencil:
maka cara lain yang harus dilakukan adalah
Ini berfungsi dengan baik.
CATATAN: ingat jika
git push -f <force>
gagal dan kemudian Anda mencoba untuk mengembalikan. Lakukangit pull
sebelumnya, sehingga remote dan lokal dalam sinkronisasi dan kemudian cobagit revert
.Periksa dengan
git log
untuk memastikan remote dan lokal pada titik yang sama komit dengan SHA1 yang sama ..sumber
pada master lokal
Tidak perlu khawatir apakah orang lain sudah menarik atau belum.
Selesai!
sumber
Jika Anda hanya ingin menghapus komit terakhir dari repositori jarak jauh tanpa mengacaukan repositori lokal Anda, berikut adalah one-liner:
Ini menggunakan sintaks berikut:
Di sini,
<remote>
adalahorigin
, dan<refspec>
memiliki struktur berikut:Detail dapat ditemukan di
git-push(1)
. Kata sebelumnya+
berarti "tekan paksa ref ini", dan bagian lainnya berarti "dariorigin/master~
kemaster
(dari jarak jauhorigin
)". Tidak sulit untuk mengetahui bahwa ituorigin/master~
adalah komit terakhir sebelumnyaorigin/master
, kan?sumber
bagi saya bekerja dua perintah ini:
sumber
Anda juga dapat melakukan ini:
dan minta semua orang yang mendapatkan ulang commit buruk terbaru:
sumber