Master'ımı daha eski bir kayıtla değiştirmek istiyorum, bunu nasıl yapabilirim?


92

Önceki bir işleme geri dönmek ve ardından bu kodu yayınlamak, ardından en son kaydetmeye geri dönmek istiyorum.

yani, ustam daha eski bir commit versiyonunu işaret ediyor, böylece o versiyonu bitirebileyim, sonra en son commit'e geri dönmek istiyorum Başlangıçta biriydim.

Bunu nasıl yapabilirim?

Yanıtlar:


100

Bunu yapmak ve ana kopyayı önceki işleme geri döndürmek istiyorsanız:

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

Alternatif olarak:

git reset --hard master~1        # Reset current branch to one commit ago on master

1
Yani bir yıl sonra buna bakıyorum ve bunun bunu yapmanın korkunç bir yolu olduğunu düşünüyorum. En azından anlaşılması biraz kolay.
Tyler Brock

1
evet bu yüzden oy verdim, anlaşılması kolay, belki daha iyi bir yol için bir bağlantı sunmalıydın?
Andrew Atkinson

1
SourceTree kullanarak aynısını yapmak zorunda kaldım. Süreç benzer. 1) mevcut ana durum için yeni dal oluşturun, böylece hiçbir şey kaybetmezsiniz. 2) silme ana 3), yeni bir ana dal oluşturmak seçerek tamamlama istenen
Danilo Gomes

Bundan sonra ustadan "çıkardığımız" işleme ne olur?
Arthur Colombini Gusmão

1
Uzak bir deponuz varsa bundan kaçınılmalıdır. Bunu yaparsanız bazı hatalara neden olur, çünkü ilk ana bilgisayarın adresi yakın zamanda oluşturduğunuz yeni ana makineden farklıdır.
MAChitgarha

60

Sorunuz net değil. Ben düşünüyorum ne için soruyorsun şudur:

git push -f origin $old_commit_id:master

Bu ne yapacak? Bu itecek $old_commit_idtaahhüt originyeni başkanı olarak originbireyin masterdalı.

İstediğiniz buysa, yerel masterşubenize hiç dokunmanıza gerek yoktur .


Bu master (non-fast-forward)benim için bir başarısızlığa neden oldu . @jtdubs çözümü çalıştı.
Bobby Norton

3
Sadece geçmesine -fzorlamak - Uzaktan Repo korusun şekilde yapılandırılmış olabilir gerçi. Cevabı güncelledim.
Aristo Pagaltzis

benim için çalışmıyor, kabul edilen cevap yine de işe yarıyor
MobileMon

Tam olarak ne istediğini ya da neden işe yaramadığını söylemedin, bu yüzden neden olmadığını ve nasıl yapılabileceğini söyleyemem (eğer yapabilseydi).
Aristotle Pagaltzis

Bu yaklaşımla uzaktan geçmiş geçmişinizi kaybetmişsiniz gibi görünüyorsunuz, benim için iyiydi. Sadece sesleniyorum.
Shawn

43

kullanım git reset --hard <old commit number>

HEAD'i bu eski işleme sıfırlayacaktır.

ayrıca, git push -f originuzak depoyu değiştirmek için de kullanmanız gerekir .


34

Zorla zorlamaktan kaçınmak istiyorsanız, deponuzu daha eski bir işleme döndürmek ve araya giren tüm işleri nasıl koruyacağınız aşağıda açıklanmıştır:

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!

Bitti! Deponuzda istediğiniz commit ile 307a5cd'yi değiştirin.

(İlk iki çizginin birleştirilebileceğini biliyorum, ancak bu, neler olup bittiğini daha az açık hale getiriyor)

İşte grafiksel olarak:

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

Etkili bir şekilde c3 ve c4'ü kaldırır ve projenizi c2 olarak ayarlarsınız. Bununla birlikte, c3 ve c4, onları bir daha görmek isterseniz, proje geçmişinizde hala mevcuttur.


1
Bu sorunsuz çalıştı! Buraya kadar geldiyseniz ve bunu okuyorsanız - bu, ustayı daha derin bir işleme döndürmenin en temiz yolu gibi görünüyor.
ddisqq

Bunun için seni ne kadar sevdiğimi açıklayacak kelimeleri bulamıyorum, 6 saattir beni rahatsız eden ve başımı ağrıtan bir şeyi düzelttiğim için kelimelerin ötesinde harikayım. Teşekkürler bayım!!!!!!!
Kostas Tsakalidis

9

Böyle bir commit grafiği varsayarsak:

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

Önce ödeme yapmak masterve masterşu anda nerede olduğunu gösteren bir şube oluşturmak istiyorsunuz :

git checkout master
git branch pointer master

Şimdi şöyle görünmeli:

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

Artık zaten devam ettiğinize göre master, masterşubeye bir işlem geri gitmesini söyleyeceğiz :

git reset master~1

Şimdi, masterbir boşluk geri taşınmalı, ancak pointerdal hala en son işlemdedir:

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

Bu noktada, masterbir uzaktan kumandaya itebilir veya herhangi bir yerde hızlı ileri sararak onu tekrar pointerdalda birleştirebilirsiniz . Bu pointernoktada dalı öldürebilirsiniz :

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

Final:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)

1
Orijin / ana birim C'de ise, mevcut dalınızın ucu uzaktaki emsalinin arkasında olduğu içingit push origin master başarısız olur . Ayrıca bir -f bayrağı da iletmelisiniz.
sassospicco

8

Sadece git checkout <commit-id>, yapmanız gereken her şeyi yapabilir, ardından git checkout masteryeni koda geri dönebilirsiniz.

Eski kodu serbest bırakmak için gerçekten değiştirmeniz gerekiyorsa, muhtemelen:

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

Ayrıca git akışını yeterince tavsiye edemem . Bütün bunları oldukça kolaylaştırıyor.


1

Önceki bir sürüme geçmek için:

git checkout <version hash>

işini burada yap ve birlikte yap

git commit --amend

Geri dönmek için ana :

git checkout master


1
Bu işe yaramaz. git reset --hardana dalını eski taahhüdüne işaret etti, bu yüzden git checkout masterhiçbir şey yapmayacak.
jtdubs

Doğru, düzeltme için teşekkürler. +1 size, cevabımı da kaldırırdı, ancak commit --amendadımın yeterince yararlı olduğunu düşünüyorum
Pablo Fernandez

Nedir --amend?
Shafizadeh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.