Soru Git deposunu önceki bir işleme nasıl geri döndürür


Mevcut durumumdan belirli bir işlemde yapılan anlık görüntüye nasıl dönebilirim?

Eğer yaparsam git logsonra aşağıdaki çıktıyı alırım:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

3 Kasım'dan itibaren işleme nasıl devam edilir, yani taahhüt 0d1d7fc?


6021
2017-11-06 16:58


Menşei


İlgili Son Git işlemi nasıl geri alınır?.
İşte çok net ve kapsamlı bir yazı Github dan git, git şeyleri geri alma hakkında. - Nobita
İlgili: Bir kamu repo'unda eski bir Git'e geri dönüş. Bu sorunun, repo'nun halka açık olduğu konusunda bir kısıtlama getirdiğini unutmayın.
Git'i seviyorum, ama inanılmaz derecede basit olması gereken bir şeye 35 cevap olması, git ile çok büyük bir sorun ortaya çıkarır. Yoksa dokümanlar mı? - The Muffin Man


Cevaplar:


Bu, "geri" ile ne demek istediğine bağlı.

Geçici olarak farklı bir işleme geçme

Eğer geçici olarak ona geri dönüp, aptal yerine geçmek istiyorsan, o zaman olduğun yere geri dön, tek yapmanız gereken, istenen işi kontrol etmek:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Veya oradayken işlem yapmak istiyorsanız, devam edip yeni bir şube hazırlayın:

git checkout -b old-state 0d1d7fc32

Bulunduğun yere geri dönmek için, tekrar açtığın dalı kontrol et. (Şube değiştirirken her zaman olduğu gibi değişiklikler yaptıysanız, onlarla gerektiği gibi ilgilenmeniz gerekir. Onları atmak için sıfırlayabilirsiniz, saklayabilir, ödeme yapabilirsiniz, pop'unuzu yanınızda götürün; Orada bir dal istiyorsanız, oradaki şubeye.

Yayınlanmamış yayınları silmek

Öte yandan, o zamandan beri yaptığınız her şeyden gerçekten kurtulmak istiyorsanız, iki olasılık vardır. Bunlardan herhangi birini yayınlamadıysanız, sıfırlamanız yeterlidir:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Dağınıklık yaparsanız, yerel değişikliklerinizi zaten atmışsınızdır, ancak en azından yeniden ayarlayarak daha önce bulunduğunuz yere geri dönebilirsiniz.

Yeni taahhütlerle yayınlanmış işlemleri geri al

Öte yandan, eğer çalışmayı yayınladıysanız, muhtemelen şubeyi sıfırlamak istemiyorsunuz, çünkü bu etkili bir şekilde geçmişi yeniden yazıyor. Bu durumda, gerçekten de işlemleri geri alabilirsiniz. Git ile, geri dönüşün çok özel bir anlamı vardır: iptal etmek için ters yama ile bir taahhüt oluşturun. Bu şekilde herhangi bir tarih yazmazsınız.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revert manpage aslında açıklamasında bunun bir çok kapsar. Bir başka yararlı link git-scm.com bölümünde git-revert tartışıyor.

Sonuç olarak geri dönmek istemediğinize karar verirseniz, geri döndürmeyi (burada açıklandığı gibi) geri alabilir veya geri alınmadan önce geri alabilirsiniz (önceki bölüme bakın).

Bu cevabı bu durumda da yararlı bulabilirsiniz:
HEAD, önceki bir konuma nasıl geri alınır? (Müstakil kafa)


7841
2017-11-06 17:04



@ Rod'un yorumu üzerinde git revert HEAD~3 geri dönmek için en iyi wat olarak 3 taahhütler önemli bir sözleşmedir. - New Alexandria
Bütün numarayı yazar mısın? sevmek: git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 - Spoeken
@MathiasMadsenStav Evet, elbette tam SHA1 tarafından taahhütleri belirtebilirsiniz. Cevabı daha okunaklı hale getirmek için kısaltılmış karmaları kullandım ve yazarken de bunları kullanma eğilimindesiniz. Kopyalayıp yapıştırıyorsanız, tümüyle eksiksiz karma kullanın. Görmek Adam git rev-parse'deki Düzeltmeleri Belirleme nasıl adlandırabileceğinizin tam bir açıklaması için. - Cascabel
Akıma geri dönmek için komut 'git checkout master' - Xavier John
Kullanabilirsiniz git revert --no-commit hash1 hash2 ... ve bundan sonra sadece tek bir işlemde her bir geri dönüşü taahhüt eder git commit -m "Message" - Mirko Akov


En Son Yapılan İşlemlere Çalışma Kopyasını Geri Alma

Önceki bir işleme geri dönmek için, herhangi bir değişikliği göz ardı etmek:

git reset --hard HEAD

HEAD'in şu anki şubenizdeki son taahhüdü

Çalışma kopyasını eski bir soruna geri alma

En son işlemden daha eski bir işleme geri dönmek için:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Krediler benzer bir Yığın Taşması sorusuna gider, Git'teki SHA hash'ının yaptığı bir işleme geri dönün mü?.


1262
2017-08-21 06:19



Bunu yaptım, ama sonra uzak depoya itiraf edemedim. BAŞLI olmak için daha eski bir taahhüt istiyorum ... - Lennon
Bu, geri almak istediğiniz taahhütlere zaten itmiş olduğunuz anlamına gelir. Kodunuzu kontrol eden ve üzerinde çalışan kişiler için çok fazla sorun yaratabilir. Taahhüdünü onlar üzerinde sorunsuz bir şekilde uygulayamadıklarından. Böyle bir durumda daha iyi bir geri git. Repo'yu kullanan tek kişi sizseniz. Bir push it -f yapın (Ama bunu yapmadan önce iki kez düşünün) - vinothkr
Zorunlu Uyarı: sıfırlama Şubenizi eski işlemlerin kopyalarını paylaşan başka kişilerle paylaşıyorsanız, bunun gibi bir sıfırlama kullanmak, yeni sıfırlama şubesiyle çalışmalarını yeniden senkronize etmek zorunda kalmaları için zorlar. Yumuşak sıfırlama, son çözümlerin yanı sıra güvenlidir. bu cevap.
Aynı zamanda, yumuşak sıfırlama çözümü için alternatif olarak, önce karışık sıfırlama yapmak ve en son olarak da bir sabit sıfırlama yapmak yerine, aşağıdaki gibi ilk olarak sabit sıfırlamayı gerçekleştirebileceğinizi belirtmek isterim: git reset --hard 56e05fc; git reset --soft HEAD@{1}; git commit.
@nuton linus, kendisinin yaratıcısı pauling'in kendisini çok karmaşık olduğu için eleştirdi. "Şok" gitmesinin karmaşıklığı göz önüne alındığında çok popüler olduğunu söyleyen kayıtlarda - boulder_ruby


Burada karmaşık ve karmaşık bir sürü cevap var, ama aslında kolay:

git revert --no-commit 0766c053..HEAD
git commit

Bu, HEAD'den herşeyi işlenen karmaya geri döndürecek, yani çalışma ağacında bu işleniş durumunu yeniden yaratacaktır. sanki o zamandan beri yapılan her taahhüt geri çekildi. Daha sonra mevcut ağacı işleyebilir ve "geri döndüğünüz" taahhüdüne esas olarak eşdeğer olan yepyeni bir taahhüt yaratabilirsiniz.

( --no-commit flag, tüm taahhütleri bir kerede geri almamıza izin verir. Aksi takdirde, aralıktaki her bir taahhüt için, gereksiz yeni taahhütlerle geçmişinizi gözden geçirmeniz için bir mesaj vermeniz istenir.)

Bu bir önceki bir duruma geri dönmenin güvenli ve kolay yolu. Hiçbir tarih yok edilmez, bu nedenle zaten kamuya açıklanmış olan işlemler için kullanılabilir.


1221
2018-02-12 04:18



Eğer gerçekten bireysel taahhütlere sahip olmak istiyorsanız (her şeyi büyük bir taahhütle geri almak yerine), --no-edit yerine --no-commitBöylece, her bir geri dönüş için bir taahhüt mesajını düzenlemek zorunda kalmazsınız.
0766c053..HEAD arasındaki birleşme birleşimse, o zaman haşhaş (hata belirtilmemiş) ile ilgili bir hata olacaktır. Bu, karşılaşılanlara yardımcı olabilir: stackoverflow.com/questions/5970889/... - timhc22
Kullanmadan önce farklılıkları görmek için git diff --cached. - John Erck
$ git revert --no-commit 53742ae..HEAD döner fatal: empty commit set passed - Alex G
@AlexG, çünkü hash’ı girmeniz gerekiyor bir önce geri dönmek istediğin. Benim durumumda, karmalar gibiydi: 81bcc9e HEAD{0}; e475924 HEAD{1}, ... (dan git reflog) ve yaptığım şeyi geri almak istedim 81bcc9esonra yapmak zorundaydım git revert e475924..HEAD - EpicPandaForce


Benim ve muhtemelen başkaları için en iyi seçenek Git sıfırlama seçeneğidir:

git reset --hard <commidId> && git clean -f

Bu benim için en iyi seçenek oldu! Bu basit, hızlı ve etkilidir!


Not :  Yorumlarda belirtildiği gibi, şubenizi eski işlemlerin kopyalarını taşıyan diğer kişilerle paylaşıyorsanız bunu yapmayın.

Yorumlardan ayrıca, daha az 'topal' bir yöntem isteseydiniz kullanabilirsiniz

git clean -i 


153
2017-10-22 11:53



Zorunlu Uyarı: Bunu yapma Şubenizi eski işlemlerin kopyalarını paylaşan başka kişilerle paylaşıyorsanız, bunun gibi bir sıfırlama kullanmak, yeni sıfırlama şubesiyle çalışmalarını yeniden senkronize etmek zorunda kalmaları için zorlar. İşi bir sıfırlama ile kaybetmeden güvenli bir şekilde nasıl geri döndürülebileceğini ayrıntılı olarak açıklayan bir çözüm için, bu cevabı gör.
Cupcake’nin uyarısı konusunda ikinci bir sonuç ... sonuçların çok farkındayım. Bununla birlikte, ihtiyacın gerçekten de bu taahhütleri geçmişten sonsuza dek ortadan kaldırmaksa, bu sıfırlama + temizleme yönteminin bunu yapacağını ve ihtiyacınız olacak Kuvvet Değiştirilmiş şubelerinizi herhangi bir uzaktan kumandaya geri itin. - ashnazg
unutmayın, temiz, kurulum / IDE tarafından kullanılabilecek .idea (phpstorm) veya .vagrant (vagrant) gibi dosyaları / klasörleri kaldıracaktır! - timhc22
git clean -f TEHLİKE TEHLİKE - Tisch
@Pogrindis - burada çok iyi olmayan cevaplar, izlenmeyen dosyaları silmez. - Tisch


"Uncommit" yapmak istiyorsanız, son gönderme mesajını silin ve modifiye edilmiş dosyaları tekrar hazır hale getirin, şu komutu kullanın:

git reset --soft HEAD~1
  • --soft Karşılanmamış dosyaların karşıdaki çalışma dosyaları olarak kalması gerektiğini belirtir. --hard Onları atacak olan
  • HEAD~1 son iştir. 3 sözleşmeyi geri almak isterseniz kullanabilirsiniz HEAD~3. Belirli bir revizyon numarasına geri dönmek isterseniz, bunu SHA hash değerini kullanarak da yapabilirsiniz.

Bu, yanlış şeyi yaptığınız ve son taahhüdünü geri almak istediğiniz durumlarda son derece yararlı bir komuttur.

Kaynak: http://nakkaya.com/2009/09/24/git-delete-last-commit/


103
2018-03-04 17:25



Bu yumuşak ve yumuşak: Çalışmanızı zorlamadıysanız risksiz - nilsM


Cevap vermeden önce, bunun ne olduğunu açıklayan bir arka plan ekleyelim HEAD olduğunu.

First of all what is HEAD?

HEAD sadece mevcut şube üzerindeki mevcut taahhüt (en son) bir referanstır. Sadece bir tane olabilir HEAD herhangi bir zamanda (hariç git worktree).

İçeriği HEAD içeride saklanır .git/HEADve geçerli işlemin 40 bayt SHA-1'ini içerir.


detached HEAD

En son taahhütte değilseniz - yani HEAD tarihte önceki bir işleme işaret ediyor detached HEAD.

Enter image description here

Komut satırında bunun gibi görünecektir - Şube ismi yerine SHA-1 yerine HEAD mevcut şubenin ucuna işaret etmiyor:

Enter image description here


Müstakil HEAD'den nasıl kurtulacağınıza dair birkaç seçenek:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Bu, yeni şubeyi istenen taahhüte işaret edecek. Bu komut, verilen bir taahhüt için ödeme yapacak.

Bu noktada bir şube oluşturabilir ve şu noktadan çalışmaya başlayabilirsiniz:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Her zaman kullanabilirsiniz reflog de. git reflog güncellenen herhangi bir değişikliği gösterecek HEAD ve istenen reflog girişini kontrol etmek HEAD bu sürece geri dönün.

HEAD her değiştirildiğinde, yeni bir giriş yapılacaktır. reflog

git reflog
git checkout HEAD@{...}

Bu sizi arzu ettiğiniz sürece geri götürecek

Enter image description here


git reset HEAD --hard <commit_id>

"Başını istenilen yere taşı."

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Not: (Git 2.7'den beri) ayrıca kullanabilirsiniz git rebase --no-autostash de.

Bu şema, hangi komutun ne yaptığını gösterir. Görebildiğin gibi reset && checkout Değiştirmek HEAD.

Enter image description here


102
2018-02-05 21:56



Mükemmel ipucu git reflogtam da ihtiyacım olan şey buydu - smac89
Ah! Her şey çok karmaşık görünüyor ... süreçte size bir adım geri getiren basit bir komut yok mu? Projenizdeki sürüm 1.1'den sürüm 1.0'a geri dönmek gibi mi? Gibi bir şey beklemek istiyorum: git stepback_one_commit veya bir şey .... - Kokodoko
var: git reset HEAD^ --hard` - CodeWizard
@Kokodoko Evet, korkunç bir şekilde karmaşıktır ... ve küçük değerlendirme uzmanlarının yeni başlayan insanlar için ne kadar iyi bir örneği olduğuna dair mükemmel bir örnek. Lütfen benim cevabıma ve içinde önerdiğim kitaba bakın. Git sezgisel olarak alabileceğiniz bir şey DEĞİLDİR. Ve kesinlikle CodeWizard'ın bunu yapmadığından emin olabilirim. - mike rodent


Git'teki yerel değişiklikleri geri almanın birçok yolunu denedim ve en son işlem durumuna dönmek istediğinizde bunun en iyi sonucu verdiği görülüyor.

git add . && git checkout master -f

Kısa Açıklama:

  • Herhangi bir taahhüt oluşturmayacak git revert yapar.
  • BAŞKAĞINIZI gibi BIRAKMAYACAK git checkout <commithashcode> yapar.
  • Tüm yerel değişikliklerinizi geçersiz kılacak ve şubedeki son işlemden bu yana eklenen tüm dosyaları SİLİNİZ.
  • Sadece şube isimleriyle çalışır, böylece sadece şubedeki son işleme bu şekilde geri dönebilirsiniz.

Yukarıdaki sonuçlara ulaşmak için çok daha kolay ve basit bir yol buldum:

git add . && git reset --hard HEAD

HEAD, şu anki şubenizdeki son taahhütlere işaret eder.

Boulder_ruby'nin önerdiği kod kodu aynı, ama ekledim git add . önce git reset --hard HEAD Son işlemden bu yana yaratılmış olan tüm yeni dosyaları silmek için, çoğu insanın en son taahhüdüne geri döndüğümde beklediğimi tahmin ediyorum.


96
2017-07-29 11:01





Bunu aşağıdaki iki komutla yapabilirsiniz:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

Önceki Git işleminizi kaldıracak.

Değişikliklerinizi korumak isterseniz, şunları da kullanabilirsiniz:

git reset --soft [previous Commit SHA id here]

Sonra değişikliklerinizi kaydedecektir.


76
2017-12-12 06:52



Ben bu mesaja kadar bu yazıya 1/2 bir düzine cevap denedim .. tüm diğerleri, benim git config itmeye çalışırken bana bir hata vermeye devam etti. Bu cevap işe yaradı. Teşekkürler! - gnB
Benim için bir detay, işten çıkarma işleminde ne yaptığımı görmeye devam etmek istedim. Bir dahaki sefere bu verileri bu reset komutunu vermeden önce kaydedeceğim - gnB
Bu, kötü bir birleşmeyi geri almanın tek yoluydu, geri dönüş bu durumda işe yaramadı. Teşekkürler! - Dave Cole


Aşağıdaki bildirimleri adında bir metin dosyasına sahip olduğunuzu varsayalım ~/commits-to-revert.txt (Kullandım git log --pretty=oneline onları almak için)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Oluşturmak darbe her birini geri döndürmek için kabuk komut dosyası:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

Bu, dosya ve dizin oluşturma ve silme işlemleri de dahil olmak üzere bir önceki durumuna geri döner, bunu şubenize aktarır ve geçmişi korursunuz, ancak aynı dosya yapısına geri döndünüz. Git'in neden bir nedeni yok git revert --to <hash> Benim dışımda.


51
2017-10-13 21:51



Sen yapabilirsin git revert HEAD~3 son 3 işi kaldırmak - Rod
@Rod - Hayır, bu doğru değil. Bu komut, HEAD'ın üçüncü büyükannesinin (son üç işi değil) olan taahhüdünü geri alacaktır. - kflorence
@Rod - Bu doğru geliyor, kesinlikle çirkin bir sözdizimi değil mi? Her zaman "geri dönüş" yapmak istediğimi ve daha sezgisel olduğunu taahhüt etmeyi buldum. - kflorence
@Lance git revert --to hakkında size katılıyorum - bu oldukça basit bir şey elde etmek için inanılmaz derecede karmaşık bir yol gibi görünüyor! - Mike Vella
Orada bir daha kolay Bunu şimdi böyle bir betikle yapmanın yolu, sadece kullan git revert --no-commit <start>..<end>, Çünkü git revert Git'in yeni (veya tüm?) sürümlerinde bir taahhüt aralığı kabul eder. Aralığın başlangıcının geri dönüşe dahil olmadığını unutmayın.


Jefromi'nin Çözümlerine Ekstra Alternatifler

Jefromi çözümleri kesinlikle en iyileri ve kesinlikle onları kullanmalısın. Ancak, tamlığı sağlamak için, bir taahhüdü geri almak için kullanılabilecek diğer alternatif çözümleri de göstermek istemiştim. önceki işlemdeki değişiklikleri geri alan yeni bir taahhüt oluşturne olduğu gibi git revert ) Yapar.

Açık olmak gerekirse, bu alternatifler İşlemleri geri almanın en iyi yolu değil, Jefromi'nin çözümleriama sadece aynı şeyi elde etmek için bu diğer yöntemleri de kullanabileceğinizi belirtmek istiyorum. git revert.

Alternatif 1: Sert ve Yumuşak Sıfırlar

Bu Charles Bailey çözümünün çok az değiştirilmiş bir versiyonudur. Git'teki SHA hash'ının yaptığı bir işleme geri dönün mü?:

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

Bu, temel olarak, yumuşak sıfırlamaların, daha sonra işlem yapabileceğiniz dizin / aşamalandırma alanında yapılan önceki işlemin durumunu bırakacağı gerçeğini kullanarak çalışır.

Alternatif 2: Mevcut Ağacı Sil ve Yeni Birimle Değiştir

Bu çözüm, svick’in Checkout eski işlemi gerçekleştir ve yeni bir taahhütte bulun:

git rm -r .
git checkout <commit> .
git commit

Benzer şekilde # 1'e benzer şekilde, bu durumun durumunu yeniden oluşturur. <commit> mevcut çalışma kopyasında. Yapmak gerekli git rm ilk çünkü git checkout bu yana eklenen dosyaları kaldırmaz <commit>.


48
2018-02-29 08:40



Alternatif 1 Hakkında, bir hızlı soru: Bunu yaparak, taahhütler arasında serbestçe durmuyoruz? - Bogac
Alternatif 2'de, noktalar bu komutlarda ne anlama geliyor? - Bogac
@Bogac - noktalar bir dosya yolunu gösterir, bu durumda geçerli dizin, bu yüzden onu çalışma kopyanızın kökünden çalıştırdığınızı varsayar. - Tom