Git'teki bir şubedeki taahhütleri sil


3233

Bir taahhüdü nasıl sileceğimi bilmek istiyorum.

By delete, ben taahhüt olduğunu yapmadığını, ve ben gelecekte bir itme yapmak, benim değişiklikler uzaktan dalına itmek olmaz sanki demek.

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


41
Bence bu bir şubeden herhangi bir taahhüdü nasıl silebileceğini soran Git geri son taahhüdünün bir kopyası değildir . Ayrıca cevapların hiçbirinin aslında bu soruyu ele almadığını düşünüyorum. Hepsi değil, son hareketin geri sarma ve tek bir süre önce meydana gelen olabilir işlemek. cherry-pickdelete
Chris

12
@Chris, soruyu cevaplıyor, çünkü git rebase -i HEAD~10silme işlemlerini keyfi olarak seçmenize izin veriyor. Git, günlükten kaldırdığınız taahhütleri yok sayarak, belirttiğiniz aralıktaki taahhütleri tek tek uygular. Bugün bu komutu, en üstteki tutarı korurken repo'mdaki en son ikinci ve üçüncü taahhütlerden kurtulmak için kullandım. Diğer cevapların hiçbirinin tatmin edici olmadığını kabul ediyorum.
MST

@MST evet, söylemeliydim, kabul edilen cevaptaki seçeneklerin hiçbiri bu soruyu ele almıyor, ama kesinlikle haklısın - bu komut işe yarıyor gibi görünüyor
Chris

Yanıtlar:


4126

Dikkat: git reset --hard ÇALIŞMA REHBERİ DEĞİŞİKLİKLERİNİZİ SİLECEK . Bu komutu çalıştırmadan önce tutmak istediğiniz yerel değişiklikleri sakladığınızdan emin olun .

Bu taahhüdün üzerinde oturduğunuzu varsayarsak, bu komut onu işleyecektir ...

git reset --hard HEAD~1

HEAD~1Araçlar kafa önce taahhüt.

Veya, çıktısına bakabilir, git logyedeklemek istediğiniz taahhüdün taahhüt kimliğini bulabilir ve ardından bunu yapabilirsiniz:

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

Zaten ittiyseniz, ondan kurtulmak için bir kuvvet zorlaması yapmanız gerekir ...

git push origin HEAD --force

Ancak , başkaları çekmiş olsaydı, yeni bir dal başlatmak daha iyi olurdu. Çünkü çekildiklerinde, onu işleriyle birleştirecekler ve tekrar yukarı iteceksiniz.

Zaten ittiyseniz, git revertdeğişiklikleri geri alacak bir "ayna görüntüsü" taahhüdü oluşturmak daha iyi olabilir . Ancak, her iki işlem de günlüğe kaydedilir.


FYI - git reset --hard HEADDEVAM EDEN İŞLERDEN kurtulmak istiyorsanız harikadır. Sizi en son işleme geri döndürür ve çalışma ağacınızdaki ve dizininizdeki tüm değişiklikleri siler.


Son olarak, "sildiğiniz" bir taahhüt bulmanız gerekiyorsa, genellikle git reflogdeponuzu çöp toplamadığınız sürece mevcut olur .


59
HEAD~1ya da sadece HEAD^. Eğer ittiyseniz, git revertbunun yerine kullanmalısınız .
Jakub Narębski

13
Tabii ki kafanızdan HEAD~n"geri dönmek" için de kullanabilirsiniz n. Belki bu noktadan itibaren => devam etmekte olan işi silmek ... --hard HEADolarak yorumlayabilirsiniz HEAD~0.
nuala

13
@ beamrider9 imho git rebase neredeyse her zaman taahhütleri silmek için daha iyi bir yoldur (Greg Hewgill'in cevabında açıklandığı gibi) - en azından rebase aslında 4realz şeylerini sileceğiniz konusunda büyük bir uyarı içerdiğinden.
Noah Sussman

20
ancak bu, taahhüt ağacından değişiklikleri silmez. OP zaten yapılmış bir taahhüt istedi. Eğer reset --hardve kontrol ederseniz , log --oneline --alltaahhütler hala ağaçta kalır. Bu taahhütleri ağaçtan nasıl silebiliriz? Teşekkürler.
iGbanam

17
reset --softdevam eden işi geri OLMADAN yerel taahhüdü silmek için kullanın !

704

Taahhütü henüz bir yere itmediyseniz, git rebase -isöz konusu taahhüdü kaldırmak için kullanabilirsiniz . İlk olarak, bu taahhüdün ne kadar geri olduğunu öğrenin (yaklaşık olarak). Sonra şunları yapın:

git rebase -i HEAD~N

~NAracı son rebase Nhareketin ( Nörneğin, bir sayı olmalıdır HEAD~10). Ardından, rahatsız edici taahhüdü silmek için Git'in size sunduğu dosyayı düzenleyebilirsiniz. Bu dosyayı kaydettikten sonra Git, aşağıdaki taahhütlerin tümünü sildiğiniz gibi yeniden yazacaktır.

Git Kitabının resimlere ve örneklere yeniden basma konusunda iyi bir bölümü var .

Eğer o şey değiştirirseniz, çünkü bu olsa dikkatli olun var başka yerde itilir, başka bir yaklaşım, bir kuvvet itme yapmayı planladığımız sürece ihtiyaç olacaktır.


2
Not: Eğer son işlemlerde herhangi bir --no-ff birleşmesi gerçekleşirse, rebase bunları keser :( Bu, bu sayfada -p altında belirtilir . Sorun, -i ile -p'yi değiştirirseniz, artık "bu taahhüdü düzenleyin, o bir tane sqush", vb. seçenekleri ile o pop up alamadım. Herkes çözümü biliyor?
Bukov

4
Ya ittiyseniz? (sadece uzak depoyu kullanıyorum)
Costa

6
@ Zorla push -fve uzak dalı yerel bölgenizle değiştirmek için kullanabilirsiniz . Sadece kendi uzaktan deponuzsa, sorun değil. Sorun, bu arada başka biri getirilmişse başlar.
Greg Hewgill

3
GitHub için çok büyük bir veri dosyası ekledim ve taahhüt ettim (evet, muhtemelen yine de kaynak deposunda olmamalı; Oh iyi). Zorlamaya çalıştığımda GitHub, çok büyük dosya nedeniyle reddetti. Yapmak istediğim tek şey, bunu takip eden birkaç ilgisiz taahhüt kaydederken, bu taahhüdü geri almaktı. git rebase -i HEAD~5Komut oldu tam olarak ben tamamen bu benim yerel repo taahhüt kaldırmak için gerekli! Teşekkürler!
aldo

4
@dumbledad: ile rebase -i, silinen işleme karşılık gelen değişiklikler korunmaz.
Greg Hewgill

517

Başka bir olasılık, kişisel favori komutlarımdan biri:

git rebase -i <commit>~1

Bu, Rebase'i interaktif modda -i, vurmak istediğiniz taahhütten hemen önce başlatacaktır . Editör o zamandan beri tüm taahhütleri listelemeye başlayacaktır. Silmek istediğiniz komutu içeren satırı silin ve dosyayı kaydedin. Rebase, işin geri kalanını yapacak, yalnızca bu taahhüdü silecek ve diğerlerini tekrar günlüğe kaydedecektir.


3
thx, btw, herhangi bir sorunla karşılaşırsanız (boş taahhütler gibi) kullanabilirsinizgit rebase --continue
realgt

8
Daha da kolay: git rebase -i HEAD~1
mmell

2
Wowzers. git rebase -i HEAD~1gerçekten çok repo temiz! Tam olarak ne yaptığını söylemek zor, ama her şey çok daha temiz görünüyor. Aslında biraz endişe verici.
Charles Wood

7
Taahhüdün yok edilmediğini, sadece listeden kaldırıldığını belirtmek gerekir. Eğer karışıklık, reflog kullanarak taahhüt geri alabilirsiniz .
Zaz

6
Satırı silmek d / drop ile aynı mıdır?
Aslan

344

Bu yanıtı ekliyorum çünkü yeni iş yapmaya çalışan birinin Git!

Çalışmanızı devam ettirmek ve sadece bu komutları 'geri almak' istiyorsanız (repo'ya itmeden önce yakaladınız):

git reset --soft HEAD~1

Son işlemden bu yana devam eden çalışmanızı yok etmek istemiyorsanız --hard bayrağını kullanmayın .


5
Bunun nedenine bir örnek: taahhüt ettiğiniz bir geliştirme sunucusunda küçük bir iş yaparsınız. Daha sonra, bu sunucunun giden HTTPS erişimine sahip olmadığı ortaya çıkar, bu nedenle taahhüdü hiçbir yere itemezsiniz. Hiç olmamış gibi davranmak ve yamayı yerel makinenizden tekrar yapmak en kolayı.
Steve Bennett

1
@KarthikBose her zaman reflog olurdu. git reset --hard HEAD~1önceki son taahhüdünüz reflog yoluyla da kullanılabilir hale geldikten sonra bile (süresi sona erene kadar); ayrıca bkz. buraya git: gitready.com/intermediate/2009/02/09/…
kodlama

4
Teşekkürler. Bu cevap daha üst sıralarda yer almalı veya kabul edilen yanıta dahil edilmelidir. Bir taahhüdü silme! = Bir taahhüdü geri alma.
Alsciende

2
@RandolphCarter: Yine de taahhüt edilmemiş değişiklikleri kaybedeceksiniz.
naught101

7
@Rob, örnek olarak, hiçbir zaman kaynak denetiminde olmaması gereken bir sır (örneğin bir parola) içeren bir dosyayı yanlışlıkla işlemenizdir. Yerel taahhüt yok edilmeli , sadece geri alınmamalı, böylece sunucuya asla itilmeyecektir.
Bob Meyers

141

Bir taahhüdün tamamını kaldırma

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#change_deep


26
bu cevabı nasıl artırabilirim ??? diğer çözümler sadece etkileşimli olarak nasıl yapılacağını veya üst taahhütleri nasıl kaldıracağını gösteriyor.
ribamar

5
-p, --preserve-merges Bir birleştirme taahhüdünün getirdiği tekrarları yürüterek tarihi düzleştirmek yerine birleştirme taahhütlerini yeniden oluşturun. Birleştirme çakışması kararları veya birleştirme taahhütlerinde yapılan manuel değişiklikler korunmaz.
raittes

5
Bu gerçek doğru cevap
Hamman Samuel

9
"SHA'yı kurtulmak istediğiniz referansla değiştirin" diyor, ancak satırda iki kez SHA var. İşte yaptığım şey. git rebase -p --onto 5ca8832c120 ^ 5ca8832c120 Ama hiçbir şey değişmedi. Aynı SHA'yı iki kez kullanmam gerekiyor mu? Değilse, taahhüdün kaldırılması için SHA hangisidir ve diğer SHA ne olmalıdır?
Rubicksman

3
WOW, kusursuz çalıştı! Bu kabul edilen cevap olmalı!
Liran H

51

Değişiklikleri yayınlamadıysanız, son taahhüdü kaldırmak için şunları yapabilirsiniz:

$ git reset --hard HEAD^

(bunun tüm taahhüt edilmeyen değişiklikleri de kaldıracağını unutmayın; dikkatli kullanın).

Silinecek taahhüdünü zaten yayınladıysanız şunu kullanın: git revert

$ git revert HEAD

Bu işe yaramadı. Gitmeye gittiğimde, her şey hala orada, neden yaptığım önemli değil, sadece daha fazla taahhüt ekliyor. Tarihi temizlemek istiyorum.
Costa

@Costa: Ne işe yaramadı (yani hangi sürümü kullandınız) ve nasıl günlük girdiniz?
Jakub Narębski

Bu soru-cevapla ilgili hemen hemen her şeyi denedim. (Git en son BAŞI denedim, en son) Git 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

1
Sadece taahhütleri silmek istiyorum (sanki hiç varolmamışlar gibi). Birkaç yeni taahhütle bazı garip kodlama macerasına çıktım ve hepsi çöp oldu. Bunları git günlüğümden nasıl silebilirim?
Costa

2
Kutsal bok sihirli bir şey tam olarak istediğimi yaptı .... bu komutlardan hangisini yaptı? !!?!
Costa

44

Diyelim ki 2 ve 4 numaralı taahhütleri repodan çıkarmak istiyoruz.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Not: ve kullandığınız için repo üzerinde yönetici haklarına sahip olmanız gerekir .--hard-f

  • git checkout b3d92c5 Son kullanılabilir taahhüdü kontrol edin.
  • git checkout -b repair Üzerinde çalışmak için yeni bir şube oluşturun.
  • git cherry-pick 77b9b82 Taahhüt 3'ü çalıştırın.
  • git cherry-pick 2c6a45b Taahhüt 1'i çalıştırın.
  • git checkout master Ödeme ustası.
  • git reset --hard b3d92c5 Master'ı son kullanılabilir taahhüdüne sıfırlayın.
  • git merge repair Yeni şubemizi usta ile birleştir.
  • git push -f origin master Master'ı uzak repoya itin.

1
son adım git push -f origin masterseçenek yok olmalı--hard
Vivex

2
Sanırım commit 0bundan daha yaşlı commit 1. Lütfen bana neden önce commit 3(cherry-pick ile) sonra da geçtiniz commit 1? b3d92cd( commit 0) Ödeme sonra kiraz-pick commit 1, o zaman beklenir commit 3. Teşekkürler.
Jarek C

@JarekC Sanırım en üst düzey taahhüt, yanlış bir şey görmedikçe buradaki en yeni taahhüttür ...
Jeff Huijsmans

41
git reset --hard commitId

git push <origin> <branch> --force

Not: Taahhüt, geri dönmek istediğiniz kişiyi ifade eder


git push --force <orijin> <branchAdı>. Şube adından bahsetmeden uzaktan kumandadaki tüm dosyaları değiştirebilir.
16:46

39

Geçmişi Zorla Değiştir

Sadece son taahhüdü silmek istemediğinizi, ancak son n taahhüdün belirli taahhütlerini silmek istediğinizi varsayalım:

git rebase -i HEAD~<number of commits to go back>, yani git rebase -i HEAD~5 son beş taahhüdü görmek istiyorsanız.

Sonra metin editörü sözcüğü değiştirmek pickiçin dropher Kaldırmak istediğiniz taahhüt yanında yer almaktadır. Düzenleyiciyi kaydedin ve çıkın. İşte bu kadar!

Ek olarak Değişiklik Geçmişi

Deneyin git revert <commit hash>. Geri alma , belirtilen taahhüdü geri alan yeni bir taahhüt oluşturur .


dropanahtar kelime tanımlanmamış. Bir taahhüdü silmek için tüm satırı kaldırmanız yeterlidir.
Shayan Salehian

1
Benim için damla bir anahtar kelime olarak tanımlandı, ancak bir damla yapmak taahhüdü geçmişten kaldırmış gibi görünmüyordu. Ancak çizgiyi etkileşimli rebase'den kaldırmak yaptım.
Adam Parkin

Tam da ihtiyacım olan şey bu. Harika çalışıyor; Teşekkürler!
diekunstderfuge

30

En son taahhüdünüzü düzeltmek istiyorsanız, taahhüt işlemini geri alabilir ve içindeki dosyaları kaldırabilirsiniz:

git reset HEAD~1

Bu, dosyaları hazırlayan git add komutlarından önce deponuzu durumuna geri döndürür. Yaptığınız değişiklikler çalışma dizininizde olacak. HEAD ~ 1, dalın mevcut ucunun altındaki taahhüdü belirtir.

N işleminden çıkmak, ancak kod değişikliklerini çalışma dizininizde tutmak istiyorsanız:

git reset HEAD~N

Son taahhüdünüzden kurtulmak ve kod değişikliklerini korumak istemiyorsanız, "zor" bir sıfırlama yapabilirsiniz.

git reset --hard HEAD~1

Benzer şekilde, son N işlemeyi silmek ve kod değişikliklerini korumak istemiyorsanız:

git reset --hard HEAD~N

22
git rebase -i HEAD~2

Burada '2', yeniden pazarlamak istediğiniz taahhütlerin sayısıdır.

'git rebase -i HEAD`

tüm taahhütleri yeniden temellendirmek istiyorsanız.

Sonra bu seçeneklerden birini seçebilirsiniz.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Bu hatlar yeniden sipariş edilebilir; yukarıdan aşağıya doğru yürütülürler. Burada bir satırı kaldırırsanız, KOMİTE KAYIP OLACAKTIR. Ancak, her şeyi kaldırırsanız rebase iptal edilir. Boş taahhütlerin yorumlandığını unutmayın

Bu işlemi "d" seçeneğini kullanarak veya taahhüdünüzü içeren bir satırı kaldırarak kaldırabilirsiniz.


En son git sürümünde başka seçenek d yoktur . Silinecek satırları rebase'den yeniden kaldırmanız yeterlidir.
Oleg Abrazhaev

17

Yerel şubede silmek için şunu kullanın:

git reset --hard HEAD~1

Uzak bir dalda silmek için şunu kullanın:

git push origin HEAD --force

12

[Hızlı cevap]

Birçok alternatifiniz var, örneğin:

  • Alternatif 1:

    git rebase -i <YourCommitId>~1
    

    Geri dönmek istediğiniz taahhüdün numarası içinCommitId öğenizi değiştirin.

  • Alternatif 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    Geri dönmek istediğiniz taahhüdün numarası içinCommitId öğenizi değiştirin.

    Bu seçeneği önermiyorum çünkü devam eden çalışmanızı kaybedebilirsiniz.

  • Alternatif 3:

    git reset --soft HEAD~1
    

    Çalışmanızı devam ettirebilir ve yalnızca taahhüdü geri alabilirsiniz.


teşekkür ederim teşekkür ederim teşekkür (Y)
Habib Rehman

11

Kaynak: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Son taahhüdü sil

Örneğin, son taahhüdünüz

git push başlangıcı + aa61ab32 ^: master

Şimdi bu taahhüdü silmek ve ardından bunu yapmanın kolay bir yolu var

adımlar

  1. Önce şubeyi geçerli taahhüdün üst öğesine sıfırlayın

  2. Uzaktan kumandayı zorlayın.

git reset HEAD^ --hard

git push origin -f

Belirli bir taahhüt için, sıfırlamak istediğiniz

git reset bb676878^ --hard

git push origin -f

9

İşte bunu yapmanın başka bir yolu:

Geri döndürmek istediğiniz dalı kontrol edin, ardından yerel çalışma kopyanızı uzak sunucuda en son olmasını istediğiniz taahhüde sıfırlayın (her şey güle güle gidecektir). Bunu yapmak için, SourceTree'de sağ tıkladım ve "BRANCHNAME'i bu işleme sıfırla" yı seçtim. Bence komut satırı:

git reset --hard COMMIT_ID

Şubenizi uzaktan kontrol ettiğiniz için, kaybetme konusunda endişelenecek yerel değişiklikleriniz olmayacak. Ama eğer yaparsan bu onları kaybederdi.

Ardından deponuzun yerel dizinine gidin ve şu komutu çalıştırın:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Bu işlem, yerel deponuzdaki geçerli olandan sonraki tüm taahhütleri silecektir, ancak yalnızca bu dal için.


9

Hata:

Ben git rebase -i --rootşubemde, cahil ustadan farklı ilk taahhüdünü yeniden yazmak olabilir düşünüyorum ( Windows için GitHub varsayılan görünüm tamamen gizleme, master karşılaştırmasıdır).

Bir Silikon Vadisi sakalı büyüttüm, 900+ taahhüt ise Sublime'a yüklendi. Hiçbir değişiklik yapmadan, pili şarj ettim ve tıraş olmaya devam ettim, çünkü 900'den fazla kişi sürekli olarak yeniden temel almadı - taahhüt sürelerini şimdiye kadar sıfırladı.

Git'i yenmeye ve orijinal zamanları korumaya karar verdim, bu yerel havuzu sildim ve uzaktan klonlandım.

Şimdi kaldırmak istediğim ustaya en son gereksiz taahhüdü tekrar ekledi, bu yüzden böyle devam etti.

Seçenekleri tüketmek:

İstemedim git revert - bu Git üstünlük vererek ek bir taahhüt yaratacak.

git reset --hard HEADhiçbir şey yapmadı, kontrol ettikten sonra reflog, son ve tekHEAD klon oldu - Git kazanır.

En son SHA'yı almak için, github.com - ufak bir kazanç olan uzak depoyu kontrol ettim.

Düşünme git reset --hard <SHA>çalıştıktan sonra , başka bir dalı master ve 1 ... 2 ... puf için güncelledim. taahhüt geri döndü - Git kazanır.

Ustaya göz atmak, denemek için zaman git rebase -i <SHA>, sonra çizgiyi kaldırmak ... boşuna, söylemek üzücü. " Eğer KAYIP OLACAK COMMIT burada bir çizgi kaldırırsanız ". Ah ... yeni özellik geçiştirilmiştir Troll n00b içinde 2.8.3 sürüm notları .

Çözüm:

git rebase -i <SHA>sonra d, drop = remove commit.

Doğrulamak için, başka bir şubeye baktım ve işin aslı için getirme / çekme saklanma taahhüdü yok.

https://twitter.com/holman/status/706006896273063936

Sana iyi günler.


8

Yukarıdaki tüm komutlar, çalışma ağacınızın ve dizininizin taahhüdü vermeden önceki durumunu geri yükler, ancak deponun durumunu geri yüklemez. Eğer bakarsanız, "kaldırıldı" taahhüdü aslında kaldırılmaz, sadece mevcut dalın ucunda değil.

Bence porselen komutlarıyla bir taahhüdü ortadan kaldırmanın bir yolu yok . Tek yol, günlük ve reflog'dan kaldırmak ve ardından a git prune --expire -now.


1
Yanıtların StackOverflow üzerinde gösterilme sırası sabit değildir. Lütfen “Yukarıdaki tüm komutlar” a bakmayın. Kendi cevabınızı kendinize saklayın.
Pascal Cuoq

Bu cevap tamamen doğru değil. git prune aslında "porselen" komutlarından biridir . Ayrıca, reflogunuzu tamamen temizlemek istemeniz nadirdir (bir kullanım örneği hassas bilgileri repodan kaldırmaktır, ancak dediğim gibi, bu nadir bir kullanım örneğidir). Daha sık olmamakla birlikte, verileri kurtarmanız gerektiğinde eski taahhütleri reflogda tutmak isteyeceksiniz. Bkz. Pro Git: 9.7 Git Dahili - Bakım ve Veri Kurtarma .

8

Geçmişi tutmak, taahhüt ve geri dönüşü göstermek istiyorsanız, şunları kullanmalısınız:

git revert GIT_COMMIT_HASH

neden geri döndüğünüzü açıklayan iletiyi girin ve ardından:

git push  

Verdiğinizde, git loghem "yanlış" kaydetme ve geri alma günlük iletilerini görürsünüz.


Evet, ama OP istediklerinin bu olmadığı belliydi.
Steve Bennett

7

Son taahhüdünüzü batırdıysanız (yanlış mesaj, bazı değişiklikler eklemeyi unuttunuz) ve halka açık bir repoya itmeden önce düzeltmek istiyorsanız neden kullanmıyorsunuz:

git commit --amend -m "New message here"

Yeni aşamalandırılmış değişiklikleriniz varsa, bunlar son işlemle (kurtulmaya çalıştığınız) birleştirilir ve bu işlemin yerini alır.

Elbette, bir taahhüdü ittikten sonra değiştirirseniz, geçmişi yeniden yazıyorsunuz, eğer öyleyse sonuçları anladığınızdan emin olun.

Önceki işlemin iletisini kullanmayı tercih ediyorsanız, '-m' yerine '--no-edit' seçeneğini de iletebilirsiniz.

Dokümanlar: http://git-scm.com/docs/git-commit.html


2
OP'nin istediği bu değil.
Steve Bennett

5

Zaten ittiyseniz , önce HEAD'de ($ GIT_COMMIT_HASH_HERE) olmasını istediğiniz taahhüdü bulun , ardından aşağıdakileri çalıştırın:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Daha sonra repo klonlanan her yer çalıştırın:

git reset --hard origin/master

5

Taahhüt ettiğimde ve ittiğimde genellikle ne yapıyorum (herhangi biri onun taahhüdünü ittiğinde sorunu çözer):

git reset --hard HEAD~1

git push -f origin

umarım bu yardım


5

Zaten ittim. Bazı taahhütleri uzaktan geri döndürmek gerekiyor. Var birçok varyasyonu çalıştı, ancak sadece bu gelen Justin git kovanı ile benim için iyi çalışıyor:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

4

Yerel şubeye sıfırla

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Zorla menşei zorla

git push -f origin

3

Kodunuzun yedeğini geçici klasöre alın. Aşağıdaki komut sunucu ile aynı şekilde sıfırlanır.

git reset --hard HEAD
git clean -f
git pull

Değişikliklerinizi korumak ve son taahhütleri kaldırmak istiyorsanız

git reset --soft HEAD^
git pull


2

yerel taahhüdü sil

Yukarıdaki resimde görebileceğiniz gibi geri almak "test değişikliği 2" taahhüdü silmek istiyorum (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (SHA1 kimliğini gitkgit bash komutunu kullanarak alabilirsiniz )).

Bunun için kullanabilirsiniz (aşağıdaki komut çalışması yalnızca yerel olarak çalışın. Sildikten sonra itmeniz gerekir):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// sizi bu taahhüde yedekler ( test değişikliği 4 taahhüdünün SHA1 Kimliği 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // bir taahhütte bulunmadan önce sizi yedekler.
  3. git reset --hard HEAD^ // Son taahhüdü git'ten kaldırmak için

sildikten sonra:

silme işleminden sonra


2

git reset --hard HEAD~1
Şimdi bir önceki kafada olacaksınız. Dalı çekin. Yeni kodu girin. Taahhüt git'ten kaldırılacak


Değişiklikleri daha önce itmediyseniz. Bu durumda donanımdan sıfırlama uzaktan kumandanızı temizlemez. Bu durumda rebase iyi bir seçenektir
c0der512

1

git reset --hard

git push origin HEAD - kuvvet

Taahhütlerin biri veya daha fazlası etiketlenmişse, önce etiketleri silin. Aksi takdirde, etiketlenen kesinti kaldırılmaz.



0

Benim durumumda, bu pupose için sihirli kodum bu:

git reset --hard @{u}

Test et ve söyle. Birkaç farklı deneme yaptım, ama bu bana yardımcı olan tek şeydi.

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.