Ingin mengubah master saya menjadi komit yang lebih lama, bagaimana saya bisa melakukan ini?

92

Saya ingin mengembalikan ke komit sebelumnya, dan kemudian menerbitkan kode itu, lalu kembali ke komit terbaru.

yaitu jadi master saya menunjuk ke versi komit yang lebih lama supaya saya bisa menghapus versi itu, lalu saya ingin kembali ke komit terbaru. Awalnya saya adalah salah satunya.

Bagaimana saya bisa melakukan ini?

Blankman
sumber

Jawaban:

100

Jika Anda ingin melakukan ini dan mengembalikan master ke komit sebelumnya:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

Kalau tidak:

git reset --hard master~1        # Reset current branch to one commit ago on master
Tyler Brock
sumber
1
Jadi setahun kemudian saya melihat ini dan berpikir ini adalah cara yang buruk untuk melakukannya. Yah, setidaknya itu agak mudah dimengerti.
Tyler Brock
1
ya ini sebabnya saya mendapat suara positif, mudah dimengerti, mungkin Anda harus menyajikan tautan ke cara yang lebih baik?
Andrew Atkinson
1
Saya harus melakukan hal yang sama menggunakan SourceTree. Prosesnya serupa. 1) buat cabang baru untuk status master saat ini, jadi Anda tidak akan kehilangan apa pun. 2) hapus master 3) buat cabang master baru, pilih komit yang diinginkan
Danilo Gomes
Apa yang terjadi dengan komit yang kami "hapus" dari master setelah ini?
Arthur Colombini Gusmão
1
Ini harus dihindari jika Anda memiliki repo jarak jauh. Ini menyebabkan beberapa kesalahan jika Anda melakukannya, karena alamat master pertama berbeda dari master baru yang Anda buat baru-baru ini.
MAChitgarha
60

Pertanyaan Anda tidak jelas. Saya pikir yang Anda minta adalah ini:

git push -f origin $old_commit_id:master

Apa yang akan dilakukannya? Ini akan mendorong $old_commit_idberkomitmen untuk originsebagai kepala baru origin's mastercabang.

Jika itu yang Anda inginkan, Anda tidak perlu menyentuh mastercabang lokal Anda sama sekali.

Aristoteles Pagaltzis
sumber
Ini menyebabkan master (non-fast-forward)kegagalan bagi saya. Solusi @jtdubs berhasil.
Bobby Norton
3
Lewati saja -funtuk memaksanya - meskipun repo jarak jauh dapat dikonfigurasi untuk melarang itu. Saya telah memperbarui jawabannya.
Aristoteles Pagaltzis
tidak berhasil untuk saya, namun jawaban yang diterima tidak
MobileM
Anda tidak mengatakan dengan tepat apa yang Anda inginkan atau mengapa itu tidak berhasil, jadi saya tidak dapat memberi tahu Anda mengapa tidak dan bagaimana itu bisa dibuat (jika bisa).
Aristoteles Pagaltzis
Anda tampaknya kehilangan sejarah masa lalu pada jarak jauh dengan pendekatan ini, baik-baik saja bagi saya. Hanya memanggilnya.
Shawn
43

menggunakan git reset --hard <old commit number>

itu akan mengatur ulang HEAD ke komit lama ini.

Selain itu, Anda perlu menggunakan git push -f originuntuk mengubah repo jarak jauh juga.

KawaiKx
sumber
34

Jika Anda ingin menghindari dorongan paksa, berikut ini cara mengembalikan repo Anda ke komit yang lebih lama dan mempertahankan semua pekerjaan intervensi:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

Selesai! Ganti 307a5cd dengan komit apa pun yang Anda inginkan di repo Anda.

(Saya tahu dua baris pertama dapat digabungkan, tetapi saya pikir itu membuatnya kurang jelas apa yang terjadi)

Ini dia secara grafis:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

Anda secara efektif menghapus c3 dan c4 dan mengatur proyek Anda kembali ke c2. Namun, c3 dan c4 masih tersedia di riwayat proyek Anda jika Anda ingin melihatnya lagi.

bronson
sumber
1
Ini bekerja tanpa hambatan! Jika Anda telah turun sejauh ini dan membaca ini - ini tampaknya cara terbersih untuk mengembalikan master ke komitmen yang lebih dalam.
ddisqq
Saya tidak dapat menemukan kata-kata untuk menjelaskan betapa saya mencintaimu untuk ini, saya sangat berterima kasih melebihi kata-kata karena dapat memperbaiki sesuatu yang telah saya disadap selama 6 jam sekarang dan menyebabkan saya sangat sakit kepala. Terima kasih Pak!!!!!!!
Kostas Tsakalidis
9

Dengan asumsi grafik komit seperti ini:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

Anda ingin melakukan pembayaran pertama masterdan membuat cabang yang mengarah ke tempat mastersaat ini:

git checkout master
git branch pointer master

Akan terlihat seperti ini sekarang:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

Sekarang Anda sudah berada di master, kami akan memberi tahu mastercabang untuk mundur satu komit:

git reset master~1

Sekarang, masterharus dipindahkan kembali satu spasi, tetapi pointercabang masih pada komit terbaru:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

Pada titik ini, Anda dapat mendorong masterke remote, atau di mana pun, lalu maju cepat menggabungkannya kembali ke pointercabang. Anda dapat membunuh pointercabang pada saat itu:

git push origin master
git merge --ff-only pointer
git branch -D pointer

Final:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)
C0M37
sumber
1
Jika asal / master berada di C, git push origin masterakan gagal dengan ujung cabang Anda saat ini berada di belakang mitra jarak jauhnya . Anda juga harus memberikan flag -f.
sassospicco
8

Anda bisa saja git checkout <commit-id>, melakukan apa pun yang perlu Anda lakukan, lalu git checkout masterkembali ke kode baru.

Jika Anda benar-benar perlu mengubah kode lama untuk merilisnya, Anda mungkin harus:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

Juga, saya tidak bisa merekomendasikan aliran git cukup. Itu membuat semua ini cukup mudah.

jtdubs
sumber
1

Untuk pindah ke versi sebelumnya:

git checkout <version hash>

lakukan pekerjaan Anda di sini dan lakukan dengan

git commit --amend

Untuk kembali ke master :

git checkout master

Pablo Fernandez
sumber
1
Itu tidak akan berhasil. git reset --hardmengarahkan cabang masternya kembali ke komit lama, jadi git checkout mastertidak akan melakukan apa-apa.
jtdubs
Benar, terima kasih atas koreksinya. +1 untuk Anda, akan menghapus jawaban saya juga, tetapi menurut saya commit --amendlangkah ini cukup berguna
Pablo Fernandez
Apa --amend?
Shafizadeh