Bitbucket'ta son kaydetmeyi sil


105

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:


104

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.


Bilgi için teşekkürler. Taahhüdü silersem sonucunu da biliyorum, sadece eylemimi nasıl geri alacağımı bilmiyorum çünkü ilk defa bir hata yapıyorum. Taahhüdümü geri almam gerekiyor çünkü sistem zaten çalışıyor. Bu depo ile çalışan sadece iki kişiyiz.
catherine

git backout <REV>? Ya da: hg backout <REV>?
Armando Pérez Marqués

Peki ya geri alınacak olanın ardından eklenen kayıtlar silinen satırda değişiklikler yapmışsa?
rahs

@RahulSaha Yaptığınız şey temelde bir taahhüdü şubeyle birleştirmeye çalışmak olduğundan eminim ki size çözmeniz gereken bir birleştirme anlaşmazlığı verecektir.
asermax

99

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.

Ana olmayan bir dalı değiştirmeye çalışıyorsanız:

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

ana dalı değiştirmeye çalışıyorsanız

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 .

Rahatsız ortak çalışanlarla başa çıkmak

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-pickoluş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.


1
SourceTree kullanımında daha rahat olanlar için: 1) BitBucket için web kullanıcı arayüzündeki ana dalı değiştirmek için Repo Ayarlarına bakın. 2) Web kullanıcı arayüzünde bir şubeyi silmek için Şubeler sayfasına bakın. 3) Yerel depoyu yukarıdaki gibi sıfırlayın. 4) Bu dalları yeniden oluşturmak için yerel değişikliklerinizi yukarı itin.
Richard Le Mesurier

2
Yanlışlıkla bir sırrı zorlayan biri olarak bu cevabın titizliğini çok takdir ettim. Teşekkürler!
tork

48

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.


Github buna izin verecek, ancak bu yazıdan itibaren Bitbucket zorla itmelere izin vermiyor.
JamesQMurphy

4
aslında bitbucket zorlamayı destekler, sadece fark, izlenmeyen taahhütleri tamamen kaldırmak yerine onları silinmiş olarak işaretler.
Shubanker

Bitbucket'tan önerilen yol geri döndürmeyi kullanmaktır. Ama bence bu daha uygun. Onu kullanan tek kişi ben olduğum için ve geri dönüşü kullanmaktan daha temiz hissettiriyor. Teşekkürler.
nafsaka

1
Evet, bu hala Bitbucket'ta çalışıyor. Beni büyük zaman kurtardın! Eclipse'imden bir taahhüt / itme yaptım ve sahip olduğum diğer projeye karıştım. Kısmen, git üzerinde çalışmak için hem komut satırı hem de yerleşik tutulma kullanmamdan kaynaklanan kötü bir uygulama nedeniyle.
DarkCygnus

parlak veya daha kolay: mevcut şubeyi bu işleme sıfırlayın, ardından sunucuya bu zorlamayı kullanarak sorunumu düzeltin
Anthony Kal

5

İş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.


3

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


1
Kesme ve yapıştırma gerçekten dağınık. Artı, bu sorunu sorudan çözmez.
Daniel Lee

1
git revertbasittir: ö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.
naught101

1
Git revert, yukarıdaki gibi eşit mekanizmadır.
nafsaka

2

Başkalarının dediği gibi, genellikle hg backoutveya kullanmak istersiniz git revert. Ancak bazen bir taahhütten gerçekten kurtulmak istersiniz.

İlk önce, deponuzun ayarlarına gitmek isteyeceksiniz. Tıklayın Strip commitsbağlantısını.

Strip, bitbucket ayarlarında bağlantıyı tamamlar

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 Confirmve 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.


Bu hangi sürüm ve hangi izinler gerekli? Bakıyorum v6.4.3'te farklı görünüyor ve bu öğe orada değil. Ben değilim depo yönetici.
Raphael

1

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)

görüntü açıklamasını buraya girin

Son kaydetme satırını tamamen sil

3) ctrl+Xveya ile kaydedinESC:wq

şimdi şubeniz son taahhüdünüz olmadan güncellenecek ..


1

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

0

Ş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.

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.