Soru Git'i Git'teki bir daldan sil


Bir işlemi nasıl sileceğimi bilmek isterim.

Tarafından deleteYani, bu işi yapmadım sanki, ve gelecekte bir itme yaptığımda, değişikliklerim uzak şubeye gitmeyecek.

Git yardımını okudum ve kullanmam gereken komut bence git reset --hard HEAD. Bu doğru mu?


2582
2017-08-27 03:39


Menşei


bence bu değil bir kopyası Git son taahhüdü iptal et nasıl silineceğini sorar herhangi bir daldan taahhüt. Ayrıca cevapların aslında bu soruyu ele aldığını düşünüyorum. Hepsi son işi kabul ediyor, değil cherry-pick ve delete Bir süre önce meydana gelebilecek tek bir taahhüt. - Chris
@Chris, cevabı ile git rebase -i HEAD~10 Silme işlemlerini keyfi olarak seçmenize izin verdiği için soruyu ele alır. Git, işlemleri tek tek belirttiğiniz aralıkta uygular ve günlükten kaldırdığınız işlemleri göz ardı eder. En üstte kalırken, bu komutu ikinci ve üçüncü en son taahhütlerden kurtulmak için kullandım. Diğer cevapların hiçbirinin tatmin edici olmadığını kabul ediyorum. - MST
@MST evet, şunu söylemeliyim ki, kabul edilen cevaptaki seçenekler bu soruya cevap vermiyor, ama kesinlikle haklısınız - bu komut işe yarıyor gibi görünüyor - Chris


Cevaplar:


Dikkatli:  git reset --hard  ÇALIŞMA DİZİN DEĞİŞİKLİĞİNİZİ SİLECEKSİNİZ. Emin olun tutmak istediğiniz yerel değişiklikleri saklayın bu komutu çalıştırmadan önce.

Bu konuda oturduğunuzu varsayarsak, o zaman bu komut ...

git reset --hard HEAD~1

HEAD~1 kafadan önce taahhüt anlamına gelir.

Ya da çıktıya bakabilirsiniz. git log, yedeklemek istediğiniz işlemin taahhüt kimliğini bulun ve sonra bunu yapın:

git reset --hard <sha1-commit-id>

Zaten onu ittiysen, kurtulmak için bir kuvvet itmesi yapman gerekecek ...

git push origin HEAD --force

ancakeğer diğerleri çektiyse, yeni bir şube kurmanız daha iyi olur. Çünkü çekildiklerinde, sadece işlerine karışacak ve onu tekrar yukarı iteceksiniz.

Çoktan ittiyseniz, kullanmak daha iyi olabilir git revert, değişiklikleri geri alacak bir "yansıtma görüntüsü" işlemi oluşturmak için. Ancak, her iki işlem de günlükte olacak.


FYI - git reset --hard HEAD WORK IN PROGRESS'den kurtulmak istiyorsanız harikadır. Sizi en son yapılan işleme geri sıfırlar ve çalışan ağaç ve dizininizdeki tüm değişiklikleri siler.


Son olarak, "silinen" bir taahhüt bulmanız gerekiyorsa, genellikle git reflog Çöpün olmadığı sürece deponuzu topladı.


3311
2017-08-27 03:44



HEAD~1 ya da sadece HEAD^. Eğer ittiysen, kullanmalısın git revert yerine. - Jakub Narębski
Bu komutu çalıştırmadan önce saklamak istediğiniz yerel değişiklikleri sakladığınızdan emin olun ... - William Denniss
Açıkçası ayrıca kullanabilirsiniz HEAD~n "geri dön" n kafanızdan taahhüt eder. Belki bu noktadan yorumlayabilirsiniz ... --hard HEAD Aynı zamanda HEAD~0 => devam eden çalışmaları silme. - yoshi
@ beamrider9 imho git rebase hemen hemen her zaman daha iyi bir yoldur (Greg Hewgill'in cevabında açıklandığı gibi) - en azından rebase aslında 4realz maddesini sileceğinize dair büyük bir uyarı içerdiği için. - Noah Sussman
Bu, taahhüt ağacından gelen değişiklikleri silmez. OP zaten yapılmış bir taahhüt istedi. Eğer sen reset --hardve kontrol edin log --oneline --allİşlemler hala ağaçta kalıyor. Bu işlemleri ağaçtan nasıl silebiliriz? Teşekkürler. - iGbanam


Henüz herhangi bir yere itiraz etmediyseniz, kullanabilirsiniz git rebase -i Bu işlemi kaldırmak için. İlk olarak, bu taahhüdün ne kadar geri olduğunu öğrenin (yaklaşık olarak). Sonra yap:

git rebase -i HEAD~N

~N son yeniden inşa etmek demektir N taahhüt eder (N örneğin bir sayı olmalı HEAD~10). Ardından, hatalı davranışı silmek için Git'in size sunduğu dosyayı düzenleyebilirsiniz. Bu dosyayı kaydettikten sonra, Git, aşağıdaki tüm işlemleri, sildiğiniz etiket mevcut değilse yeniden yazar.

Git Kitabı iyi rebasing bölüm resimler ve örnekler ile.

Bununla dikkat et, çünkü eğer bir şeyi değiştirirsen var Başka bir yere itti, bir kuvvet itmeyi planlıyorsanız, başka bir yaklaşım gerekli olacaktır.


603
2017-08-27 03:51



Not: Eğer bu son işlem kümesinde herhangi bir --no-ff varsa, rebase onları kasaplık edecektir :( Bu, -p altında belirtilmiştir bu sayfa. Sorun şu ki, eğer -p with -p ile değiştirirseniz, artık "bu işlemi düzenlemek, bu şeyi düzenlemek", vb. Gibi seçeneklerle karşılaşırsınız. - Bukov
Ya onu ittiysen? (sadece uzaktan repo kullanarak) - Costa
@Costa kullanabilirsiniz push -f itmeyi zorlamak ve uzaktaki şubeyi yerel olanla değiştirin. Eğer kendi uzak repo'nuzsa, sorun değil. Bu arada birileri getirilirse sorun başlıyor. - Greg Hewgill
GitHub için çok büyük bir veri dosyası ekledim ve işledim (evet, muhtemelen yine de kaynak repoda olmamalı; Oh iyi). İtmeyi denediğimde, GitHub çok büyük dosya yüzünden reddetti. Yapmak istediğim tek şey, bunu takip eden birkaç alakasız işi kurtarırken, bu işlemi iptal etti. git rebase -i HEAD~5komuta kesinlikle Bu taahhüdü tamamen yerel repo'mdan çıkarmak için ne gerekiyordu! Teşekkürler! - aldo
@dumbledad: ile rebase -isilinen taahhüte karşılık gelen değişiklikler korunmaz. - Greg Hewgill


Başka bir olasılık benim en sevdiğim komutlardan biridir:

git rebase -i <commit>~1

Bu rebase interaktif modda başlayacak -i İşlemden hemen önce vurmak istiyorsun. Editör, o zamandan bu yana tüm taahhütleri listeleyecek. İmha etmek istediğiniz dosyayı içeren satırı silin ve dosyayı kaydedin. Rebase işin geri kalanını yapacak, sadece bu işlemi silecek ve diğerlerinin tümünü tekrar günlüğe döndürecektir.


416
2017-08-27 03:49



thx, herhangi bir sorunla karşılaşırsanız btw (boş taahhütler gibi) kullanabilirsiniz git rebase --continue - realgt
Daha da kolay: git rebase -i HEAD~1 - mmell
Wowzers. git rebase -i HEAD~1 Repo çok gerçekten temizlenmiş! Ne yaptığını tam olarak söylemek zor, ama her şey çok daha güzel görünüyor. Aslında biraz endişe verici. - Charles Wood
Sanırım, bu işlemin sadece listeden çıkarılmamış olduğuna dikkati çekiyor. Dağınıklık ederseniz, reflog. - Zaz
Satırı d / drop ile silmek mi? - Leo


Bu cevabı ekliyorum çünkü çalışmayı denemeye çalışanların neden Git'i kullanan bazı hatalar yüzünden tüm bu işleri silmek istediğini anlamıyorum!

Eğer işinizi sürdürmek ve sadece bu taahhüt komutunu 'geri almak' istiyorsanız (repo'ya basmadan önce yakalandınız):

git reset --soft HEAD~1

-Hard kullanmayın Son işten bu yana devam eden çalışmalarınızı yok etmek istemediğiniz sürece bayrak.


281
2017-10-15 18:17



İşte bunun bir örneği: Yaptığınız bir geliştirme sunucusunda küçük bir iş parçası. Ardından, sunucunun HTTPS erişiminin olmadığı ortaya çıkar, bu nedenle bu işlemi herhangi bir yere zorlayamazsınız. Daha önce hiç olmamış gibi davranmayı ve yerel makinenizdeki yamayı yeniden yapmanın en kolay yolu. - Steve Bennett
reset --soft Mevcut çalışmayı kaybetmemek için hayat kurtarıcıydı. - RaphaelDDL
Teşekkürler. Bu cevap daha yüksek veya kabul edilen cevapta yer almalıdır. Bir işlemi silme! = Bir işlemi geri alma. - Alsciende
@RandolphCarter: Yine de herhangi bir değişiklik yapılmayan değişikliği kaybedersiniz. - naught101
@Rob, bir örnek yanlışlıkla hiçbir zaman kaynak kontrolünde olmamalıdır bir gizli (örneğin bir şifre) içeren bir dosya işlemek olduğunu. Yerel taahhüt olmalı yerlebir edilmişSadece geri alınmaz, bu yüzden sunucuya asla yüklenmez. - Bob Meyers


Değişiklikleri yayınlamadıysanız, en son işlemi kaldırmak için şunları yapabilirsiniz:

$ git reset --hard HEAD^

(Bu ayrıca tüm kabul edilmeyen değişiklikleri de ortadan kaldıracaktır; dikkatli kullanın).

Zaten silinecek taahhüt yayınladıysanız, kullanın git revert

$ git revert HEAD

47
2017-08-27 10:47



Bu işe yaramadı. Günlüğü kaldırdığımda, hala her şey var, neden yaptığımın bir önemi yok. Tarihi temizlemek istiyorum. - Costa
@Costa: Ne işe yaramadı (yani hangi sürümü kullandınız) ve nasıl oturum açtınız? - Jakub Narębski
Bu soru-cevapta neredeyse her şeyi denedim. (Git en son HEAD'i tekrar denedim) Git günlüğüm: tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)' - Costa
Sadece işleri (hiç var olmadıkları gibi) silmek istiyorum. Birkaç yeni taahhütle biraz garip kod serüvenine devam ettim ve her şey çöp gibiydi. Git günlüğümdekileri nasıl silebilirim? - Costa
Kutsal saçmalık bir şey sihirli bir şekilde istediğim şeyi yaptı ... Bu komutlardan hangisi yaptı? - Costa


İşlemin tamamının kaldırılması

git rebase -p --onto SHA^ SHA

Açıkça "SHA" yerine kurtulmak istediğiniz referansla değiştirin. Bu komuttaki "^", değişmezdir.

http://sethrobertson.github.io/GitFixUm/fixup.html


43
2017-08-31 19:36



Bu cevabı daha nasıl artırabilirim ??? Diğer çözümler sadece etkileşimli olarak nasıl yapılacağını veya üstteki taahhütleri nasıl kaldıracağını gösteriyor. - ribamar
Bu bağlantı için teşekkürler! Merak ediyordum, bunu çalıştırdıktan sonra neden benim git reflog'umdaki SHA işlemini görüyorum? - bapors
Neden ihtiyacımız var -p İşte? - Serge Roussak
-p, --preserve-merges            Birleştirme taahhüdünü, yeniden birleştirme taahhüdünü tekrarlayarak yeniden tarihlendirmek yerine birleştirme işlemlerini yeniden yaratın. Çatışma kararlarını birleştirin veya taahhütleri birleştirmek için el ile yapılan değişiklikler korunmaz. - raittes


git reset --hard commitId

git push <origin> <branch> --force

Not: CommitId, geri dönmek istediğinizi belirtir.


33
2017-10-16 09:51



git push --force <origin> <branchName>. şube adını belirtmeden, uzaktaki tüm dosyaları değiştirebilir. - sheelpriy