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 <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 fiksata nasıl geri dönülür, yani 0d1d7fc düzeltmek 0d1d7fc ?

6500
06 нояб. Crazy Serb 06 Nov. tarafından set 2010-11-06 19:58 '10, 19:58 2010-11-06 19:58
ответ 41 cevap
  • 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.

git-revert revert manpage , tarifnamede bunun çoğunu kapsar.  Diğer bir faydalı link ise git-revert'i tartışan git-scm.com bölümüdür . 

Sonunda geri dönmek istemediğinize karar verirseniz, geri dönüşü (burada açıklandığı gibi) geri gönderebilir veya geri dönmeden önce geri dönebilirsiniz (önceki bölüme bakın).

Bu durumda bu cevabı da yararlı bulabilirsiniz:
Baş önceki yerine nasıl getirilir? (Ayrı kafa)

8356
06 нояб. Cevap Cascabel 06 Kasım tarafından verildi. 2010-11-06 20:04 '10, 20:04 2010-11-06 20:04

Ç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.

border=0

Ç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
21 авг. boulder_ruby Cevap 21 Ağu 2012-08-21 09:19 '12, 09:19 2012-08-21 09:19

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.

1361
12 февр. Cevap 12 Şubat'ta Yarin tarafından verildi . 2014-02-12 07:18 14, 07:18, 2014-02-12 07:18

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

173
22 окт. Cevap Pogrindis tarafından 22 Ekim'de verildi . 2013-10-22 14:53 '13, 14:53 2013-10-22 14:53

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.

2019

06 февр. Cevap CodeWizard 06 Şubat'ta verilir. 2015-02-06 00:56 '15 0:56 2015-02-06 00:56

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 
  • --soft kilidi açılmış dosyaların --hard tersine, çalışan dosyaları olarak kaydedilmesi gerektiğini belirtir.
  • HEAD~1 - son düzeltme. 3 düzeltmeyi geri almak istiyorsanız, HEAD~3 kullanabilirsiniz. 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.

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

116
04 марта '14 в 20:25 2014-03-04 20:25 Cevap Stephen Ostermiller tarafından 04 '14 Mart tarihinde 20:25 tarihinde yapılmıştır 2014-03-04 20:25

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 revert yaptığı 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 .

104
29 июля '12 в 14:01 2012-07-29 14:01 Cevap Roman Minenok'a veriliyor 29 Temmuz, 12, 02:01 2012-07-29 14:01

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.

90
12 дек. Cevabı kiran boghra 12 Ara verilir. 2014-12-12 09:52 '14, 09:52, 2014-12-12 09:52

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
14 окт. Cevap 14 Ekim'de Lance Caraccioli tarafından verildi . 2011-10-14 00:51 '11 0:51 2011-10-14 00:51

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

Bu, Charles Bailey'nin SHA-hash'ı Git'e geri götürme çözümünün çok az değiştirilmiş bir versiyonu mu? :

53
29 июня '14 в 20:51 2014-06-29 20:51 Cevap kullanıcı tarafından verilir456814 29 Haziran 14: 20:51 2014-06-29 20:51

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.

53
13 февр. Cevap 13 feb serdarsenay verildi . 2018-02-13 01:40 '18, 1:40 2018-02-13 01:40

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. :)

50
29 февр. Cevap Paul Walczewski tarafından 29 Şubat'ta verildi. 2016-02-29 11:40 '16, 11:40 2016-02-29 11:40

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:

2019

20 июля '17 в 18:55 2017-07-20 18:55 Cevap Alireza tarafından 20 Temmuz 17'de 18: 55'te verilmiştir 2017-07-20 18:55

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 .

45
10 мая '16 в 20:21 2016-05-10 20:21 markreyes'e verilen cevap 10 Mayıs, 16: 20: 21'de 2016-05-10 20:21

Tüm değişikliklerden sonra, tüm bu komutlara bastığınızda, şunları kullanmanız gerekebilir:

 git push -f ... 

Ve sadece git push değil.

34
05 сент. Cevap sivi 05 eylül ayında verildi . 2013-09-05 17:03 '13, 17:03 2013-09-05 17:03

Ö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 
32
08 авг. Cevap Shadow Man 08 Ağustos tarafından verildi . 2013-08-08 21:30 '13 21:30 2013-08-08 21:30

Son işleme geri dönün ve tüm yerel değişiklikleri yoksayın:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 Cevap 26 Ocak'ta Mohammed Irfan Tirupattur tarafından 16:13 2016-07-26 16:13 tarihinde verilir.

İ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.

26
26 февр. Cevap tonythomas01 26 Feb. 2014-02-26 15:52 '14, 15:52 2014-02-26 15:52

Bu ilk adımları kendiniz tamamlayabilir ve git-repo'ya dönebilirsiniz.

  1. git pull --all all komutunu kullanarak havuzunuzun en yeni sürümünü Bitbucket'ten git pull --all .

  2. 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

  3. Reset git reset --hard HEAD~N kullanarak 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:

  4. Değişikliği zorlamak için git push --force ile git push --force bir 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 
24
06 апр. Cevap , Nis 06 tarihinde Nis 06 tarihinde verildi. 2017-04-06 15:20 '17, 15:20 2017-04-06 15:20

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.

20
05 мая '16 в 14:43 2016-05-05 14:43 Cevap Point Networks 05 May '16 tarafından 14: 43'te 2016-05-05 14:43 tarihinde verilmiştir.

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.

20
11 окт. Cevap , 11 Ekim tarihinde Chris Moschini tarafından verildi. 2015-10-11 03:10 '15 3:10 2015-10-11 03:10

Ö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> 
20
28 июля '15 в 11:35 2015-07-28 11:35 Cevap Vishnu Atrai tarafından 28 Temmuz 'da, 11:35, 2015-07-28 11:35 tarihinde verilmiştir.

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 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. Cevap nevster 05 feb . 2015-02-05 04:28 '15, 04:28 2015-02-05 04:28

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

16
20 авг. Cevap Sireesh Yarlagadda 20 ağustos . 2015-08-20 17:45 '15 5:45, 2015-08-20 17:45

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