Git deposunu önceki işleme döndürme
Mevcut durumdan belirli bir düzeltmede alınan anlık görüntüye nasıl dönebilirim?
git log yaparsam, aşağıdaki çıktıyı alıyorum:
$ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <email@example.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <firstname.lastname@example.org> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <email@example.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <firstname.lastname@example.org> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah.
3 Kasım’dan itibaren fiksata nasıl geri dönülür, yani
0d1d7fc düzeltmek
0d1d7fc ?
- 1
- 2
-
Bu, "geri döndürme" ile ne demek istediğine çok bağlıdır.
Geçici olarak başka bir düzeltmeye geç.
Geçici olarak ona geri dönmek, kendini aldatmak ve sonra bulunduğun yere geri dönmek istiyorsan, istediğin fiksasyonu kontrol etmek için:
# 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 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.
İşe yaradıysanız, yerel değişikliklerinizi zaten yaptınız, ancak en azından ayarları yeniden sıfırlayarak en azından bulunduğunuz yere geri dönebilirsiniz.
Yeni taahhütler ile yayınlanan taahhütleri iptal et
Öte yandan, bu eseri yayınladıysanız, hikayeyi etkili bir şekilde yeniden yazdığı için muhtemelen dalı sıfırlamak istemezsiniz. Bu durumda, gerçekten taahhüdü iade edebilirsiniz. Git ile geri alma işleminin çok özel bir anlamı vardır: geri almak için ters düzeltme ekini kullanarak bir taahhüt oluşturun. Demek hiçbir hikayeyi yeniden yazmıyorsun.
Çalışan bir kopyayı son işleme teslim et
Bir önceki göreve dönmek için herhangi bir değişikliği göz ardı ederek:
git reset --hard HEAD
HEAD mevcut konudaki son düzeltmedir.
Çalışan bir kopyayı eski bir işleme teslim etme
Son taahhütten daha büyük olan taahhütlere geri dönmek için:
1396
Pek çok zor ve tehlikeli cevap var, ama aslında bu kolay:
git revert --no-commit 0766c053..HEAD git commit
Bu, HEAD'den her şeyi bir taahhüte geri döndürecektir; bu, çalışma ağacında bu taahhüt durumunu, o zamandan beri geri verilen her şeymiş gibi yeniden yarattığı anlamına gelir. Ardından mevcut ağacı düzeltebilirsiniz ve esasen “döndürdüğünüz” düzeltmeye eşdeğer tamamen yeni bir düzeltme oluşturacaktır.
(
--no-commit bayrağı
--no-commit tüm taahhütleri aynı anda iade etme izni verir. Aksi halde, aralıktaki her bir işlem için bir mesaj göndermeniz istenecek, böylece tarihinizi gereksiz yeni taahhütler ile karıştıracaksınız.)
Bu, önceki durumuna geri dönmenin güvenli ve kolay bir yoludur . Hiçbir tarih yok edilmedi, bu yüzden zaten yayınlanmış olan taahhütler için kullanılabilir.
Benim için ve belki de diğerleri için en iyi seçenek Git sıfırlama seçeneği:
git reset --hard <commidId> git clean -f
Benim için en iyi seçenek buydu! Basit, hızlı ve verimli!
Not: Yorumlarda belirtildiği gibi, şubenizi eski taahhütlerin kopyaları olan diğer kişilerle paylaşıyorsanız, bunu yapmayın.
Ayrıca yorumlardan, az "ballzy" yöntemini kullanmak istiyorsanız,
git clean -i
Cevap vermeden önce, HEAD'in ne
HEAD açıklayan küçük bir arka plan ekleyin.
First of all what is HEAD?
HEAD geçerli konudaki mevcut (son) taahhüdün bir referansıdır. Herhangi bir zamanda sadece bir
HEAD (
git worktree hariç).
HEAD içeriği
.git/HEAD içinde saklanır ve mevcut taahhüdün 40 bayt SHA-
.git/HEAD içerir.
detached HEAD
Son taahhüdü kullanmıyorsanız, bu,
HEAD tarihteki önceki taahhüdü işaret ettiği anlamına gelir, buna
detached HEAD denir.
Hız aşırtma yapmak istiyorsanız, son işlem mesajını silin ve değiştirilen dosyaları sıraya koyun. Komutu kullanmanız gerekir:
git reset --soft HEAD~1
-
--softkilidi açılmış dosyaların
--hardtersine, çalışan dosyaları olarak kaydedilmesi gerektiğini belirtir.
-
HEAD~1- son düzeltme. 3 düzeltmeyi geri almak istiyorsanız,
HEAD~3kullanabilirsiniz. Belirli bir revizyon numarasına geri dönmek istiyorsanız, bunu SHA-karma değerinizi kullanarak da yapabilirsiniz.
Bu, yanlış bir şey yaptığınız ve bu son işlemi iptal etmek istediğiniz durumlarda son derece yararlı bir komuttur.
Git'teki yerel değişiklikleri geri almanın birçok yolunu denedim ve yalnızca son işlem durumuna geri dönmek istiyorsanız en iyi şekilde çalıştığını görünüyor.
git add . git checkout master -f
Kısa açıklama:
-
git revertyaptığı gibi herhangi bir taahhüt yaratmaz.
-
git checkout <commithashcode>gibi
git checkout <commithashcode>.
- Tüm yerel değişikliklerinizi geçersiz kılar ve dizideki son işlemden bu yana eklenen tüm dosyaları kaldırır.
- Sadece şubelerin isimleriyle çalışır, böylece şubedeki son işleme geri dönebilirsiniz.
Yukarıdaki sonuçlara ulaşmak için çok daha uygun ve kolay bir yol buldum:
git add . git reset --hard HEAD
HEAD mevcut konudaki son işlemi gösterir.
Bu, boulder_ruby ile aynı koddur, ancak
git add . ekledim
git add .
git reset --hard HEAD önce - son
git reset --hard HEAD önce oluşturulan tüm yeni dosyaları silmek için
git reset --hard HEAD .
Bunu aşağıdaki iki komutla yapabilirsiniz:
git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f
Önceki Git taahhüdünü kaldıracak.
Değişikliklerinizi kaydetmek istiyorsanız, şunları da kullanabilirsiniz:
git reset --soft [previous Commit SHA id here]
Sonra değişikliklerinizi kurtaracak.
Diyelim ki aşağıdaki taahhütleri
~/commits-to-revert.txt adında bir metin dosyasında
~/commits-to-revert.txt (
git log --pretty=oneline almak için
git log --pretty=oneline kullandım)
fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca
Her birini döndürmek için bir bash kabuk betiği oluşturun:
55
Jefromi Solutions'e Ek Alternatifler
Jefromi çözümleri kesinlikle en iyisidir ve kesinlikle onları kullanmalısınız. Bununla birlikte, bütünlük için, bir taahhüt vermek için de kullanılabilecek bu diğer alternatif çözümleri göstermek istedim (bir önceki dönüşe yaptığınız gibi değişiklikleri önceki geri dönüşe tersine çeviren yeni bir taahhüt oluşturmuş olmanız anlamında).
Açıkçası, bu alternatifler, Jefromi çözümlerinin taahhüdüne geri dönmenin en iyi yolu değildir , ancak
git revert aynı seviyeye ulaşmak için bu diğer yöntemleri de kullanabileceğinizi belirtmek istiyorum.
Alternatif 1: Sert ve yumuşak sıfırlama
53
Bu tam kombinasyon dışında burada benim için hiçbir şey işe yaramadı:
git reset --hard <commit_hash> git push origin <branch_name> --force
Buradaki anahtar zorlamadır, sabitleme / sabitleme hakkında ek mesaj yok, vb.
Bir önceki taahhüdüne geri dönmenin çok daha kolay bir yolu (ve yönetilmeyen bir durumda olmasını sağlayın, istediğiniz şeyi yapın):
git reset HEAD~1
Bu yüzden, tanımlayıcıları vb. Düzeltmeye gerek yoktur. :)
Tamam, git önceki görevine geri dönmek oldukça basit ...
Değişiklikleri kaydetmeden geri dön:
git reset --hard <commit>
Geri dönün ve değişiklikleri kaydedin :
git reset --soft <commit>
Git reset komutunu kullanarak, yukarıda gördüğünüz gibi, genellikle bir karma işlem ile belirli bir duruma sıfırlayabileceğinizi açıklayın .
Ancak, gördüğünüz gibi, fark,
--soft ve
--hard arasındaki iki bayrağı kullanmaktır, varsayılan,
--soft bayrağı kullanılarak
git reset , ancak her zaman bu bayrağı kullanmanız önerilir, her bayrağı
--soft :
--soft
Açıklandığı gibi varsayılan bayrak, oluşturulmasını gerektirmez, çalışma ağacını değiştirmez, ancak tüm değişiklik dosyalarını işlenmeye hazır hale getirir, böylece dosya değişikliklerinin değişmediği taahhüt durumuna geri dönersiniz.
--hard
Bu bayrakla dikkatli olun, çalışan ağacı sıfırlar ve izlenen dosyalardaki tüm değişiklikler kaybolur!
Ayrıca git ile çalışırken gerçek hayatta gerçekleşebilecek bir resim yarattım:
Ev sahibi hakkında ve uygun dalda konuştuğunuzu varsayarak (bu, endişelendiğiniz herhangi bir iş dalı olabileceğini gösterir):
# Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master
Blog postasındaki cevabı buldum Belirli bir işlem için uzaktaki Git deposunu sil .
Özellikle eski taahhütleri iade etmek ve yürütmek için bir komut (Git çekirdeğinin bir parçası değil, ama git-extras paketinde bulunur):
git back
Man sayfasında, şu şekilde de kullanılabilir:
# Remove the latest three commits git back 3
Son işleme geri dönün ve tüm yerel değişiklikleri yoksayın:
git reset --hard HEAD
İstediğiniz tutucuyu seçin ve kontrol edin.
git show HEAD git show HEAD~1 git show HEAD~2
İstediğiniz fikrini alana kadar. HEAD'in bunu göstermesi için zorlamak
git reset --hard HEAD~1
veya
git reset --hard HEAD~2 veya başka bir şey.
Bu ilk adımları kendiniz tamamlayabilir ve git-repo'ya dönebilirsiniz.
git pull --allall komutunu kullanarak havuzunuzun en yeni sürümünü Bitbucket'ten
git pull --all.
Git log komutunu -n 4 ile terminalden çalıştırın. -N sonrasındaki sayı, yerel geçmişinizdeki son işlemden başlayarak, günlükteki işlem sayısını belirler.
$ git log -n 4
Reset
git reset --hard HEAD~Nkullanarak havuzunuzun geçmişine göre N, geri almak istediğiniz taahhütlerin sayısıdır. Aşağıdaki örnekte, baş, havuz tarihindeki en son işlem olan tek bir işleme ayarlanacaktır:
Değişikliği zorlamak için
git push --forceile
git push --forcebir değişikliğe tıklayın.
Git deposunun önceki bir işlem yapmasını istiyorsanız,
git pull --all git reset --hard HEAD~1 git push --force
Bu, yakın tarihli bir taahhüt için başka bir doğrudan sıfırlama yöntemidir.
git stash git stash clear
Son taahhütten bu yana yaptığınız tüm değişiklikleri doğrudan temizler.
PS: Küçük bir problemi var; ayrıca son kaydedilen tüm önbellek değişikliklerini siler. Bence çoğu durumda önemli değil.
Kodlayıcı dizinini bazı rasgele değişikliklerden tamamen temizlemek için kullandık:
git add -A . git reset --hard HEAD
Sadece
git reset --hard HEAD değişikliklerden kurtulur, ancak "yeni" dosyalardan kurtulmaz. Bu durumda, yanlışlıkla rastgele bir yere önemli bir klasör sürüklediler ve tüm bu dosyalar Git ile yeni olarak değerlendirildi, bu yüzden
reset --hard onu düzeltmedi.
git add -A . çalıştırılıyor
git add -A . önceden, sıfırlama ile imha edilmiş Git ile açıkça hepsini takip etti.
Önceki bir taahhütten HEAD'e yapılan değişiklikleri kaydetmek ve önceki bir göreve geçmek için aşağıdakileri yapın:
git reset <SHA>
Önceki HEAD taahhüdünde değişiklik yapılması gerekmiyorsa ve sadece tüm değişiklikleri attıysanız, aşağıdaki adımları izleyin:
git reset --hard <SHA>
Bazı kişilerin bu geri dönüşe sahip olduğuna inanıyorum, geri alma işleminin sahiplerinde yaptıkları değişiklikleri nasıl yaptığını bilmek ister - yani, her şeyi çöpe atıp kökene / sahibine geri dönün ve bu durumda, aşağıdakileri yapın:
git reset --hard origin/master
Geri alma, taahhütte bulunma komutudur.
git revert <commit1> <commit2>
örnek:
git revert 2h3h23233
Aşağıda gösterildiği gibi kafadan bir aralık alabilir. İşte 1 diyor ki: "Son düzeltmeyi geri gönder."
git revert HEAD~1..HEAD
ve sonra
git push
En Son Taahhütleri Geri Al:
git reset --hard HEAD
HEAD geçerli konudaki mevcut (son) taahhüdün bir referansıdır. İstediğiniz zaman yalnızca bir
HEAD olabilir.
Eski komuta geri dönün: eski sürüme geri dönmenin en hızlı yolu
reset komutunu kullanmaktır:
# Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard
Bu, HEAD şubenizi belirtilen sürüme sarar. Bu sürümden sonra ortaya çıkan bütün taahhütler aslında iptal edildi; Projeniz tam olarak o ankiyle aynı.
Reset komutunun birçok seçeneği var, en ilginçlerinden biri -
--soft flag.
--hard yerine
--hard , Git bu değişiklikleri "geri al" olarak yerel değişiklikler olarak
--hard .
Yeni bir yerel şubedeki sürümü geri yükleme
Söylendiği gibi,
HEAD reset komutunu kullanmak oldukça radikal bir eylemdir: belirtilen revizyondan sonra ortaya çıkan tüm taahhütleri (bu dalda) kaldıracaktır. İstediğinin bu olduğundan eminsen, her şey yolunda.
Bununla birlikte, mevcut HEAD şubenizi dokunmadan bırakmayı tercih ederseniz daha güvenli bir yol vardır. Так как "ветки" настолько дешевы и легки в Git, мы можем легко создать новую ветку, которая начинается с этой старой версии:
git checkout -b old-project-state 0ad5a7a6