Dalam cabang master saya, saya melakukan secara git merge some-other-branch
lokal, tetapi tidak pernah mendorong perubahan ke master asal. Saya tidak bermaksud untuk bergabung, jadi saya ingin membatalkannya. Saat melakukan git status
setelah penggabungan, saya menerima pesan ini:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
Berdasarkan beberapa instruksi yang saya temukan , saya mencoba berlari
git revert HEAD -m 1
tapi sekarang saya menerima pesan ini dengan git status
:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
Saya tidak ingin cabang saya di depan oleh sejumlah komitmen. Bagaimana saya kembali ke titik itu?
Jawaban:
Dengan
git reflog
memeriksa komit yang merupakan salah satu sebelum penggabungan (git reflog
akan menjadi pilihan yang lebih baik daripadagit log
). Kemudian Anda dapat mengatur ulang menggunakan:Ada juga cara lain:
Ini akan membuat Anda kembali 1 berkomitmen.
Ketahuilah bahwa file apa pun yang dimodifikasi dan tidak dikomit / tidak disimpan akan disetel ulang ke kondisi tidak dimodifikasi . Untuk menjaga mereka menyembunyikan perubahan atau melihat
--merge
opsi di bawah.Seperti @Velmont sarankan di bawah dalam jawabannya, dalam kasus langsung ini menggunakan:
mungkin menghasilkan hasil yang lebih baik, karena itu harus menjaga perubahan Anda.
ORIG_HEAD
akan menunjuk ke sebuah komit langsung sebelum penggabungan telah terjadi, jadi Anda tidak harus berburu sendiri.Kiat selanjutnya adalah menggunakan
--merge
sakelar alih-alih--hard
karena sakelar tidak mereset file yang tidak perlu:sumber
git log
dipilih untuk ditampilkan secara default - mungkin ada output yang berbedagit log
ataugit reflog
dapat digunakan untuk ini)git log
output, Anda ingin melihat komitmen dua induk. Satu adalah komit terbaru di cabang Anda, satu komit terbaru di cabang tempat Anda bergabung. Anda ingin kegit reset --hard
induk berkomitmen pada cabang tempat Anda bergabung.git reset --hard <commit_sha>
Dengan asumsi master lokal Anda tidak lebih penting dari asal / master, Anda harus dapat melakukannya
Maka
master
cabang lokal Anda akan terlihat identikorigin/master
.sumber
Lihat bab 4 dalam buku Git dan posting asli oleh Linus Torvalds .
Untuk membatalkan gabungan yang sudah didorong :
Pastikan untuk mengembalikan kembali jika Anda melakukan cabang lagi, seperti kata Linus.
sumber
git revert -m 1 <commit>
. Masalahnya adalah melakukan itu tidak menghapus gabungan tidak disengaja yang dia lakukan (dan belum mendorong). Jawaban lain yang melibatkan hard reset lebih baik untuk masalah poster asli.Sungguh aneh bahwa perintah yang paling sederhana tidak ada. Sebagian besar jawaban berfungsi, tetapi membatalkan penggabungan yang baru saja Anda lakukan, ini adalah cara yang mudah dan aman :
Wasit
ORIG_HEAD
akan menunjuk ke komit asli dari sebelum penggabungan.(
--merge
Opsi tidak ada hubungannya dengan penggabungan. Ini sepertigit reset --hard ORIG_HEAD
, tapi lebih aman karena tidak menyentuh perubahan yang tidak dikomit.)sumber
git reset --merge ORIG_HEAD
pertahankan perubahan itu.git reset --hard HEAD~5
hanya akan mereset KEPALA (dapat menghapus komit di master dan branch1). Hanya--merge
opsi yang menghapusmerge
.--merge
Opsi ini tidak benar-benar menghapus penggabungan, Anda dapat menggunakannya--hard
juga akan berfungsi dengan baik. Ini adalah referensi ORIG_HEAD yang merupakan petunjuk di sini, sudah diatur sebelum Anda melakukan penggabungan ke posisi Anda saat itu. :)git reset --hard ORIG_HEAD
perintah bekerja sempurna bagi saya - itu mungkin telah dibantu oleh fakta bahwa saya tidak membuat perubahan lain untuk repositori setelah lokalgit merge
saya mencoba untuk membatalkan. Perintah ini cukup mengatur ulang status repositori kembali ke keadaan sebelum penggabungan. Terima kasih atas tipnya!Dengan versi Git yang lebih baru, jika Anda belum melakukan penggabungan dan Anda memiliki konflik penggabungan , Anda dapat melakukannya:
Dari
man git merge
:sumber
Anda harus mengatur ulang ke komit sebelumnya. Ini seharusnya bekerja:
Atau bahkan
HEAD^^
untuk mengembalikan komitmen yang dikembalikan. Anda selalu dapat memberikan referensi lengkap SHA jika Anda tidak yakin berapa banyak langkah yang harus Anda ambil.Jika Anda memiliki masalah dan cabang master Anda tidak memiliki perubahan lokal, Anda dapat mengatur ulang ke
origin/master
.sumber
ORIG_HEAD
untuk Anda, mengapa tidak menggunakannya?Akhir-akhir ini, saya menggunakan ini
git reflog
untuk membantu. Ini sebagian besar hanya berfungsi jika penggabungan HANYA terjadi, dan itu ada di mesin Anda.git reflog
mungkin mengembalikan sesuatu seperti:Baris pertama menunjukkan bahwa penggabungan terjadi. Baris ke-2 adalah waktu sebelum penggabungan saya. Saya hanya
git reset --hard 43b6032
memaksa cabang ini untuk melacak dari sebelum penggabungan, dan melanjutkan.sumber
reflog
untuk mendapatkan SHA dan meneruskannya agargit reset
berfungsi.Dengan Git modern, Anda dapat:
Sintaks yang lebih lama:
Sekolah tua:
Namun sebenarnya, perlu diperhatikan bahwa
git merge --abort
hanya setara dengan yanggit reset --merge
diberikan yangMERGE_HEAD
hadir. Ini bisa dibaca di Git help for merge command.Setelah penggabungan yang gagal, saat tidak ada
MERGE_HEAD
, gabungan yang gagal dapat diurungkangit reset --merge
, tetapi tidak harus dengangit merge --abort
, sehingga mereka tidak hanya sintaks lama dan baru untuk hal yang sama .Secara pribadi saya menemukan
git reset --merge
jauh lebih kuat dan berguna dalam pekerjaan sehari-hari, jadi itulah yang selalu saya gunakan.sumber
Oke, jawaban yang diberikan orang lain dekat dengan saya, tetapi tidak berhasil. Inilah yang saya lakukan.
Melakukan ini...
... memberi saya status berikut.
Saya kemudian harus mengetikkan
git reset
perintah yang sama beberapa kali lagi. Setiap kali saya melakukan itu, pesannya diubah satu seperti yang Anda lihat di bawah.Pada titik ini, saya melihat pesan status berubah, jadi saya mencoba melakukan
git pull
, dan itu sepertinya berhasil:Singkat cerita, perintah saya sampai pada ini:
sumber
HEAD^^^^
origin/master
;)Anda dapat menggunakan
git reflog
untuk menemukan checkout sebelumnya. Terkadang itu adalah kondisi bagus yang ingin Anda kembalikan.Secara konkret,
sumber
Jika Anda berada di tengah penggabungan, Anda selalu dapat membatalkannya
git merge --abort
sumber
Saya dapat menyelesaikan masalah ini dengan satu perintah yang tidak melibatkan mencari komit id.
Jawaban yang diterima tidak bekerja untuk saya tetapi perintah ini mencapai hasil yang saya cari.
sumber
Jika Anda belum melakukannya, Anda hanya dapat menggunakannya
Ini akan membatalkan penggabungan (dan semua yang Anda lakukan).
sumber
Sampai pada pertanyaan ini juga mencari untuk kembali ke mencocokkan asal (yaitu, TIDAK melakukan lebih dulu dari asal). Meneliti lebih lanjut, menemukan ada
reset
perintah untuk itu:git reset --hard @{u}
Catatan:
@{u}
adalah singkatan untukorigin/master
. (Dan, tentu saja, Anda membutuhkan repositori jarak jauh agar ini berfungsi.)sumber
Anda harus mengubah KEPALA Anda, Tentu saja bukan KEPALA Anda tetapi git KEPALA ....
Jadi sebelum menjawab, mari tambahkan beberapa latar belakang, jelaskan apa ini
HEAD
.First of all what is HEAD?
HEAD
hanyalah referensi ke komit saat ini (terbaru) di cabang saat ini.Hanya ada satu
HEAD
pada waktu tertentu. (tidak termasukgit worktree
)Konten
HEAD
disimpan di dalam.git/HEAD
dan berisi 40 byte SHA-1 dari komit saat ini.detached HEAD
Jika Anda tidak menggunakan komit terbaru - artinya
HEAD
menunjuk komit sebelumnya dalam sejarah yang disebutdetached HEAD
.Pada baris perintah, akan terlihat seperti ini- SHA-1 bukan nama cabang karena
HEAD
tidak menunjuk ke ujung cabang saat iniBeberapa opsi tentang cara memulihkan dari HEAD yang terpisah:
git checkout
Ini akan mengecek cabang baru yang menunjuk ke komit yang diinginkan.
Perintah ini akan checkout ke komit yang diberikan.
Pada titik ini, Anda dapat membuat cabang dan mulai bekerja sejak saat ini.
git reflog
Anda selalu dapat menggunakan itu
reflog
juga.git reflog
akan menampilkan perubahan apa pun yang memperbaruiHEAD
dan memeriksa entri reflog yang diinginkan akan mengaturHEAD
kembali komitmen ini.Setiap kali KEPALA diubah akan ada entri baru di
reflog
Ini akan membuat Anda kembali ke komit yang Anda inginkan
git reset --hard <commit_id>
"Pindahkan" KEPALA Anda kembali ke komit yang diinginkan.
Anda juga bisa menggunakan itu
git rebase --no-autostash
.git revert <sha-1>
"Undo" rentang komit atau komit yang diberikan.
Perintah reset akan "membatalkan" setiap perubahan yang dilakukan dalam komit yang diberikan.
Komit baru dengan undo patch akan dilakukan sementara komit asli akan tetap ada dalam sejarah juga.
Skema ini menggambarkan perintah mana melakukan apa.
Seperti yang Anda lihat ada
reset && checkout
modifikasiHEAD
.sumber
Jawaban paling sederhana adalah yang diberikan oleh odinho - Velmont
Pertama lakukan
git reset --merge ORIG_HEAD
Bagi mereka yang ingin me-reset setelah perubahan didorong, lakukan ini (Karena ini adalah posting pertama yang terlihat untuk pertanyaan git reset gabung)
git push origin HEAD --force
Ini akan mengatur ulang sedemikian rupa sehingga Anda tidak akan mendapatkan perubahan yang digabungkan kembali setelah menarik.
sumber
Hanya untuk opsi tambahan untuk melihat, saya telah sebagian besar mengikuti model percabangan yang dijelaskan di sini: http://nvie.com/posts/a-successful-git-branching-model/ dan karena itu telah bergabung dengan
--no-ff
(tidak ada maju cepat) biasanya.Saya baru saja membaca halaman ini karena saya secara tidak sengaja menggabungkan cabang pengujian alih-alih cabang rilis saya dengan master untuk disebarkan (situs web, master adalah apa yang ditayangkan). Cabang pengujian memiliki dua cabang lainnya yang digabung dan total sekitar enam komitmen.
Jadi untuk mengembalikan seluruh komit, saya hanya perlu satu
git reset --hard HEAD^
dan mengembalikan seluruh gabungan. Karena penggabungan tidak diteruskan dengan cepat, penggabungan tersebut merupakan blok dan satu langkah mundur adalah "cabang tidak digabungkan".sumber
Anda dapat menggunakan hanya dua perintah untuk mengembalikan gabungan atau memulai kembali dengan komit tertentu:
git reset --hard commitHash
(Anda harus menggunakan komit yang ingin Anda restart, mis. 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Mengirim cabang master lokal baru ke asal / master)Semoga sukses dan teruskan!
sumber
Itu bisa dilakukan dengan berbagai cara.
1) Batalkan Penggabungan
Jika Anda berada di antara penggabungan yang buruk (keliru dilakukan dengan cabang yang salah), dan ingin menghindari penggabungan untuk kembali ke cabang terbaru seperti di bawah ini:
2) Setel ulang HEAD ke cabang jarak jauh
Jika Anda bekerja dari cabang pengembangan jarak jauh, Anda dapat mengatur ulang HEAD ke komit terakhir di cabang jarak jauh seperti di bawah ini:
3) Hapus cabang saat ini, dan checkout lagi dari repositori jarak jauh
Menimbang, Anda sedang bekerja mengembangkan cabang di repo lokal, yang disinkronkan dengan cabang jarak jauh / kembangkan, Anda dapat melakukan seperti di bawah ini:
sumber
Jika gabungan Anda dan komit yang sesuai belum didorong, Anda selalu dapat beralih ke cabang lain, menghapus yang asli dan membuatnya kembali.
Sebagai contoh, saya tidak sengaja menggabungkan cabang pengembangan menjadi master dan ingin membatalkannya. Menggunakan langkah-langkah berikut:
Voila! Master berada pada tahap yang sama dengan asal, dan negara salah-merger Anda terhapus.
sumber
Jika Anda menginginkan solusi command-line, saya sarankan untuk hanya mengikuti jawaban MBO.
Jika Anda seorang pemula, Anda mungkin menyukai pendekatan grafis:
gitk
(dari baris perintah, atau klik kanan di browser file jika Anda memilikinya)sumber
Strategi: Buat cabang baru dari tempat semuanya baik.
Alasan: Mengembalikan merger sulit. Ada terlalu banyak solusi, tergantung pada banyak faktor seperti apakah Anda telah berkomitmen atau mendorong penggabungan Anda atau apakah ada komitmen baru sejak penggabungan Anda. Anda juga masih harus memiliki pemahaman yang relatif mendalam tentang git untuk menyesuaikan solusi ini dengan kasus Anda. Jika Anda mengikuti beberapa instruksi secara membabi buta, Anda bisa berakhir dengan "penggabungan kosong" di mana tidak ada yang akan digabungkan, dan upaya penggabungan lebih lanjut akan membuat Git memberi tahu Anda "Sudah up to date".
Larutan:
Katakanlah Anda ingin menggabungkan
dev
ke dalamfeature-1
.Temukan revisi yang Anda inginkan untuk menerima penggabungan:
Lihat (kembali waktu):
Buat cabang baru dari sana dan periksa:
Sekarang Anda dapat memulai kembali penggabungan:
Menggabungkan:
git merge dev
Perbaiki konflik gabungan Anda.
Melakukan:
git commit
Saat Anda puas dengan hasilnya, hapus cabang lama:
git branch --delete feature-1
sumber
Cukup buat cabang baru, lalu pilih cherry-commit yang diinginkan.
Lebih simpel dan simpel, kemudian mengatur ulang yang dijelaskan dalam banyak jawaban di atas
sumber
Saya pikir Anda dapat melakukan di
git rebase -i [hash] [branch_name]
mana[hash]
hash identifikasi untuk seberapa jauh Anda ingin mundur ditambah satu (atau seberapa banyak banyak komitmen yang ingin Anda tuju) dan kemudian hapus baris untuk komit di editor yang tidak Anda inginkan lagi . Simpan file. Keluar. Berdoa. Dan itu harus diputar ulang. Anda mungkin harus melakukangit reset --hard
, tetapi itu harus baik pada saat ini. Anda juga dapat menggunakan ini untuk menarik komit tertentu dari tumpukan, jika Anda tidak ingin menyimpannya dalam riwayat Anda, tetapi itu bisa membuat repositori Anda dalam keadaan yang mungkin tidak Anda inginkan.sumber
Jika Anda melakukan penggabungan:
sumber
Pertama, pastikan Anda telah melakukan segalanya.
Kemudian atur ulang repositori Anda ke kondisi kerja sebelumnya:
atau menggunakan
--hard
( ini akan menghapus semua perubahan lokal, tidak berkomitmen! ):Gunakan hash yang ada di sana sebelum Anda salah menggabungkan komit.
Periksa komitmen yang ingin Anda komit ulang di atas versi yang benar sebelumnya dengan:
Terapkan komit kanan Anda di atas versi kanan repositori Anda dengan:
Dengan menggunakan cherry-pick (perubahan yang dilakukan oleh beberapa commit yang ada)
Atau dengan memetik berbagai komitmen dengan:
Pertama-tama memeriksa perubahan yang tepat sebelum menggabungkannya:
Pertama-tama memeriksa perubahan yang tepat sebelum menggabungkannya:
di mana ini adalah rentang komit yang benar yang telah Anda komit (tidak termasuk penggabungan yang salah komitmen).
sumber
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Ini bekerja untuk saya .. !!
sumber
Jika Anda melihat bahwa Anda harus segera kembali setelah penggabungan dan Anda belum melakukan hal lain setelah upaya penggabungan, Anda bisa mengeluarkan perintah ini:
git reset --hard HEAD@{1}
.Pada dasarnya, penggabungan Anda
sha
akan menunjuk keHEAD@{0}
jika tidak ada yang dilakukan setelah penggabungan danHEAD@{1}
akan menjadi poin sebelumnya sebelum penggabungan.sumber
Kesempatan paling sederhana dari yang paling sederhana, jauh lebih sederhana dari apa pun yang dikatakan di sini:
Hapus cabang lokal Anda (lokal, bukan jarak jauh) dan tarik lagi. Dengan cara ini Anda akan membatalkan perubahan pada cabang master Anda dan siapa pun akan terpengaruh oleh perubahan yang tidak ingin Anda dorong. Mulai lagi.
sumber
Dalam hal ini, Anda ingin mengatur ulang cabang Anda
git reset --hard <branch_name>
. Jika Anda ingin menyimpan perubahan Anda sebelum meresetnya pastikan untuk membuat cabang baru dangit checkout <branch_name>
.Anda dapat mengatur ulang negara ke komit tertentu
git reset --hard <commit_id>
juga.Jika perubahan telah didorong, Anda dapat menggunakannya
git revert <branch_name>
. Pastikan untuk memeriksa cara menggunakan git revert dan git checkout di skenario lain juga.sumber