Biliyorum bu tarihin yeniden yazılması kötü yada yada.
Ancak uzak şubeden birkaç taahhüt kalıcı olarak nasıl kaldırılır?
Biliyorum bu tarihin yeniden yazılması kötü yada yada.
Ancak uzak şubeden birkaç taahhüt kalıcı olarak nasıl kaldırılır?
Yanıtlar:
Sen git reset --hardyerel şube size çalışma ağacı ve dizinden değişiklikleri kaldırmayı ve git push --forceuzaktan revize yerel şube. ( buradaki uzak dalı silip yeniden itmeyi içeren başka bir çözüm )
Bu SO yanıtı , özellikle insanlar kendi yerel depoları için uzak tarihe bağlıysa, böyle bir komutun tehlikesini göstermektedir.
İnsanları , man sayfasının UPSTREAM REBASE'DEN KURTARMA bölümüne yönlendirmeye hazır olmalısınız .git rebase
Git 2.23 (Ağustos 2019, dokuz yıl sonra) ile yeni komutu kullanırsınız git switch.
Yani:
( kaldırılacak taahhüt sayısı ile değiştirin )git switch -C mybranch origin/mybranch~nn
Bu, endeksi ve çalışma ağacını, bir olduğu gibi geri yükleyecektir git reset --hard.
push --forceuzakta
git gcuzak tarafta her zaman yeterince sık çalıştırılmaz. Örneğin GitHub'da: twitter.com/githubhelp/status/387926738161774592?lang=es
Sadece kullanmayı unutmayınız last_working_commit_idolmayan bir çalışma geri alırken, taahhüt
git reset --hard <last_working_commit_id>
Bu yüzden istemediğimiz duruma sıfırlamamalıyız commit_id.
O zaman emin olun, uzak şubeye itmeliyiz:
git push --force
git reset --hardyapması gerekiyor.
Bu öğreticide gösterilen üç seçenek vardır . Bağlantının kopması durumunda, burada ana adımları bırakacağım.
1 Tüm taahhüdü geri döndür
git revert dd61ab23
2 Son taahhüdü sil
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
veya şube yerel olarak kullanılabiliyorsa
git reset HEAD^ --hard
git push <<remote>> -f
Burada + dd61 ... işlem karmanızdır ve git x ^ 'i x'in ebeveyni olarak ve + ise zorla hızlı haber verilmeyen bir itme olarak yorumlar.
3 İşlemi listeden silin
git rebase -i dd61ab23^
Bu açılır ve tüm taahhütlerin listesini gösteren bir editör açılır. Kurtulmak istediğinizi silin. Rebase'i bitirin ve repo yapmak için gücü zorlayın.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Örneğin, son 3taahhütleri silmek istiyorsanız , dosya sisteminden (çalışma ağacı) değişiklikleri kaldırmak ve yerel şubenizdeki geçmişini (dizin) işlemek için aşağıdaki komutu çalıştırın:
git reset --hard HEAD~3
Ardından, uzak dalı geçmişini yeniden yazmaya zorlamak için aşağıdaki komutu (yerel makinenizde) çalıştırın:
git push --force
Tebrikler! Hepsi tamam!
Bazı notlar:
İstediğiniz taahhüt kimliğini çalıştırarak alabilirsiniz.
git log
Sonra yerini alabilir HEAD~Nile <desired-commit-id>böyle:
git reset --hard <desired-commit-id>
Eğer dosya sisteminde değişiklikleri koruyup istiyorsanız sadece endeksi (tarih işlemek), kullanım değiştirmek --softgibi bayrak git reset --soft HEAD~3. Ardından, en son değişikliklerinizi kontrol etme ve tümünü veya bir kısmını tutma veya bırakma şansınız olur. İkinci durumda runnig git statuso zamandan bu yana değişen dosyaları gösterir <desired-commit-id>. --hardSeçeneği kullanırsanız , git statusyerel şubenizin uzak olanla tam olarak aynı olduğunu söyleyecektir. Eğer kullanmıyorsanız --hardne de --soft, varsayılan mod olduğu kullanılır --mixed. Bu modda git help reset:
Dizini sıfırlar ancak çalışma ağacını sıfırlamaz (yani, değiştirilen dosyalar korunur ancak kesinleştirme için işaretlenmez) ve güncellenmeyenleri bildirir.
Bu çok geç olabilir ama bana yardımcı olan havalı 'nükleer' seçenek. Temel olarak komutu kullanarak filter-branchtüm git geçmişiniz boyunca çok sayıda dosya üzerinde dosyaları kaldırabilir veya bir şeyi değiştirebilirsiniz.
En iyi burada açıklanmaktadır .
Bu blog gönderisine benzer şekilde pctroll'un cevabından sadeleştirme .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Bazen bu sorunu çözmenin en kolay yolu, kodun iyi olduğunu bildiğiniz yerden yeni bir şube yapmaktır. Ardından, daha sonra diğer taahhütleri kiraz seçmeniz gerektiğinde, hatalı şube geçmişini yalnız bırakabilirsiniz. Bu ayrıca hiçbir taahhüt geçmişini kaybetmemenizi sağlar.
Yerel errant şubenizden:
git log
şubenin olmasını istediğiniz kesin karmayı kopyalayın ve git günlüğünden çıkın
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Şimdi tam istediğiniz gibi yeni bir şubeniz var.
Ayrıca, yeni şubenizde olmayan errant şubesinden belirli bir taahhüt tutmanız gerekiyorsa, ihtiyacınız olan belirli taahhüdü kiraz olarak seçebilirsiniz:
git checkout the_errant_branch
git log
İyi şubeye çekmeniz ve git günlüğünden çıkmanız gereken tek işlemin kesin karmasını kopyalayın.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Sırtını sıvazla.