it-swarm-id.com

Cara mengembalikan repositori Git ke komit sebelumnya

Bagaimana cara mengembalikan dari kondisi saya saat ini ke snapshot yang dibuat pada komit tertentu?

Jika saya melakukan git log, maka saya mendapatkan output berikut:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Bagaimana kembali ke komit mulai 3 November, yakni komit 0d1d7fc?

6795
Crazy Serb

Ini sangat tergantung pada apa yang Anda maksud dengan "kembalikan".

Beralih sementara ke komit yang berbeda

Jika Anda ingin sementara kembali ke sana, main-main, lalu kembali ke tempat Anda sekarang, yang harus Anda lakukan adalah memeriksa komit yang diinginkan:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Atau jika Anda ingin membuat komitmen saat berada di sana, silakan dan buat cabang baru saat Anda berada di sana:

git checkout -b old-state 0d1d7fc32

Untuk kembali ke tempat Anda dulu, periksa saja cabang tempat Anda berada lagi. (Jika Anda telah membuat perubahan, seperti biasa ketika berpindah cabang, Anda harus menghadapinya sebagaimana mestinya. Anda dapat mengatur ulang untuk membuangnya; Anda dapat menyimpan, checkout, menyimpan pop untuk membawanya, Anda dapat melakukan mereka ke cabang di sana jika Anda ingin cabang di sana.)

Sulit menghapus komitmen yang tidak dipublikasikan

Jika, di sisi lain, Anda ingin benar-benar menyingkirkan semua yang telah Anda lakukan sejak itu, ada dua kemungkinan. Pertama, jika Anda belum menerbitkan salah satu dari komitmen ini, cukup setel ulang:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Jika Anda mengacaukan, Anda sudah membuang perubahan lokal Anda, tetapi Anda setidaknya bisa kembali ke tempat Anda sebelumnya dengan mengatur ulang.

Batalkan komitmen yang dipublikasikan dengan komitmen baru

Di sisi lain, jika Anda telah menerbitkan karya, Anda mungkin tidak ingin mengatur ulang cabang, karena itu secara efektif menulis ulang sejarah. Dalam hal ini, Anda memang dapat mengembalikan komit. Dengan Git, kembalikan memiliki arti yang sangat spesifik: buat komit dengan tambalan terbalik untuk membatalkannya. Dengan cara ini Anda tidak menulis ulang riwayat apa pun.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

Manual git-revert sebenarnya membahas banyak hal ini dalam uraiannya. Tautan lain yang bermanfaat adalah bagian git-scm.com yang membahas git-revert .

Jika Anda memutuskan bahwa Anda tidak ingin mengembalikannya, Anda dapat mengembalikannya (seperti dijelaskan di sini) atau mengatur ulang kembali sebelum kembali (lihat bagian sebelumnya).

Anda juga dapat menemukan jawaban ini membantu dalam kasus ini:
Bagaimana cara memindahkan HEAD kembali ke lokasi sebelumnya? (Kepala terpisah)

8690
Cascabel

Mengembalikan Copy Pekerjaan ke Komit Terkini

Untuk kembali ke komitmen sebelumnya, abaikan perubahan apa pun:

git reset --hard HEAD

di mana HEAD adalah komit terakhir di cabang Anda saat ini

Mengembalikan Copy Pekerjaan ke Komit yang Lebih Lama

Untuk kembali ke komit yang lebih lama dari komit terbaru:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Kredit menuju pertanyaan Stack Overflow yang serupa,Kembalikan ke komit oleh hash SHA di Git?.

1451
boulder_ruby

Banyak jawaban rumit dan berbahaya di sini, tetapi sebenarnya mudah:

git revert --no-commit 0766c053..HEAD
git commit

Ini akan mengembalikan semuanya dari HEAD kembali ke hash komit, yang berarti akan membuat ulang kondisi komit di pohon kerja seolah-olah setiap komit karena telah berjalan kembali. Anda kemudian dapat mengkomit pohon saat ini, dan itu akan membuat komit baru yang pada dasarnya setara dengan komit yang Anda "kembalikan".

(Bendera --no-commit memungkinkan git mengembalikan semua komit sekaligus - jika tidak, Anda akan diminta untuk pesan untuk setiap komit dalam kisaran, mengotori riwayat Anda dengan komit baru yang tidak perlu.)

Ini adalah cara yang aman dan mudah untuk mengembalikan ke keadaan sebelumnya . Tidak ada riwayat yang dihancurkan, sehingga dapat digunakan untuk komitmen yang telah dipublikasikan.

1433
Yarin

Opsi terbaik untuk saya dan mungkin yang lain adalah opsi reset Git:

git reset --hard <commidId> && git clean -f

Ini telah menjadi pilihan terbaik bagi saya! Sederhana, cepat dan efektif!


Catatan: Seperti yang disebutkan dalam komentar jangan lakukan ini jika Anda berbagi cabang dengan orang lain yang memiliki salinan dari komitmen lama

Juga dari komentar, jika Anda menginginkan metode yang kurang 'gampang' yang bisa Anda gunakan

git clean -i

182
Pogrindis

Sebelum menjawab, mari kita tambahkan beberapa latar belakang, menjelaskan apa ini HEAD.

First of all what is HEAD?

HEAD hanyalah referensi untuk komit saat ini (terbaru) di cabang saat ini. Hanya ada satu HEAD tunggal pada waktu tertentu (tidak termasuk git worktree).

Konten HEAD disimpan di dalam .git/HEAD, dan berisi 40 byte SHA-1 dari commit saat ini.


detached HEAD

Jika Anda tidak menggunakan komit terbaru - artinya HEAD menunjuk komit sebelumnya dalam sejarah, itu disebutdetached HEAD.

 Enter image description here

Pada baris perintah akan terlihat seperti ini - SHA-1 bukannya nama cabang karena HEAD tidak menunjuk ke ujung cabang saat ini:

 Enter image description here


Beberapa opsi tentang cara memulihkan dari HEAD yang terpisah:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

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 dari titik ini pada:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Anda selalu dapat menggunakan reflog juga. git reflog akan menampilkan perubahan yang memperbarui HEAD dan memeriksa entri reflog yang diinginkan akan mengatur HEAD kembali ke komit ini.

Setiap kali HEAD dimodifikasi akan ada entri baru di reflog

git reflog
git checkout [email protected]{...}

Ini akan membuat Anda kembali ke komit yang Anda inginkan

 Enter image description here


git reset HEAD --hard <commit_id>

"Gerakkan" kepala Anda kembali ke komit yang diinginkan.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Catatan: ( Sejak Git 2.7 ) Anda juga dapat menggunakan git rebase --no-autostash juga.

Skema ini menggambarkan perintah mana melakukan apa. Seperti yang Anda lihat di sana reset && checkout ubah HEAD.

 Enter image description here

143
CodeWizard

Jika Anda ingin "uncommit", hapus pesan komit terakhir, dan kembalikan file yang dimodifikasi ke dalam pementasan, Anda akan menggunakan perintah:

git reset --soft HEAD~1
  • --soft menunjukkan bahwa file yang tidak dikomit harus disimpan sebagai file yang berfungsi berlawanan dengan --hard yang akan membuangnya.
  • HEAD~1 adalah komit terakhir. Jika Anda ingin mengembalikan komit 3, Anda bisa menggunakan HEAD~3. Jika Anda ingin mengembalikan ke nomor revisi tertentu, Anda juga bisa melakukannya menggunakan hash SHA.

Ini adalah perintah yang sangat berguna dalam situasi di mana Anda melakukan hal yang salah dan Anda ingin membatalkan komitmen terakhir itu.

Sumber: http://nakkaya.com/2009/09/24/git-delete-last-commit/

124

Saya telah mencoba banyak cara untuk mengembalikan perubahan lokal di Git, dan tampaknya ini berfungsi paling baik jika Anda hanya ingin kembali ke keadaan komit terbaru.

git add . && git checkout master -f

Deskripsi Singkat:

  • Ini TIDAK akan membuat komit seperti yang dilakukan git revert.
  • TIDAK akan melepaskan HEAD Anda seperti yang dilakukan oleh git checkout <commithashcode>.
  • Ini AKAN mengesampingkan semua perubahan lokal Anda dan HAPUS semua file yang ditambahkan sejak komit terakhir di cabang.
  • Ini hanya berfungsi dengan nama cabang, jadi Anda bisa kembali hanya ke komit terbaru di cabang dengan cara ini.

Saya menemukan cara yang jauh lebih mudah dan sederhana untuk mencapai hasil di atas:

git add . && git reset --hard HEAD

di mana HEAD menunjuk ke komit terbaru di cabang Anda saat ini.

Ini adalah kode kode yang sama seperti yang disarankan boulder_Ruby, tetapi saya telah menambahkan git add . sebelum git reset --hard HEAD untuk menghapus semua file baru yang dibuat sejak komit terakhir karena ini adalah apa yang kebanyakan orang harapkan saya percaya ketika kembali ke komit terbaru.

105
Roman Minenok

Anda dapat melakukan ini dengan dua perintah berikut:

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

Ini akan menghapus komit Git Anda sebelumnya.

Jika Anda ingin menyimpan perubahan, Anda juga dapat menggunakan:

git reset --soft [previous Commit SHA id here]

Maka itu akan menyimpan perubahan Anda.

94
kiran boghra

OK, kembali ke komit sebelumnya di git cukup mudah ...

Kembalikan kembali tanpa menyimpan perubahan:

git reset --hard <commit>

Kembalikan kembali dengan menjaga perubahan:

git reset --soft <commit>

Jelaskan: menggunakan reset git, Anda dapat mengatur ulang ke keadaan tertentu, itu biasa menggunakannya dengan hash komit seperti yang Anda lihat di atas.

Tetapi ketika Anda melihat perbedaannya menggunakan dua flag --soft dan --hard, secara default git reset menggunakan flag --soft, tetapi ini merupakan praktik yang baik selalu menggunakan flag, saya menjelaskan setiap flag:


--lembut

Bendera default seperti yang dijelaskan, tidak perlu menyediakannya, tidak mengubah pohon kerja tetapi menambahkan semua perubahan file yang siap untuk dikomit, jadi Anda kembali ke status komit di mana perubahan pada file menjadi tidak bertahap.


--keras

Hati-hati dengan bendera ini, ini akan mengatur ulang pohon yang berfungsi dan semua perubahan pada file yang dilacak dan semua akan hilang!


Saya juga membuat gambar di bawah ini yang mungkin terjadi dalam kehidupan nyata bekerja dengan git:

 git reset to a commit

63
Alireza

Tidak ada di sini yang berfungsi untuk saya selain dari kombinasi tepat ini:

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

Kuncinya di sini adalah memaksa Push, tidak ada komit/komit pesan tambahan dll.

59
serdarsenay

Katakanlah Anda memiliki komit berikut dalam file teks bernama ~/commits-to-revert.txt (Saya menggunakan git log --pretty=oneline untuk mendapatkannya)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Buat skrip Bash Shell untuk mengembalikan masing-masingnya:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

Ini mengembalikan semuanya kembali ke keadaan sebelumnya, termasuk kreasi file dan direktori, dan penghapusan, komit ke cabang Anda dan Anda mempertahankan histori, tetapi Anda mengembalikannya ke struktur file yang sama. Mengapa Git tidak memiliki git revert --to <hash> berada di luar jangkauan saya.

57
Lance Caraccioli

Alternatif Tambahan untuk Solusi Jefromi

Solusi Jefromi pasti yang terbaik, dan Anda harus menggunakannya. Namun, demi kelengkapan, saya juga ingin menunjukkan solusi alternatif lain yang juga dapat digunakan untuk mengembalikan komit (dalam arti bahwa Anda membuat komit baru yang membatalkan perubahan pada komit sebelumnya , hanya seperti apa yang git revert lakukan).

Agar lebih jelas, alternatif inibukan cara terbaik untuk mengembalikan komit, solusi Jefromi adalah , tapi saya hanya ingin menunjukkan bahwa Anda juga dapat menggunakan metode lain ini untuk mencapai hal yang sama dengan git revert.

Alternatif 1: Reset Keras dan Lunak

Ini adalah versi yang sangat sedikit dimodifikasi dari solusi Charles Bailey untuk Kembalikan ke komit oleh hash SHA di Git? :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}

# Commit the changes
git commit -m "Revert to <commit>"

Ini pada dasarnya bekerja dengan menggunakan fakta bahwa soft reset akan meninggalkan status komit sebelumnya yang dipentaskan dalam area indeks/staging, yang kemudian dapat Anda komit.

Alternatif 2: Hapus Pohon Saat Ini dan Ganti dengan yang Baru

Solusi ini berasal dari solusi svick untuk Checkout komit lama dan menjadikannya komit baru :

git rm -r .
git checkout <commit> .
git commit

Demikian pula dengan alternatif # 1, ini mereproduksi keadaan <commit> dalam copy pekerjaan saat ini. Anda perlu melakukan git rm terlebih dahulu karena git checkout tidak akan menghapus file yang telah ditambahkan sejak <commit>.

56
user456814

Dengan asumsi Anda berbicara tentang master dan pada cabang masing-masing (yang mengatakan, ini bisa menjadi cabang kerja yang Anda khawatirkan):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git Push -f Origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

Saya menemukan jawabannya dari dalam posting blog (sekarang tidak ada lagi)

Perhatikan bahwa ini adalah Reset dan Memaksa perubahan ke remote, sehingga jika orang lain di tim Anda sudah git menarik, Anda akan menimbulkan masalah bagi mereka. Anda menghancurkan sejarah perubahan, yang merupakan alasan penting mengapa orang menggunakan git.

Lebih baik menggunakan kembali (lihat jawaban lain) daripada mengatur ulang. Jika Anda tim satu orang maka mungkin tidak masalah.

55
markreyes

Berikut ini adalah jauh lebih sederhana cara untuk kembali ke komit sebelumnya (dan membuatnya dalam keadaan tidak terikat, untuk melakukan apa pun yang Anda suka):

git reset HEAD~1

Jadi, tidak perlu untuk melakukan id dan sebagainya :)

51
Paul Walczewski

Setelah semua perubahan, saat Anda Push semua perintah ini, Anda mungkin harus menggunakan:

git Push -f ...

Dan tidak hanya git Push.

34
sivi

Ada perintah (bukan bagian dari inti Git, tetapi ada di git-ekstra paket) khusus untuk mengembalikan dan menetapkan komitmen lama:

git back

Per halaman manual , juga dapat digunakan seperti:

# Remove the latest three commits
git back 3
33
Shadow Man

Anda dapat menyelesaikan semua langkah awal ini sendiri dan Push back to git repo.

  1. Tarik versi terbaru repositori Anda dari Bitbucket menggunakan perintah git pull --all.

  2. Jalankan perintah git log dengan -n 4 dari terminal Anda. Angka setelah -n menentukan jumlah komit dalam log mulai dari komit terbaru dalam sejarah lokal Anda.

    $ git log -n 4

  3. Setel ulang kepala riwayat repositori Anda menggunakan git reset --hard HEAD~N di mana N adalah jumlah komit yang ingin Anda ambil kembali. Dalam contoh berikut ini, head akan mengembalikan satu komit, ke komit terakhir dalam riwayat repositori:

  4. Dorong perubahan ke git repo menggunakan git Push --force untuk memaksa Dorong perubahan.

Jika Anda ingin repositori git ke komit sebelumnya

git pull --all
git reset --hard HEAD~1
git Push --force
29
Nanhe Kumar

Kembalikan ke terbaru komit dan abaikan semua perubahan lokal:

git reset --hard HEAD

Pilih komit yang diperlukan Anda, dan periksa dengan

git show HEAD
git show HEAD~1
git show HEAD~2 

sampai Anda mendapatkan komit yang diperlukan. Untuk membuat HEAD menunjuk ke sana, lakukan

git reset --hard HEAD~1

atau git reset --hard HEAD~2 atau apa pun.

26
tonythomas01

Ini adalah satu lagi cara untuk mengatur ulang secara langsung ke komit terbaru

git stash
git stash clear

Itu secara langsung menghapus semua perubahan yang telah Anda buat sejak komit terakhir.

PS: Ada sedikit masalah; itu juga menghapus semua perubahan simpanan Anda yang baru disimpan. Yang saya kira dalam banyak kasus seharusnya tidak masalah.

20
Point Networks

Untuk menjaga perubahan dari komit sebelumnya ke HEAD dan pindah ke komit sebelumnya, lakukan:

git reset <SHA>

Jika perubahan tidak diperlukan dari komit sebelumnya ke HEAD dan buang semua perubahan, lakukan:

git reset --hard <SHA>
20
Vishnu Atrai

Untuk benar-benar membersihkan direktori pembuat kode dari beberapa perubahan yang tidak disengaja, kami menggunakan:

git add -A .
git reset --hard HEAD

Hanya git reset --hard HEAD akan menyingkirkan modifikasi, tetapi itu tidak akan menyingkirkan file "baru". Dalam kasus mereka, mereka secara tidak sengaja menyeret folder penting di suatu tempat secara acak, dan semua file itu diperlakukan sebagai baru oleh Git, jadi reset --hard tidak memperbaikinya. Dengan menjalankan git add -A . sebelumnya, ia secara eksplisit melacak semuanya dengan git, untuk dihapus oleh reset.

20
Chris Moschini

Saya percaya beberapa orang mungkin datang ke pertanyaan ini ingin tahu bagaimana mengembalikan perubahan yang dilakukan pada tuannya - yaitu membuang semuanya dan kembali ke Asal/master, dalam hal ini, lakukan ini:

git reset --hard Origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-Origin-master

19
nevster

Kembalikan adalah perintah untuk mengembalikan komit.

git revert <commit1> <commit2> 

Contoh:

git revert 2h3h23233

Itu mampu mengambil jarak dari HEAD seperti di bawah ini. Di sini saya mengatakan "kembalikan komit terakhir."

git revert HEAD~1..HEAD

dan kemudian lakukan git Push

16

Kembalikan Komit Terkini:

git reset --hard HEAD

HEAD hanyalah referensi untuk komit saat ini (terbaru) di cabang saat ini. Hanya ada satu HEAD pada waktu tertentu.

Kembalikan ke Komit yang Lebih Lama: Cara tercepat untuk mengembalikan versi yang lama adalah dengan menggunakan perintah reset:

# Resets index to former commit
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

# Updates working copy to reflect the new commit
git reset --hard

Ini akan memundurkan cabang HEAD Anda ke versi yang ditentukan. Semua komit yang datang setelah versi ini secara efektif dibatalkan; proyek Anda persis seperti pada saat itu.

Perintah reset hadir dengan beberapa opsi, salah satu yang lebih menarik adalah bendera --soft. Jika Anda menggunakannya sebagai ganti --hard, Git akan membuat semua perubahan dalam "undone" dilakukan sebagai modifikasi lokal.

Memulihkan Revisi di Cabang Lokal Baru

Seperti yang dikatakan, menggunakan perintah reset pada cabang HEAD Anda adalah tindakan yang cukup drastis: itu akan menghapus semua komit (pada cabang ini) yang muncul setelah revisi yang ditentukan. Jika Anda yakin ini yang Anda inginkan, semuanya baik-baik saja.

Namun, ada juga cara lebih aman jika Anda lebih suka membiarkan cabang HEAD Anda saat ini tidak tersentuh. Karena "cabang" sangat murah dan mudah di Git, kita dapat dengan mudah membuat cabang baru yang dimulai pada revisi lama itu:

git checkout -b old-project-state 0ad5a7a6

Biasanya, perintah checkout hanya digunakan untuk berganti cabang. Namun, dengan memberikan parameter -b, Anda juga dapat membiarkannya membuat cabang baru (bernama old-project-state dalam contoh ini). Jika Anda tidak ingin memulai dari revisi HEAD saat ini, Anda juga perlu memberikan hash komit - revisi proyek lama yang ingin kami pulihkan.

Anda sekarang memiliki cabang baru bernama old-project-state mencerminkan versi lama proyek Anda - tanpa menyentuh atau bahkan menghapus komit atau cabang lainnya.

16
Lyes CHIOUKH

Jika situasinya adalah satu yang mendesak , dan Anda hanya ingin melakukan apa yang diminta penanya dalam cepat dan kotor cara, dengan asumsi proyek Anda berada di bawah direktori "proyek saya":

  1. Salin seluruh direktori dan sebut itu sesuatu yang lain, seperti "proyek saya - salin"

  2. Melakukan:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

Anda kemudian memiliki dua versi di sistem Anda ... Anda dapat memeriksa atau menyalin atau memodifikasi file yang menarik, atau apa pun, dari komit sebelumnya. Anda dapat benar-benar membuang file di bawah "proyek saya - salin", jika Anda telah memutuskan bahwa pekerjaan baru itu tidak akan berhasil ...

Hal yang jelas jika Anda ingin melanjutkan dengan keadaan proyek tanpa benar-benar membuang pekerjaan karena komit yang diambil ini adalah mengubah nama direktori Anda lagi: Hapus proyek yang mengandung komit yang diambil (atau berikan nama sementara) dan ganti nama Anda " proyek saya - salin "direktori kembali ke" proyek saya ". Maka mungkin lakukan komitmen lain cukup cepat.

Git adalah ciptaan yang brilian tetapi Anda tidak bisa hanya "mengambilnya dengan cepat": juga orang yang mencoba menjelaskannya terlalu sering mengasumsikan pengetahuan sebelumnya tentang VCS [Sistem Kontrol Versi] lainnya dan mempelajari jauh terlalu dalam terlalu cepat, dan melakukan kejahatan lain, seperti menggunakan istilah yang bisa dipertukarkan untuk "memeriksa" - dengan cara yang kadang-kadang tampak hampir diperhitungkan untuk membingungkan pemula.

Untuk menyelamatkan diri Anda dari banyak stres, Anda harus membaca buku tentang Git - saya akan merekomendasikan "Kontrol Versi dengan Git" . Dan jika Anda dapat mempercayai saya (atau lebih tepatnya bekas luka saya) ketika saya mengatakan "harus", maka Anda sebaiknya melakukannyaNOW. Sebagian besar kompleksitas Git berasal dari percabangan dan kemudian pembuatan kembali. Tetapi dari pertanyaan Anda ada tidak ada alasan mengapa orang harus membutakan Anda dengan sains .

Terutama jika, misalnya, ini adalah situasi yang menyedihkan dan Anda seorang pemula dengan Git!

PS: Satu pemikiran lain: Ini (sekarang) sebenarnya cukup sederhana untuk menyimpan repositori Git ("repo") dalam direktori selain dari yang memiliki file yang berfungsi. Ini berarti Anda tidak perlu menyalin seluruh repositori Git menggunakan solusi cepat & kotor di atas. Lihat jawabannya oleh Fryer menggunakan --separate-git-dir di sini . Diperingatkan , meskipun: Jika Anda memiliki repositori "direktori terpisah" yang tidak Anda salin, dan Anda melakukan hard reset, semua versi setelah komit reset akan hilang selamanya, kecuali Anda memiliki , seperti yang seharusnya Anda lakukan, secara teratur mencadangkan repositori Anda, lebih disukai ke cloud (misalnya Google Drive ) di antara tempat-tempat lain.

13
mike rodent

Cobalah mengatur ulang ke komit yang diinginkan -

git reset <COMMIT_ID>

(untuk memeriksa COMMIT_ID gunakan git log)

Ini akan mengatur ulang semua file yang diubah ke status tidak ditambahkan.

Sekarang Anda dapat checkout semua file yang belum ditambahkan oleh

git checkout .

Periksa git log untuk memverifikasi perubahan Anda.

PERBARUI

Jika Anda memiliki satu dan hanya melakukan dalam repo Anda, cobalah

git update-ref -d HEAD

13
optimistanoop

Peringatan! Perintah ini dapat menyebabkan hilangnya komit, jika pengguna salah memasukkan komit. Selalu miliki cadangan ekstra git Anda di tempat lain untuk berjaga-jaga jika Anda melakukan kesalahan, daripada Anda sedikit lebih aman. :)

Saya memiliki masalah serupa dan ingin kembali ke Komit sebelumnya. Dalam kasus saya, saya tidak tertarik untuk membuat komit yang lebih baru maka saya menggunakan Hard.

Beginilah cara saya melakukannya:

git reset --hard CommitId && git clean -f

Ini akan kembali ke repositori lokal, di sini setelah menggunakan git Push -f akan memperbarui repositori jarak jauh.

git Push -f

Saat komit Anda didorong dari jarak jauh, Anda harus menghapusnya. Biarkan saya menganggap cabang Anda berkembang dan didorong Asal.

Anda harus terlebih dahulu menghapus pengembangan dari Origin:

git Push Origin :develop (note the colon)

Maka Anda perlu mengembangkan ke status yang Anda inginkan, izinkan saya menganggap hash komit adalah EFGHIJK:

git reset --hard EFGHIJK

Terakhir, Push berkembang lagi:

git Push Origin develop
11
George Ninan

Di GitKraken Anda dapat melakukan ini:

  1. Klik kanan pada komit yang ingin Anda atur ulang, pilih: Setel ulang ke komit ini/Hard:

 enter image description here

  1. Klik kanan pada komit lagi, pilih: Nama cabang saat ini/Push:

 enter image description here

  1. Klik pada Force Push:

 enter image description here

Obs. : Anda harus berhati-hati karena semua riwayat komit setelah hard reset hilang dan tindakan ini tidak dapat dibatalkan. Anda harus yakin apa yang Anda lakukan.

10
Ângelo Polotto

Jika Anda ingin memperbaiki beberapa kesalahan di komit terakhir, alternatif yang baik akan menggunakan git commit --amend command. Jika komit terakhir tidak ditunjukkan oleh referensi, ini akan melakukan trik, karena membuat komit dengan induk yang sama dengan komit terakhir. Jika tidak ada referensi ke komit terakhir, komis tersebut akan dibuang dan komit ini akan menjadi komit terakhir. Ini adalah cara yang baik untuk mengoreksi komitmen tanpa mengembalikan komitmen. Namun memiliki keterbatasan sendiri.

10
Upul Doluweera

Pertama, dapatkan string yang mengidentifikasi komit di beberapa tanggal, lakukan:

git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

itu mencetak pengidentifikasi komit, ambil string (misalnya XXXX) dan lakukan:

git checkout XXXX
9
Luca C.

Untuk mengembalikan (atau mengembalikan):

  1. git revert --no-commit "commit-code-to-remove" HEAD (mis. git revert --no-commit KEPALA d57a39d)
  2. git melakukan
  3. git Push

Coba dua langkah di atas, dan jika Anda menemukan ini yang Anda inginkan maka git Push.

Jika Anda menemukan sesuatu yang salah lakukan:

git revert --abort

9
Jagraj Singh

Ini dapat dilakukan dengan lebih mudah dengan SourceTree . Klik kanan komit yang Anda cari dan pilih 'Checkout' dari menu.

 enter image description here

8
Marcin Szymczak

Namun solusi lain yang paling sederhana; Anda harus mengubah cabang untuk melakukan ini, tetapi setelah itu Anda bisa menjalankan:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

Saya tidak dapat mengembalikan milik saya secara manual karena beberapa alasan, jadi di sinilah akhirnya saya melakukannya.

  1. Memeriksa cabang yang saya inginkan, menyalinnya.
  2. Lihat cabang terbaru.
  3. Menyalin konten dari cabang saya ingin ke direktori cabang terbaru menimpa perubahan dan melakukan itu.
7
Demodave
git reflog

Pilih jumlah HEAD (s) dari git reflog, tempat Anda ingin kembali dan melakukan (untuk contoh ini saya memilih 12):

git reset [email protected]{12} --hard
7
Sérgio

Cara paling tidak rumit untuk mengembalikan cabang ke komit tertentu di mana Anda tidak dapat mengubah riwayat yang saya temukan adalah dengan:

  1. checkout komit atau cabang keinginan Anda untuk kembali.
  2. Edit .git/KEPALA dan ubah ref ke cabang tempat Anda ingin kembali.

Seperti:

echo 'ref: refs/heads/example' > .git/HEAD

Jika kemudian Anda melakukan status git, Anda akan melihat semua perubahan di antara cabang yang Anda gunakan dan yang ingin Anda kembalikan.

Jika semuanya terlihat baik, Anda dapat melakukan. Anda juga dapat menggunakan git diff revert..example untuk memastikan bahwa itu sama.

6
jgmjgm

Jika Anda ingin mengembalikan sementara perubahan karena

  • seseorang melakukan kode yang melanggar build atau merusak fungsionalitas yang sedang Anda kerjakan

Anda dapat mencari komit yang berfungsi terakhir menggunakan git log kemudian jalankan

git rebase --onto <commitId>

Ketika cabang jarak jauh bekerja kembali, Anda bisa

git pull --rebase

Metode ini lebih baik daripada checkout git untuk perubahan sementara, karena Anda tidak dalam keadaan terpisah.

5
joseph

Menyetel Ulang Perubahan dan Komitmen Bertahap

Perintah git reset memungkinkan Anda mengubah HEAD - komit terbaru yang menunjuk pohon kerja Anda ke-dari repositori Anda. Ini memodifikasi area pementasan atau area pementasan dan pohon yang bekerja. Kemampuan Git untuk membuat komitmen persis seperti yang Anda inginkan berarti bahwa Anda terkadang harus membatalkan perubahan terhadap perubahan yang Anda lakukan dengan git add. Anda dapat melakukannya dengan memanggil git reset HEAD <file to change>. Anda memiliki dua opsi untuk menyingkirkan perubahan sepenuhnya. git checkout HEAD <file(s) or path(s)> adalah cara cepat untuk membatalkan perubahan pada area pementasan dan pohon kerja Anda. Berhati-hatilah dengan perintah ini, karena menghapus semua perubahan pada pohon kerja Anda. Git tidak tahu tentang perubahan itu karena mereka tidak pernah berkomitmen. Tidak ada cara untuk mendapatkan perubahan itu kembali setelah Anda menjalankan perintah ini. Perintah lain yang Anda inginkan adalah git reset --hard. Ini sama merusak pohon kerja Anda - setiap perubahan yang tidak dikomit atau perubahan bertahap hilang setelah menjalankannya. Menjalankan git reset -hard HEAD melakukan hal yang sama dengan checkout git HEAD. itu hanya tidak memerlukan file atau jalur untuk bekerja. Anda dapat menggunakan --soft dengan git reset. Ini mengatur ulang repositori ke komit yang Anda tentukan dan tahapan semua perubahan itu. Perubahan apa pun yang telah Anda lakukan tidak akan terpengaruh, atau perubahan dalam pohon kerja Anda. Akhirnya, Anda dapat menggunakan --mixed untuk mengatur ulang pohon kerja tanpa melakukan perubahan apa pun. Ini juga membatalkan tahapan perubahan apa pun yang dilakukan.

Mengembalikan Komitmen

Terkadang kita membuat kesalahan. Komit yang tidak seharusnya dibagikan akan didorong ke repositori publik, komit memiliki bug yang tidak dapat diperbaiki dan perlu diurungkan, atau mungkin Anda hanya tidak memerlukan kode itu lagi. panggilan untuk git revert. Perintah git revert tidak hanya apa yang Anda harapkan. Ini mengembalikan satu komit dengan menerapkan komit terbalik ke sejarah. Kadang-kadang Anda perlu mengembalikan beberapa komit untuk sepenuhnya membatalkan perubahan. Anda dapat menggunakan -no-commit, atau Anda dapat menggunakan -n untuk memberi tahu Git untuk melakukan pengembalian tetapi berhentilah melakukan perubahan. Ini memungkinkan Anda menggabungkan semua komit pengembalian menjadi satu komit, yang berguna jika Anda perlu mengembalikan fitur yang mencakup beberapa komit. Pastikan Anda mengembalikan komit dalam urutan terbalik - komit terbaru terlebih dahulu. Jika tidak, Anda mungkin membingungkan Git dengan mencoba mengembalikan kode yang belum ada.

2
SAIguru011