Bagaimana saya dapat mengembalikan 1 komit?

127

Saya memiliki 2 komitmen yang tidak saya dorong:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Bagaimana saya bisa mengembalikan yang pertama (yang tertua), tetapi menyimpan yang kedua?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Dari sini:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Apakah saya hanya perlu melakukan:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Itu adalah?

n179911
sumber
3
Pertanyaan ini tampaknya di luar topik karena ini tentang alat pemrograman. Itu milik Stack Overflow.
Peter Mortensen
@PeterMortensen Setuju. Ini adalah ruang lingkup untuk SuperUser
Kolob Canyon

Jawaban:

95

Cara teraman dan mungkin terbersih untuk dilakukan adalah rebase secara interaktif.

git rebase -i HEAD^^

Atau,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Dari sana Anda dapat menekan komit, yang menempatkan satu atau lebih komit bersama ke dalam komit sebelumnya. Untuk menghapus komit sepenuhnya dari riwayat, hapus baris dari daftar.

Anda dapat mengembalikan komit dengan git reverttetapi akan menambahkan lebih banyak pesan komit ke riwayat, yang mungkin tidak diinginkan. Gunakan -nparameter untuk memberi tahu Git untuk tidak langsung mengembalikannya. Anda dapat melakukan rebase secara interaktif dan memencetnya pada komit sebelumnya untuk menjaga semuanya tetap bersih.

Jika kedua komit yang Anda kerjakan di sini memengaruhi file yang sama, Anda mungkin melihat konflik gabungan.

Mengatur ulang repositori dengan git reset --hardharus dilakukan dengan hati-hati, karena tidak dapat dibatalkan.

Menulis ulang riwayat harus dilakukan dengan hati-hati.

jtimberman
sumber
Bagaimana saya bisa menghapus komit selama 'git rebase'? Hanya ada 3 perintah: pick, edit, squash. Tidak ada penghapusan AFAIK.
n179911
8
hapus baris dari daftar sepenuhnya, dan itu menghapus komit
# jtimberman
ketika saya ingin mengembalikan perubahan, saya tidak meninggalkan jejaknya. Jika Anda juga tidak ingin meninggalkan jejak pemulihan Anda, ini adalah cara terbaik untuk melakukannya.
Phillip Whelan
"Cara teraman dan mungkin terbersih untuk dilakukan adalah rebase secara interaktif" Mungkin tidak jika Anda tidak menggunakan vim. Saya beruntung dan menemukan jalan keluar dari kekacauan itu. Masih upvoting karena saya harus belajar vim :-)
isimmons
Saya sarankan gunakan rebasesesedikit mungkin. Jika Anda bekerja dengan orang lain maka buat saja revert.
boldnik
52

Ini jika dari http://nakkaya.com/2009/09/24/git-delete-last-commit/ dan itu berhasil untuk saya

Git Hapus Komit Terakhir

Kadang-kadang larut malam ketika saya kehabisan kopi, saya melakukan hal-hal yang seharusnya tidak saya lakukan. Lalu saya menghabiskan 10 - 15 menit berikutnya mencari cara menghapus komit terakhir yang saya buat. Jadi setelah ketiga kalinya saya ingin membuat catatan sehingga saya bisa merujuknya nanti.

Jika Anda telah melakukan sampah tetapi tidak mendorong,

git reset --hard HEAD~1

KEPALA ~ 1 adalah singkatan untuk komit sebelum kepala. Atau Anda bisa merujuk ke SHA-1 dari hash yang ingin Anda atur ulang. Perhatikan bahwa ketika menggunakan --memberikan perubahan apa pun untuk melacak file di pohon kerja sejak komit sebelum kepala hilang.

Jika Anda tidak ingin menghapus pekerjaan yang telah Anda lakukan, Anda dapat menggunakan --softopsi yang akan menghapus komit tetapi itu akan meninggalkan semua file Anda yang diubah "Perubahan yang harus dilakukan", karena status git akan meletakkannya.

Sekarang jika Anda sudah mendorong dan seseorang menarik yang biasanya kasus saya, Anda tidak dapat menggunakan git reset. Namun Anda dapat melakukan git revert,

git revert HEAD

Ini akan membuat komit baru yang membalikkan semua yang diperkenalkan oleh komit tidak disengaja.

iStryker
sumber
2
Dengan opsi --soft, ini sempurna untuk tempat Anda mengganti nama file dan secara tidak sengaja "git commit -a" daripada menggunakan "git add" terlebih dahulu.
Aaron Harun
8

Nggak. git-reset --hard akan membawa Anda kembali ke sejarah. Apa yang Anda cari adalah git revert, yang akan membatalkan komitmen apa pun.

Peltier
sumber
4
Yah, ini berhasil tetapi juga mencemari Anda melakukan log. Jika komit ini tidak didorong / ditarik sudah lebih baik untuk membersihkannya dengan rebase interaktif. Kemampuan untuk mengubah sejarah adalah salah satu keunggulan utama git dibandingkan sistem kontrol versi lainnya.
knweiss
6

Saya baru saja melakukan ini:

git rebase -i HEAD^^

Saya mengacaukannya jadi saya lakukan

git rebase --abort

Kemudian melakukannya lagi. Kemudian saya harus mendorong seperti ini:

git push origin master -f

Dan itu menghancurkan komit yang lebih baru daripada komit yang telah saya kembalikan. Bekerja dengan baik.

hamstar
sumber
4

Tidak, git reset --hard baf8d5eakan menghapus 3368e1ckomit dan KEPALA akan di baf8d5esesudahnya.

Jika Anda ingin menyimpan 3368e1ckomit dan menghapus bad8d5ekomit, solusi termudah adalah dengan melakukan " git rebase -i HEAD~2" (yaitu rebase interaktif dari dua komit terakhir). Perintah ini akan meluncurkan editor pesan komit Anda dan Anda akan melihat satu baris untuk masing-masing dari dua komit terakhir. Di sana Anda cukup menghapus bad8d5egaris komit dan menyimpan. git kemudian akan menulis ulang sejarah Anda dan komit ke-2 akan hilang.

Ada perintah lain yang berguna yang dapat digunakan dalam editor pesan komit seperti squash, edit, dll rebase Interaktif adalah sangat kuat!

Jangan lakukan ini jika seseorang sudah melihat commit ini (dorong atau tarik dari repositori Anda)!

knweiss
sumber
1
git reset --hard {ref}

adalah satu-satunya cara untuk membatalkan komit jika hanya ada satu komit lainnya di repo (mis. komit awal dan 1 komit lebih). Sisa cara (kembalikan, rebase) menolak untuk bekerja, setidaknya pada git 1.7.5.1.

Jika Anda mengikuti git resetdengan git gcgit maka sebenarnya akan menghapus data komit lama dari repo sepenuhnya.

squeegee
sumber
1
git checkout <treeish> -- /path/to/dir

Itu akan mengembalikan direktori dari "treeish" yang diberikan untuk / path / ke / dir

lokeshpahal
sumber
0

Saya dapat ini bekerja dengan mengedit secara manual kode hash dari commit terakhir dari file HEAD di dalam folder repositori:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Sebelum itu, saya tidak pernah bisa mendorong ke asal operasi UNMERGE yang saya lakukan secara lokal. Itu terus mengatakan itu "gagal mendorong beberapa referensi" ke Central Repository.

Leandro M
sumber