Değişiklikleri kaybetmeden son kaldırılmamış git taahhüdü nasıl kaldırılır


539

Bir benim yerel kopya böylece taahhüt dönmek için bir yol var mı tutar taahhüt olduğunu yapılan değişiklikleri, ama onlar benim çalışma kopyası olmayan kararlı değişiklikler olur? Bir taahhüdü geri almak sizi önceki taahhüdüne götürür - Değişiklikleri korumak istiyorum, ancak yanlış şubeye taahhüt ettim.

Bu zorlanmadı, sadece taahhüt edildi.



6
git reset --softve git reset --mixedher ikisi de bunu (biraz farklı) yapar, bkz. git-reset
torek

Yanıtlar:


930

Bunu yapmanın birçok yolu var, örneğin:

durumda olması değil henüz kamuya taahhüt itti:

git reset HEAD~1 --soft   

İşte bu, taahhüt değişiklikleriniz çalışma dizininizde olacak, LAST taahhüdü ise mevcut şubenizden kaldırılacak. Bakınız git reset man


Eğer yaptığımız ( 'master' adlı bir dal üzerinde) halka itmek:

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

normal şekilde geri dön ve it

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

şimdi, çalışma kopyanızdaki yerel değişiklikler olarak "bu değişiklikleri yapmak istiyorsanız (" yerel kopyanız bu taahhüde yapılan değişiklikleri saklar ") - yalnızca --no-commitseçeneği geri alma seçeneğini geri almanız yeterlidir :

git revert --no-commit 86b48ba (hash of the revert commit).

Küçük bir örnek hazırladım: https://github.com/Isantipov/git-revert/commits/master


5
Çok teşekkür ederim, benim durumumda iptal etmek istediğim iki taahhüdüm vardı ve 'git reset HEAD ~ 1 --soft' komutunu çalıştırmak iki kez üst üste olmam gereken yere geldi.
Geoff Gunter

2
CLI kullanmıyorsanız, biraz daha netlik sağlamak için, resetbahsedilen ilk komut, tüm yerel değişiklikleri koruyan, kafadan önce "yumuşak" olarak 1 devire sıfırlama diyor. SourceTree'de kullanmak benim için hemen belli değildi. sıfırlamaya çalıştığınız devir değil, önceki devire yumuşak bir şekilde sıfırladığınızdan emin olun
Jon B

1
Ben "zaten itti" yaklaşımı denedim ve git 2.14.1 ile benim için çalışmıyor: "Already up to date"birleştirme yaparken diyor .
Fabio

1
@FabioA. , Yanıtı çalışan bir sürümle güncelledim. Bunu fark ettiğiniz için teşekkürler!
Isantipov

1
Bu işe yaramıyor. Ben sıfırlama ve taahhüt atladı ve sadece git geri döndürmek ve dışarı itti ... şimdi belki değişiklikler henüz emin değilim kayıp ... neyse ki bir yedek hala umarım bir işe yarayacak;) aksi takdirde o bir değişiklik kopyalayabilirsiniz .
Skybuck Flying

13

Değişiklikleri ittiyseniz, undobaşka bir dal kullanmadan dosyaları yeniden sahne altına alabilirsiniz.

git show HEAD > patch
git revert HEAD
git apply patch

Son şube değişikliklerini içeren bir yama dosyası oluşturur. Sonra değişiklikleri geri alır. Son olarak, yama dosyalarını çalışma ağacına uygulayın.


Eğer istersin rm patchde
Max Coplan

6

Dava için: "Bu itilmedi, sadece taahhüt edildi ." - IntelliJ (veya başka bir JetBrains IDE) kullanıyorsanız ve henüz değişiklik yapmadıysanız , daha sonra yapabilirsiniz.

  1. Sürüm kontrol penceresine ( Alt + 9 / Command + 9 ) - "Günlük" sekmesine gidin.
  2. Son işleminizden önce bir taahhüdü sağ tıklayın.
  3. Geçerli dalı buraya sıfırla
  4. Yumuşak seç (!!!)
  5. iletişim penceresinin altındaki Sıfırla düğmesine basın.

Bitti.

Bu, değişikliklerinizi "devre dışı bırakır" ve git durumunuzu son yerel işleminizden önceki noktaya döndürür. Yaptığınız hiçbir değişikliği kaybetmeyeceksiniz.


2
JetBrains'i öğrenmeyi seviyorum, teşekkürler! Bu eşdeğerdir git reset --soft "HEAD^"Btw Windows üzerinde. :)
payne

3

Benimle daha çok değişiklikleri yanlış şubeye itip daha sonra fark ettiğimde oluyor. Ve takip çoğu zaman işe yarar.

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. taahhüdü geri al
  2. (şube oluştur)
  3. geri döndür

1
Bunu test ettim. Uzaktan kumandayı zorlamadıysanız yaklaşımınız da işe yarar. $ git revert <commit-hash> ... sonra başka bir şubeye göz atın, sonra $ git revert <revert-commit-hash> yazın (basmadan). Bu basit yaklaşımı paylaştığınız için teşekkür ederiz !!
Natalie Cottrill

1

Bu komutları ayrı bir klasörde çalıştırmadan önce değişikliklerinizi yedeklediğinizden emin olun.

git checkout şube_adı

Şubenizden ödeme yapma

git merge --abort

Birleştirmeyi iptal et

git durumu

Birleştirme işlemini iptal ettikten sonra kodun durumunu denetleme

git reset --hard başlangıç ​​/ şube_adı

bu komut değişikliklerinizi sıfırlar ve kodunuzu branch_name (şube) koduyla hizalar.


1

2020 basit yolu:

git reset <commit_hash>

Saklamak istediğiniz son taahhüdün karma değerini girin.

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.