Bir hata yaptım ve depodaki son gönderimi nasıl sileceğimi bilmiyorum. Uygulamanın en son güncellemelerini alıyorum ancak çakışmaları var ve depoya itiyorum.
Son kaydımı nasıl silebilirim? Veya nasıl düzeltilir?
Yanıtlar:
Aynı kod deposundan diğer kişilerle çalışıyorsanız İlk olarak, sen olmamalı Deponun üzerinde güncelleştirme zorlamak zaman eğer (yasadışı durumda örneğin iş arkadaşlarınızla yerel depoları bırakacak beri taahhüt silmek sildiğinizden sonra yaptığınız işlemlerde, bu taahhütler artık var olmayan bir işleme dayalı olduklarından geçersiz olacaktır).
Yapabileceğin şeyin taahhüdü geri almak olduğunu söyledi. Bu prosedür, kullandığınız CVS'ye bağlı olarak farklı şekilde yapılır (farklı komutlar):
On Git :
git revert <commit>
Açık mercurial :
hg backout <REV>
DÜZENLEME: Geri alma işlemi, geri çevrilen kesinleştirme işleminin tersini yapan yeni bir işlem yaratır (örneğin, orijinal kesinleştirme bir satır eklerse, geri döndürme kesinleştirme bu satırı siler), depo geçmişini yeniden yazmadan istenmeyen kaydetme değişikliklerini etkili bir şekilde kaldırır.
git backout <REV>
? Ya da: hg backout <REV>
?
Eğer varsa değil başkaları ile çalışan (veya onlara önemli sıkıntıya sokacak mutluyuz) , o zaman bitbucket dallardan kaydedilmesini kaldırmak mümkündür.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
Git'te genel olarak, ana dal özel değildir - bu sadece bir uzlaşmadır. Bununla birlikte, bitbucket ve github ve benzeri siteler genellikle bir ana dalın olmasını gerektirir (muhtemelen bir deponun dallarının olmadığı olayı işlemek için daha fazla kod yazmaktan daha kolaydır - emin değilim). Öyleyse yeni bir şube oluşturmanız ve bunu ana dal yapmanız gerekir:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
Bitbucket'ta, depo ayarlarına gidin ve "Ana dalı" olarak değiştirin master_temp
( Github'da "Varsayılan dalı" değiştirin).
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Şimdi Bitbucket'a gidin ve istediğiniz geçmişi görmelisiniz. Şimdi ayarlar sayfasına gidebilir ve Ana şubeyi tekrar olarak değiştirebilirsiniz master
.
Bu süreç, diğer tüm geçmiş değişiklikleriyle de çalışacaktır (örneğin git filter-branch
). Yeni geçmiş eskisinden ayrılmadan önce uygun işlemlere sıfırladığınızdan emin olmalısınız.
düzenleme : görünüşe göre, bir sıfırlama dalını zorla itebildiğiniz için, github'daki tüm bu güçlüklere gitmenize gerek yok .
Bir dahaki sefere birisi sizin deponuzdan veri çekmeye çalıştığında (eğer kötü commit'i zaten çekmişlerse), çekme başarısız olacaktır. Değiştirilen geçmişten önce bir işlemeye manuel olarak sıfırlamaları ve ardından tekrar çekmeleri gerekir.
git reset HEAD^
git pull
Kötü taahhüdü çekmiş ve üstüne taahhüt vermişlerse, o zaman sıfırlamak zorunda kalacaklar ve sonra git cherry-pick
oluşturmak istedikleri iyi taahhütler, kötü taahhüt olmadan tüm şubeyi etkin bir şekilde yeniden oluşturacaklar.
Kötü taahhüdü hiç çekmedilerse, tüm bu süreç onları etkilemez ve normal şekilde çekebilirler.
HEAD^
daha sonra zorlamak için sıfırlayabilirsiniz .
git reset HEAD^
git push -u origin master --force
Son kaydetmeniz silinecek ve kayıt silindiği için bitbucket'i yansıtacak, ancak yine de sunucularında kalacaktır.
İşte 4 adıma kadar basit bir yaklaşım:
0 - Ekibe, depoyu düzelteceğinizi söyleyin
Ekiple bağlantı kurun ve onlara yaklaşan değişiklikleri bildirin.
1 - Son kaydetmeyi kaldırın
Hedef şubenizin master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
Bu noktada eğer yalnız çalışıyorsanız işiniz bitmiştir.
2 - Takım arkadaşınızın yerel depolarını düzeltin
Takım arkadaşınızın:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Takım arkadaşınızın yeni kaydetmesi yoksa, bu noktada işiniz tamamlanmıştır ve senkronize olmalısınız.
3 - Kaybedilen taahhütleri geri getirme
Bir takım arkadaşının bu süreçte kaybolan yeni ve yayınlanmamış bir taahhüdü olduğunu varsayalım.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Bunu gerektiği kadar taahhüt için yapın.
Bu yaklaşımı birçok kez başarıyla kullandım. Her şeyin senkronize olduğundan emin olmak bir ekip çalışması gerektirir.
Geçmişte git revert ile sorun yaşadım (esas olarak nasıl çalıştığından tam olarak emin olmadığım için) Birleştirme sorunları nedeniyle geri dönmekte sorun yaşadım ..
Benim basit çözümüm bu.
Aşama 1.
git clone <your repos URL> .
projeniz başka bir klasörde, ardından:
Adım 2.
git reset --hard <the commit you wanna go to>
ardından 3. Adım.
en son (ve ana) proje dizininize (sorunlu son işlemeye sahip olan) 2. adımın dosyalarını yapıştırın
4. adım.
git commit -m "Fixing the previous messy commit"
Adım 5.
Zevk almak
git revert
basittir: önceki bir işlemedeki (veya birden çok kaydetmedeki) değişikliklerin tersini yapan yeni bir işlem yaratır. Kayıtları silmez, bu nedenle bu soruyla alakalı değildir. Ayrıca, buradaki klonlama adımı gerçekten gerekli değildir.
Başkalarının dediği gibi, genellikle hg backout
veya kullanmak istersiniz git revert
. Ancak bazen bir taahhütten gerçekten kurtulmak istersiniz.
İlk önce, deponuzun ayarlarına gitmek isteyeceksiniz. Tıklayın Strip commits
bağlantısını.
Yok etmek istediğiniz değişiklik kümesinin değişiklik kümesi kimliğini girin ve öğesini tıklayın Preview strip
. Bu, yapmadan önce ne tür bir zarar vermek üzere olduğunuzu görmenizi sağlayacaktır. O zaman tıklamanız yeterlidir Confirm
ve işleminiz artık geçmiş değildir. Tüm ortak çalışanlarınıza ne yaptığınızı anlattığınızdan emin olun, böylece yanlışlıkla rahatsız edici taahhüdü geri püskürtmesinler.
Değişiklikler işlendikten sonra silinemez. çünkü commit'in temel doğası silinmemektir.
Yapabileceğin şey (kolay ve güvenli yöntem),
Interactive Rebase:
1) git rebase -i HEAD~2
# son 2 işleminizi gösterecektir
2) İşleminiz şöyle listelenecek: En Son, LILO sayfasının altında görünecektir (Son Çıkışı'nın sonuncusu)
Son kaydetme satırını tamamen sil
3) ctrl+X
veya ile kaydedinESC:wq
şimdi şubeniz son taahhüdünüz olmadan güncellenecek ..
Tarafından belirtildiği gibi Bitbucket için de komutunu yazabilirsiniz Dustin :
git push -f origin HEAD^:master
Not: Master yerine herhangi bir dalı kullanabilirsiniz. Ve sadece Bitbucket üzerine basmayı siler.
Git kullanımında yerel olarak son kaydetmeyi kaldırmak için:
git reset --hard HEAD~1
Şimdiye kadar, cloud bitbucket (hangi sürümden emin değilim) dosya sisteminden aşağıdaki gibi bir kaydı geri döndürmeye izin veriyor (Chrome tarayıcısında Bitbucket arayüzünden nasıl geri döneceğimi bilmiyorum).
- istemeden yaptığınız değişiklikleri güvence altına almak için tüm dizininizi yedekleyin
- teslim alınan dizini seç
-sağ fare düğmesi: kaplumbağa git menüsü
-repo-browser ('geri döndür' menü seçeneği yalnızca onaylanmamış değişiklikleri geri alır)
- KAFA düğmesine basın
-en üst satırı seç (son kaydetme)
-sağ fare düğmesi: bu kaydetme ile değişikliği geri alın
-dosya sistemindeki değişiklikleri geri aldıktan sonra, commit'e basın
-bu, GIT'yi bir 'Revert (önceki mesajınız)' mesajıyla günceller. Bu, falanca işlemeyi geri döndürür '
- 'commit ve push' seçeneğini seçin.