Cara menggunakan Git Revert

109

Bagaimana git revertpenggunaannya?

Ini mungkin terdengar seperti pertanyaan duplikat tetapi ketika orang menanyakannya, responsnya sering, gunakan git resetsesuai Kembalikan ke komit oleh hash SHA di Git?

Kemudian ketika seseorang bertanya bagaimana menggunakan git resetbalasan orang mengatakan Anda harus menggunakan git revertsesuai Git - cara rollback

Sebelum Anda menyadarinya, 8 orang berbeda muncul dengan cara unik mereka sendiri untuk menyelamatkan pantat OP, yang semuanya di atas kepala Anda.

Jadi mari kita coba dan tetap singkat dan menulis Panduan Dummies untuk git revert.

Sebuah skenario: Anda telah berkomitmen dua kali untuk menguasai dan itu buruk. Anda telah mendorong dan orang lain mengalami perubahan buruk Anda.

Anda ingin membatalkannya. Ini bukan sesuatu yang dapat Anda urungkan sendiri dalam kode, katakanlah beberapa wizard atau manajer paket mengubah banyak hal di semua tempat - Anda hanya ingin mengembalikan semuanya seperti semula.

Inilah inti dari kendali sumber. Saya yakin itu mudah.

Oke, Anda akan menggunakan git reverttapi bagaimana caranya?

Dan setelah berlari, git revertapakah Anda harus melakukan hal lain setelahnya? Apakah Anda harus mengkomit perubahan yang dibuat atau tidak langsung berkomitmen ke repo atau apa ??

Jelas Anda harus mendorong lagi dan mungkin mengumumkan keberanian Anda kepada tim.

Luke Puplett
sumber

Jawaban:

120

git revert membuat komit baru

git revert hanya membuat komit baru yang merupakan kebalikan dari komit yang sudah ada.

Itu meninggalkan file dalam keadaan yang sama seolah-olah komit yang telah dikembalikan tidak pernah ada. Misalnya, perhatikan contoh sederhana berikut:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

Dalam contoh ini riwayat komit memiliki dua komit dan yang terakhir adalah kesalahan. Menggunakan git revert:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

Akan ada 3 komit di log:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

Jadi ada riwayat yang konsisten tentang apa yang telah terjadi, namun file tersebut seolah-olah pembaruan buruk tidak pernah terjadi:

cat README.md 
Initial text

Tidak masalah di mana dalam riwayat komit yang akan dikembalikan (dalam contoh di atas, komit terakhir dikembalikan - komit apa pun dapat dikembalikan).

Pertanyaan penutup

apakah kamu harus melakukan sesuatu yang lain setelahnya?

Sebuah git revertadalah hanya lain komit, jadi misalnya push to remote sehingga pengguna lain dapat menarik / mengambil / menggabungkan perubahan dan Anda sudah selesai.

Apakah Anda harus mengkomit perubahan yang dibuat kembali atau apakah pengembalian langsung berkomitmen ke repo?

git revert adalah komit - tidak ada langkah tambahan dengan asumsi mengembalikan satu komit adalah apa yang ingin Anda lakukan.

Jelas Anda harus mendorong lagi dan mungkin mengumumkannya kepada tim.

Memang - jika kendali jarak jauh dalam keadaan tidak stabil - mengkomunikasikan kepada anggota tim lainnya yang perlu mereka tarik untuk mendapatkan perbaikan (komit pengembalian) akan menjadi hal yang benar untuk dilakukan :).

AD7six
sumber
Melalui konfirmasi, baik untuk pernyataan pertama di sini dan kepada siapa pun yang bertanya-tanya tentang hal yang sama Saya hanya ingin tahu tentang cara kerjanya, Anda dapat mengembalikan pengembalian, di mana ada beberapa komit baru sejak pengembalian yang Anda kembalikan. Jadi kembali benar-benar hanyalah melakukan kebalikan dari komitmen yang dikembalikan. Anda mungkin, tentu saja, memiliki konflik ... tapi itu cerita yang berbeda.
GG2
Saya selalu merasa lebih baik untuk menghindari berkomitmen dengannya, hanya meninjau perubahan terlebih dahulu dan saya menggunakan, git revert -n <commitToRevet> atau git revert --no-commit <commitToRevet>
Eklavyaa
2
Hanya ingin mengatakan bahwa setelah bertahun-tahun menggunakan stackoverflow, saya pikir ini mungkin salah satu jawaban terbaik yang pernah saya temukan. Contoh dan penjelasan yang bagus. Terima kasih.
pengguna3344977
Saya masuk ke sini berharap mendapatkan lebih banyak informasi, seperti TLDR dari raw.githubusercontent.com/git/git/master/Documentation/howto/…
wviana
1
@wviana Jika informasi yang Anda temukan tidak mencukupi, silakan tulis jawabannya. Perhatikan bahwa stack overflow bukanlah pengganti dari dokumentasi resmi (yang tampaknya Anda tautkan, dan mencakup cakupan yang jauh lebih luas daripada pertanyaan ini).
AD7six
35

Gunakan git revert seperti ini:

git revert <insert bad commit hash here>

git revertmembuat komit baru dengan perubahan yang dibatalkan. git resetmenghapus riwayat git Anda alih-alih membuat komit baru.

Langkah-langkah setelahnya sama dengan commit lainnya.

Johnny Z
sumber
Perbedaan antara "mengembalikan komit" dan "mengembalikan ke komit" cukup halus sehingga saya kesulitan dengan perintah ini selama bertahun-tahun. Penjelasan Anda menyelesaikannya untuk saya secara instan. Terima kasih!
claviska
24

Alasan resetdan revertcenderung muncul banyak dalam percakapan yang sama adalah karena sistem kontrol versi yang berbeda menggunakannya untuk maksud yang berbeda.

Secara khusus, orang-orang yang terbiasa dengan SVN atau P4 yang ingin membuang perubahan yang tidak terikat ke file akan sering meraih revertsebelum diberi tahu bahwa mereka sebenarnya menginginkannya reset.

Demikian pula, revertpadanan di VCS lain sering disebut rollbackatau sesuatu yang serupa - tetapi "rollback" juga bisa berarti "Saya ingin sepenuhnya membuang beberapa commit terakhir", yang memang sesuai resettetapi tidak revert. Jadi, ada banyak kebingungan di mana orang tahu apa yang ingin mereka lakukan, tetapi tidak jelas perintah mana yang harus mereka gunakan untuk itu.

Adapun pertanyaan Anda yang sebenarnya tentang ...

Oke, Anda akan menggunakan git revert tapi bagaimana caranya?

git revert first-bad-commit..last-bad-commit

Dan setelah menjalankan git revert, apakah Anda harus melakukan hal lain setelahnya? Apakah Anda harus mengkomit perubahan yang dibuat atau tidak langsung berkomitmen ke repo atau apa ??

Secara default, git revertmeminta Anda untuk melakukan pesan dan kemudian mengkomit hasilnya. Ini bisa diganti. Saya mengutip halaman manual :

--edit

Dengan opsi ini, git revert akan membiarkan Anda mengedit pesan komit sebelum melakukan pengembalian. Ini adalah default jika Anda menjalankan perintah dari terminal.

--tidak berkomitmen

Biasanya perintah secara otomatis membuat beberapa komit dengan pesan log komit yang menyatakan komit mana yang dikembalikan. Bendera ini menerapkan perubahan yang diperlukan untuk mengembalikan komit bernama ke pohon kerja Anda dan indeks, tetapi tidak membuat komit. Selain itu, ketika opsi ini digunakan, indeks Anda tidak harus cocok dengan komit HEAD. Pengembalian dilakukan terhadap status awal indeks Anda.

Ini berguna saat mengembalikan lebih dari satu efek komit ke indeks Anda secara berurutan.

Secara khusus, secara default ini membuat komit baru untuk setiap komit yang Anda kembalikan. Anda dapat menggunakan revert --no-commituntuk membuat perubahan dengan mengembalikan semuanya tanpa melakukan perubahan tersebut sebagai komitmen individu, kemudian berkomitmen pada waktu luang Anda.

ToxicFrog
sumber
git revert first-bad-commit..last-bad-commit: Saya pikir ini seharusnya git revert parent-of-first-bad-commit..last-bad-commit.
pengguna1071847
9

Pertanyaannya cukup lama tapi kembali masih membingungkan orang (seperti saya)

Sebagai seorang pemula, setelah beberapa kali coba-coba (lebih banyak kesalahan daripada percobaan) saya mendapat poin penting:

  • git revertmembutuhkan id dari komit yang ingin Anda hapus menyimpannya ke dalam riwayat Anda

  • git resetmemerlukan komit yang ingin Anda pertahankan , dan akibatnya akan menghapus apa pun setelah itu dari riwayat.

Artinya, jika Anda menggunakan revertdengan komit id pertama, Anda akan menemukan diri Anda ke dalam direktori kosong dan komit tambahan dalam riwayat, sementara dengan reset direktori Anda akan .. dikembalikan ke komit awal dan riwayat Anda akan menjadi seolah-olah komit terakhir tidak pernah terjadi.

Agar lebih jelas lagi, dengan log seperti ini:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

Menggunakan git revert cb76ee4will secara default akan membawa file Anda kembali ke 01b56c6 dan akan menambahkan komit lebih lanjut ke riwayat Anda:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 sebagai gantinya akan membawa file Anda kembali ke 01b56c6 dan akan membersihkan komit lainnya setelah itu dari riwayat Anda:

01b56c6 test
2e407ce first commit

Saya tahu ini adalah "dasar" tetapi cukup membingungkan bagi saya, dengan menjalankan revertid pertama ('komit pertama') saya berharap menemukan file awal saya, perlu beberapa saat untuk memahami, bahwa jika Anda membutuhkan file Anda kembali sebagai 'komit pertama' Anda perlu menggunakan id berikutnya.

nnsense
sumber
Saya telah mengamati hal yang sama. ini benar-benar membingungkan tetapi sangat penting untuk diketahui. baru-baru ini saya harus membantu rekan kerja dan melupakan hal ini. Itu agak memalukan.
ExOfDe
1

Saya mengembalikan beberapa komit dengan menjalankan 'git revert commit id' seperti:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

Kemudian saya diminta untuk melakukan pengembalian (seperti yang Anda lakukan saat menjalankan 'git commit'). Program terminal default saya adalah Vim jadi saya menjalankan:

:wq 

Akhirnya saya mendorong perubahan ke repositori dengan:

git push
jrc16
sumber