Git - Aktarılan taahhütleri geri al


609

Uzak bir depoda, yerel depo (geliştirme) ve sunucu bir (eşya) ile senkronize edilmiş bir projem var. Uzaktan yapılan ve sunucudan alınan bazı değişiklikler yaptım. Şimdi, bu değişiklikleri geri almak istiyorum. Bu yüzden git checkoutdeğişikliklerden önce taahhütte bulunabildim ve yeni değişiklikleri taahhüt edebildim , ancak onları tekrar uzaktan kumandaya itmek için problemler olacağını tahmin ediyorum. Nasıl ilerlemem gerektiği konusunda herhangi bir öneriniz var mı?


Yanıtlar:


735

Aşağıdakileri yaparak bireysel taahhütleri geri alabilirsiniz:

git revert <commit_hash>

Bu, belirttiğiniz taahhüdün değişikliklerini geri alan yeni bir taahhüt oluşturur. Sadece belirli bir taahhüdü geri aldığını ve bundan sonra taahhütte bulunmadığını unutmayın. Bir dizi taahhüdü geri almak istiyorsanız, bunu şu şekilde yapabilirsiniz:

git revert <oldest_commit_hash>..<latest_commit_hash>

Belirtilen taahhütler arasında ve belirtilen taahhütleri geri alır.

Bak git geri dönme eğilimi adam sayfası hakkında daha fazla bilgi için git revertkomuta. Ayrıca, taahhütleri geri alma hakkında daha fazla bilgi için bu cevaba bakınız .


22
Başka bir deyişle, <oldest_commit_hash>;)
David'e

7
@mr_jigsaw Usegit log
gitaarik

2
Git belgelerinde, geri döndür komutunun ilk ve son taahhütler arasında (hem ilk hem de son dahil) tamamlandığını söyler. Belgelere Bakın
Onur Demir

4
@aod doğru, bu cevabın güncellenmesi gerekiyor. geri dönme için mevcut git API'si geri dönüşler <oldest_commit_hash>listesine dahil edildi
JHixson

4
git 2.17.2 ile geri döndür <old> .. <new> eski içermiyor, ancak <new> içeriyor
chingis

353

"Geri al" ın izini bırakmayan bir çözüm.

NOT: Birisi değişikliğinizi zaten çekmişse bunu yapmayın (bunu yalnızca kişisel repo'mda kullanırım)

yapmak:

git reset <previous label or sha1>

bu, tüm güncellemeleri yerel olarak yeniden kontrol eder (böylece git durumu güncellenen tüm dosyaları listeler)

"işinizi yaparsınız" ve değişikliklerinizi yeniden yaparsınız (Not: bu adım isteğe bağlıdır)

git commit -am "blabla"

Şu anda yerel ağacınız uzaktan kumandadan farklı

git push -f <remote-name> <branch-name>

uzaktan kumandayı bu aktarmayı dikkate almaya zorlayacak ve bir öncekini kaldıracak (uzak ad ve dal adının belirtilmesi zorunlu değildir, ancak tüm dalları güncelleme bayrağıyla güncellemekten kaçınmanız önerilir).

!! dikkat bazı etiketler hala kaldırıldı taahhüt işaret ediyor olabilir !! nasıl yapılır-silme-a-uzaktan-etiketi


4
-bir izlenen tüm dosyalar işleme alınacaktır -m taahhüt mesajı aşağıdaki gibidir
jo_

3
Tam aradığım şey. Birisi hatalı bir taahhüt ve itme yaptı ve daha sonra tekrar geri aldı. Bu nedenle şubeler birleştirilemedi ve
havuzun

1
Hangi "önceki etiketi veya sha1" i kullanmalıyım? Ondan önce son “doğru” olanı mı yoksa sonuncu olanı mı yeniden girmeli ve son doğru olan tarafından yapılan tüm değişiklikleri yeniden yapmalı mıyım?
elysch

3
ahlaksız taahhütten hemen önceki kişi
jo_

1
Tam olarak ihtiyacım olan şey. Yanlışlıkla ustalaşmak için bir kolu ittim. Ve sonuç olarak, tüm tarihler boyunca birçok çöp işim vardı. Ben sadece git push -fson doğru taahhüt ve temiz geçmiş temizlendi! Teşekkürler!
Anton Rybalko

193

Bu durumlarda yaptığım şey:

  • Sunucuda, imleci bilinen son iyi işleme geri götürün:

    git push -f origin <last_known_good_commit>:<branch_name>
    
  • Yerel olarak, aynısını yapın:

    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional
    



my_new_branchBu amaçla oluşturduğum bir daldaki tam örneğe bakın :

$ git branch
my_new_branch

Bu, bazı şeyleri ekledikten sonra yakın bir tarih myfile.py:

$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

Zaten itilmiş olan son taahhütten kurtulmak istiyorum, bu yüzden koşuyorum:

$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

Güzel! Şimdi myfile.py"commit için sahnelenmedi" söz konusu commit ( ) programlarında değiştirilen dosyayı görüyorum :

$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.py

no changes added to commit (use "git add" and/or "git commit -a")

Bu değişiklikleri istemediğim için imleci yerel olarak da geri taşıyorum:

$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

Şimdi HEAD hem yerel hem de uzak bir şekilde önceki taahhütte:

$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

10
Bu doğru cevap! Bu tam da benim durumumda yapılması gerekenler sayesinde bugün yeni bir şeyler öğrendim teşekkürler :)
Egli Becerra

2
Bu doğru cevap! Bu itti (!) Taahhütleri ile ilgili!
powtac

3
Eğer (onları itti hiç sanki) gerçekten geri dönme eğilimi değişikliklere istiyorsanız, bu ise doğru cevap.
Jacob

1
Mükemmel cevap. Beklendiği gibi çalıştı!
RafiAlhamd

2
Birisi bu adama bir bira alıyor!
Jay Nebhwani

72

Git komut satırı aracılığıyla aşağıda verilen adımları izlerseniz Git Exec BOTH'u Yerel Olarak ve Uzaktan REVERT (veya DELETE olarak da adlandırabilirsiniz ) olarak kullanabilirsiniz.

Geri almak istediğiniz işlem kimliğini görmek için aşağıdaki komutu çalıştırın

git log --oneline --decorate --graph

Aşağıdaki ekran görüntüsü gibi alacaksınız resim açıklamasını buraya girin

Uzaktan kumandayı da (Web Arayüzü üzerinden) kontrol ederseniz, bunun aşağıda gösterilenle aynı olacağını görebilirsiniz.

resim açıklamasını buraya girin

Ekran gereğince şu anda üzerinde kimliği işlemek e110322 size geri dönmek istiyorum ancak 030bbf6 HEM yerel hem de uzaktan .

Yerel Olarak Silme / Geri Alma İşlemlerini SİL / Uzaklaştır için aşağıdaki adımları uygulayın


030bbf6 numaralı kimliği yerine getirmek için İlk Yerel Olarak Geri Döndürme

git reset --hard 030bbf6

bunu takiben

git clean -f -d

Bu iki komut , aşağıda anlık görüntüde gösterildiği gibi 030bbf6 aşamasına geçmek için temiz sıfırlama sıfırlama

resim açıklamasını buraya girin

şimdi git durumunu çalıştırırsanız, aşağıda gösterildiği gibi uzak şubeden İKİ Komisyonunuz olduğunu görürsünüz. resim açıklamasını buraya girin

Dizinlerinizi güncellemek için aşağıdakileri çalıştırın (güncelleme varsa). Tüm geliştiricilerden ana uzak dalda herhangi bir çekme isteği kabul etmemelerini istemeniz önerilir.

git fetch --all

Sonra onunla bitirdikten sonra sen gerekmektedir itin bu taahhüt zorla kullanarak + aşağıda gösterildiği gibi-ön dalı sembolü. Burada ana dal olarak kullandım , herhangi biriyle değiştirebilirsiniz.

resim açıklamasını buraya girin kod

git push -u origin +master

şimdi uzaktan web arayüzü görüyorsanız taahhüt sonra da geri döndürülmelidir.

resim açıklamasını buraya girin


61

Bu işlem itilmiş taahhütlerinizi kaldıracaktır

git reset --hard 'xxxxx'

git clean -f -d

git push -f

7
Bu yöntem, kesinliği silmek için geçmişi düzgün şekilde yeniden yazar. Süper
Jesse Reza Khorasanee

2
bu cevap el magnifeco!
truthadjustr

3
Cevabı seviyorum, teşekkürler :)
Dzenis H.

1
Açık olmak gerekirse (emin değildim): Taahhüt, operasyondan sonraki mevcut taahhüt olacaktır. Silinecek son kişi değil.
Maik639

21
git revert HEAD -m 1

Yukarıdaki kod satırında. "Son argüman temsil eder"

  • 1 - bir taahhüt geri döner.

  • 2 - son iki taahhüdü geri döndürür.

  • n - son n taahhüdü geri döndürür.

Uzaktan kumandada efekt almak için bu komuttan sonra itmeniz gerekir. Geri alınacak taahhütlerin aralığını belirtmek gibi başka seçenekleriniz de var. Bu seçeneklerden biri.


Daha sonra kullanım git commit -am "COMMIT_MESSAGE" sonra git pushyagit push -f


8
Bu doğru değildir - -m parametresi, geri döndürülecek üst öğe sayısını belirtir (birleştirilmiş değişiklikler için "bizimkileri" yerine, gelenleri geri döndürmek isterseniz genellikle "1", "bizimkileri" - birleştirme için 2 kaydedilmesini). Geri alınan taahhütlerin sayısıyla ilgisi yoktur - bir taahhüt aralığını geri almak istiyorsanız, şunu kullanıngit revert ref1..ref2
Null Reference

1
İstenen etkisi olmadı
Sam Tuke

2

2020 Basit yol:

git reset <commit_hash>

(Saklamak istediğiniz son taahhüdün karması).

Artık taahhüt edilmemiş değişiklikleri yerel olarak saklayacaksınız.

Tekrar itmek istiyorsanız, yapmanız gerekenler:

git push -f

0

İşte benim yolum:

Diyelim ki şube adı develop.

# Create a new temp branch based on one history commit
git checkout <last_known_good_commit_hash>
git checkout -b develop-temp

# Delete the original develop branch and 
# create a new branch with the same name based on the develop-temp branch
git branch -D develop
git checkout -b develop

# Force update this new branch
git push -f origin develop

# Remove the temp branch
git branch -D develop-temp

0

Gibi bir şey yapabilirsin

git push origin +<short_commit_sha>^:<branch_name>
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.