Dapatkah saya menghapus komit git, tetapi menyimpan perubahan

Di salah satu cabang pengembangan saya, saya membuat beberapa perubahan pada basis kode saya. Sebelum saya bisa menyelesaikan fungsi yang sedang saya kerjakan, saya harus mengganti cabang saat ini ke disk master untuk mendemonstrasikan beberapa fungsi. Tapi itu hanya dengan bantuan dari "git checkout" wizard bahwa perubahan yang saya juga buat pada cabang pengembangan saya dipertahankan, dengan demikian me>

Sekarang saya telah menyelesaikan demonstrasi dan kembali bekerja di cabang pengembangan saya, saya ingin menghapus "perbaikan sementara" yang saya lakukan sambil menjaga semua perubahan yang saya buat. Apakah mungkin?

651
02 апр. atur tanookiben 02 Apr 2013-04-02 21:56 '13 pada 21:56 2013-04-02 21:56
@ 10 jawaban

Sangat sederhana:

 git reset HEAD^ 

git reset tanpa --hard atau --soft menggerakkan HEAD Anda untuk menunjukkan komit yang ditentukan, tanpa mengubah file apa pun. HEAD^ mengacu pada fiksasi orang tua (pertama) dari komit Anda saat ini, yang dalam kasus Anda adalah perbaikan untuk perbaikan sementara.

Perhatikan bahwa opsi lain harus berjalan seperti biasa, dan kemudian mulai pada titik fiksasi berikutnya:

 git commit --amend [-m … etc] 

yang sebaliknya akan mengedit komit terakhir, memiliki efek yang sama seperti di atas.

Perhatikan bahwa ini (seperti hampir semua respons git) dapat menyebabkan masalah jika Anda telah menekan pegangan yang buruk ke tempat di mana orang lain dapat menariknya keluar. Coba hindari ini.

1060
02 апр. jawabannya diberikan oleh Gareth 02 April. 2013-04-02 21:58 '13 pada 21:58 2013-04-02 21:58

Ada dua cara untuk menangani ini. Apa yang lebih mudah tergantung pada situasi Anda.

Setel u>

Jika komit yang ingin Anda singkirkan adalah komit terakhir, dan Anda tidak melakukan pekerjaan tambahan, Anda bisa menggunakan git-reset

 git reset HEAD^ 

Kembalikan cabang Anda ke komit tepat sebelum KEPALA Anda saat ini. Namun, ini sebenarnya tidak mengubah file di pohon kerja Anda. Akibatnya, perubahan yang dilakukan pada komit ini ditampilkan sebagai diubah - ini mirip dengan perintah uncommit. Sebenarnya, saya memiliki nama samaran untuk melakukan ini.

 git config --global alias.uncommit 'reset HEAD^' 

Kemudian Anda bisa menggunakan git uncommit di masa depan untuk membuat cadangan satu komit.

menghancurkan

Menghancurkan komit berarti menggabungkan dua atau lebih komit menjadi satu. Saya cukup sering melakukannya. Dalam kasus Anda, Anda telah memperbaiki fungsinya dengan setengah siap, dan kemudian Anda menyelesaikannya dan mengirimkannya lagi dengan pesan permanen yang benar tentang komit.

 git rebase -i <ref> 

Saya berbicara di atas karena saya ingin memperjelas bahwa ini dapat berupa jumlah komitmen yang kembali. Jalankan git log dan temukan komit yang ingin Anda singkirkan, salin SHA1 dan gunakan sebagai ganti <ref> . Git akan menempatkan Anda dalam mode rebase interaktif. Itu akan menunjukkan semua komit antara keadaan Anda saat ini dan apa yang Anda tempatkan di <ref> . Jadi jika <ref> 10 melakukan kembali, itu akan menampilkan semua 10 komitmen.

Sebelum setiap komit dia akan pick kata. Temukan komit yang ingin Anda singkirkan dan ubah dari pick ke fixup atau squash . Menggunakan perbaikan hanya membuang pesan, yang memperbaiki pesan, dan menggabungkan perubahan dengan pendahulunya >squash melakukan hal yang sama, tetapi memungkinkan Anda untuk mengedit pesan komit dari komit yang baru saja digabungkan.

Perhatikan bahwa komit akan dikomit u>

PERINGATAN:

Pindah mengubah cerita - JANGAN lakukan ini dengan komitmen apa pun yang telah Anda bagikan dengan pengembang lain.

untuk bersembunyi

Di masa mendatang, untuk menghindari masalah ini, pertimbangkan untuk menggunakan git stash untuk menyimpan sementara pekerjaan yang tidak dikomit.

 git stash save 'some message' 

Ini akan menyimpan perubahan Anda saat ini ke daftar di cache Anda. Di atas adalah versi paling eksplisit dari perintah simpanan, yang memungkinkan Anda untuk berkomentar untuk menggambarkan apa yang Anda simpan. Anda juga dapat menjalankan git stash dan tidak ada yang lain, tetapi pesan tersebut tidak akan disimpan.

Anda dapat melihat daftar cache dari ...

 git stash list 

Ini akan menunjukkan semua cache Anda, di cabang mana mereka dibuat, serta pesan di awal setiap baris, serta pengidentifikasi cache ini, yang terlihat seperti stash@{#} ini stash@{#} mana # posisinya di dalam array cache,

Untuk memulihkan cache (yang dapat dilakukan di cabang mana pun, di mana pun cache awalnya dibuat), Anda cukup menjalankan ...

 git stash apply stash@{#} 

Sekali lagi, # adalah posisi dalam array cache. Jika cache yang ingin Anda pulihkan ada di posisi 0 artinya, itu adalah cache terakhir. Kemudian Anda cukup menjalankan perintah tanpa menentukan posisi simpanan, git akan menganggap bahwa yang Anda maksud adalah yang terakhir: git stash apply .

Jadi, misalnya, jika saya berada di cabang yang salah - saya dapat menjalankan urutan perintah berikut.

 git stash git checkout <correct_branch> git stash apply 

Dalam kasus Anda, Anda bergerak sedikit di sepanjang cabang, tetapi gagasan yang sama masih berlaku.

Semoga ini bisa membantu.

130
03 апр. jawabannya diberikan eddiemoya 03 April. 2013-04-03 06:55 '13 pada 6:55 2013-04-03 06:55

Ya, Anda dapat menghapus komit Anda tanpa menghapus perubahan: git reset @ ~

30
23 авг. Balas diberikan oleh DURGESH Chaurasiya 23 Agu. 2016-08-23 21:44 '16 pada 21:44 2016-08-23 21:44

Saya pikir Anda mencari ini.

git reset --soft HEAD~1

Itu membatalkan komitmen terbaru, sementara pada saat yang sama menjaga perubahan yang dibuat untuk komitmen ini pada tahap persiapan.

28
09 марта '18 в 12:57 2018-03-09 12:57 jawabannya diberikan oleh Sudhanshu Jain 9 Maret '18 pada 12:57 2018-03-09 12:57

Dalam kasus saya, saya sudah mengklik repo. Ups!

Anda dapat mengembalikan komit tertentu dengan menyimpan perubahan ke file lokal dengan menjalankan:

 git revert -n <sha> 

Dengan cara ini, saya bisa menyimpan perubahan yang saya butuhkan dan menonaktifkan komit yang sudah ditekan.

5
18 мая '17 в 17:20 2017-05-18 17:20 membalas Wim Feijen pada 18 Mei 17 di 17:20 2017-05-18 17:20

Bagi yang menggunakan zsh, Anda harus menggunakan yang berikut:

git reset --soft HEAD\^

Dijelaskan di sini: https://github.com/robbyrussell/oh-my-zsh/issues/449

Jika URL menjadi mati, bagian yang penting adalah:

Melarikan diri di tim Anda

Anda juga dapat menggunakan HEAD ~ jadi Anda tidak perlu menghindarinya setiap kali.

5
18 авг. balasan yang diberikan oleh Greg Hilston 18 Agustus. 2018-08-18 22:02 '18 jam 10:02 malam 2018-08-18 22:02

Menggunakan git 2.9 (tepatnya 2.9.2.windows.1) git reset HEAD^ atur git reset HEAD^ meminta lebih banyak; Tidak yakin apa yang diharapkan di sini. Lihat screenshot di bawah ini

2019

22 нояб. Jawabannya diberikan nkharche 22 Nov. 2017-11-22 13:03 '17 pada 1:03 siang 2017-11-22 13:03

Cara lain untuk melakukan ini.

Tambahkan komit di bagian atas perbaikan sementara, dan kemudian jalankan:

 git rebase -i 

Gabungkan dua komit menjadi satu (perintah akan membuka file teks dengan instruksi eksplisit, edit).

2
02 апр. jawabannya diberikan Ruslan Osipov 02 Apr 2013-04-02 22:59 '13 pada 10:59 malam 2013-04-02 22:59
 git reset HEAD^ 

KEPALA adalah ID perbaikan Anda

1
06 дек. Jawaban diberikan oleh Mike pada 06 Des. 2017-12-06 23:02 '17 pada 11:02 malam 2017-12-06 23:02

Saya menggunakan desktop github dan menggunakan item menu tolak komit terakhir .. bekerja seperti pesona.

0
06 дек. jawabannya diberikan saju 06 des. 2017-12-06 23:02 '17 pada 11:02 malam 2017-12-06 23:02

Pertanyaan lain tentang tag atau Ajukan Pertanyaan