Git'teki son işleri nasıl geri alabilirim?
Yanlışlıkla hatalı dosyaları Git'e gönderdim, ancak henüz sunucuya bir taahhüt göndermedim.
Bu taahhütleri yerel depodan nasıl iptal edebilirim?
Geri al ve yinele
20501
Bir taahhüdün iptal edilmesi, nasıl çalıştığını bilmiyorsanız biraz korkutucu olur. Ama eğer anlarsanız, aslında şaşırtıcı derecede kolaydır.
Diyelim ki C, HEAD'iniz nerede ve (F) dosyalarınızın durumu.
(F) ABC ↑ master
Taahhüt C'yi sıfırlamak ve bir daha asla görmek istemezsiniz. Bunu sen yap:
git reset --hard HEAD~1
sonuç:
(F) AB ↑ master
Şimdi B - HEAD. - --hard
kullandığınızdan --hard
, B --hard
dosyalarınız durumuna geri döner.
Ah, ama C'nin kabullenmesinin bir felaket olmadığını, birazcık olduğunu varsayalım. Bir taahhüdü iptal etmek istiyorsunuz , ancak en iyisini yapmadan önce değişikliklerinizi küçük bir düzenlemede saklayın . Buraya yeniden başlayarak, başınız olarak C ile:
(F) ABC ↑ master
Bunu bırakarak yapabilirsiniz - --hard
:

git reset HEAD~1
Bu durumda, sonuç:
(F) ABC ↑ master
Her iki durumda da, HEAD son taahhüdün sadece bir göstergesidir. Bir git reset HEAD~1
, Git'e HEAD imleci bir tane geri getirmesini söyleyin. Ancak ( --hard
kullanmadıkça) dosyalarınızı olduğu gibi bırakırsınız. Şimdi git status
, C'ye kaydettiğiniz değişiklikleri gösterir. Hiçbir şey kaybetmediniz!
Hafif bir dokunuş için, taahhüdü bile iptal edebilirsiniz , ancak dosyalarınızı ve dizininizi bırakın :
git reset --soft HEAD~1
Bu sadece dosyalarınızı yalnız bırakmakla kalmaz, aynı zamanda indeksinizi de yalnız bırakır. git status
yaptığınızda, dizinin öncekiyle aynı dosyaları içerdiğini göreceksiniz. Aslında, bu komuttan hemen sonra, git commit
yerine getirebilir ve yaptığınız taahhütleri yinelemeniz gerekir.
Bir şey daha var: ilk örnekte olduğu gibi bir taahhüdü ortadan kaldırdığınızı varsayalım , ama sonunda buna ihtiyacın olduğunu keşfettiniz ? Şans yok, değil mi?
Hayır, geri almanın bir yolu var. git reflog
ve yok ettiğiniz taahhüdü bulmak için dolaştığınız (kısmen) işlenen ShAS'ın (yani, karma) bir listesini göreceksiniz ve yapın:
git checkout -b someNewBranchName shaYouDestroyed
Şimdi bu taahhüdü tekrar başlattınız. Git'te yaklaşık 90 gün boyunca komiteler aslında yok edilmedi, bu yüzden genellikle kurtulmak istemediğiniz birini geri getirip kurtarabilirsiniz.
Anlamak biraz zamanımı aldı, belki bu birine yardım ederdi ...
Genel bir rapor hazırlayıp hazırlamadığınıza bağlı olarak (uzaktaki depoya tıklandığında), son taahhüdünüzü "geri almak" için iki yol vardır:
Yerel bir taahhüt nasıl iptal edilir
Yerel olarak yaptığım söylensin, ama şimdi bu fiksasyonu kaldırmak istiyorum.
git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want
Son işlemden önceki her şeyi geri yüklemek için HEAD'den önce işlem yapmadan önce reset
yapmamız gerekir:
git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made
Şimdi git log
, son taahhüdümüzün kaldırıldığını gösterecek.
Genel düzeltme nasıl iptal edilir
Taahhütlerinizi zaten kamuya açık hale getirdiyseniz, önceki taahhüdünüze (mevcut HEAD) yaptığınız değişiklikleri "geri veren" yeni bir taahhüt oluşturmanız gerekecektir.
git revert HEAD
Şimdi değişiklikleriniz geri alınacak ve taahhüt edilmeye hazır olacak:
git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need
Daha fazla bilgi için Git Temelleri - İşleri İptal Et'e bakın.
İstediğini elde etmek için dosya ekle / kaldır:
git rm classdir git add sourcedir
Ardından taahhüdü değiştirin:
git commit --amend
Daha önce yapılan hatalı düzeltme, dizinin yeni durumunu yansıtacak şekilde düzenlenecek - başka bir deyişle, ilk başta asla bir hata yapmamış gibi görüneceksiniz.
Bunu ancak henüz tıklamadıysanız yapmanız gerektiğini unutmayın. Tıkladıysanız, normalde düzeltmeyi taahhüt etmeniz gerekir.
926
Son taahhüdü değiştirmek için
Dizindeki dosyaları değiştirin:
git rm --cached *.class git add *.java
Ardından, özel bir şube ise, taahhüdü değiştirin :
git commit --amend
Veya bu paylaşılan bir şube ise, yeni bir taahhütte bulunun:
git commit -m 'Replace .class files with .java files'
( önceki taahhüdünü değiştirmek için inanılmaz bir etkileşimli rebase kullanın)
ProTip ™: bu tekrarı durdurmak için gitignore'a *.class
ekleyin.
Düzeltme döndürmek için
Bir taahhüdün değiştirilmesi, son taahhüdünüzü değiştirmeniz gerekirse ideal bir çözümdür, ancak reset
daha genel bir çözümdür.
Git'i kullanarak herhangi bir fikstür için sıfırlayabilirsiniz:
git reset @~N
N
, HEAD'den önceki işlemlerin sayısı ve @~
önceki işlemlere geri döner.
Dolayısıyla, bir taahhütte değişiklik yapmak yerine, kullanabilirsiniz:
git reset @~ git add *.java git commit -m "Add .java files"
git help reset
kontrol et, özellikle, --soft
--mixed
ve --hard
ne yaptığını daha iyi anlamak için.
Reflog
İşin karışırsa, uzak taahhütleri bulmak için her zaman reflog kullanabilirsiniz:
$ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started
git revert <commit-id>
kullanın git revert <commit-id>
Düzeltme kimliği almak için git log
kullanmanız yeterli
Yerel taahhüdü tamamen iptal etmeyi planlıyorsanız, neyi değiştirdiğiniz önemli değil, bir taahhütte bulundunuz ve endişelenmiyorsanız, yalnızca aşağıdaki komutu çalıştırın.
git reset --hard HEAD^1
(Bu komut tüm taahhütlerinizi dikkate almayacak ve değişiklikleriniz yerel çalışma ağacınızdan tamamen kaybolacaktır). Bir taahhüdü iptal etmek istiyorsanız, ancak hazırlama alanında değişiklikler yapmak istiyorsanız (işlemden önce, aynen git add
sonra olduğu gibi), aşağıdaki komutu çalıştırın.
git reset --soft HEAD^1
Artık sabit dosyalarınız hazırlama alanında. Dosyaları aşmak istiyorsanız, yanlış içeriği düzenlemeniz gerektiğinden, aşağıdaki komutu çalıştırdığınızı varsayalım.
git reset HEAD
Şimdi aktarılan dosyalar aşamalı alandan teslim edilmeyen alana gelir. Artık dosyalar düzenlemeye hazır, bu nedenle, neyi değiştirdiğiniz önemli değil, düzenlemeye ve eklemeye gidip yeni / yeni bir işlem oluşturmak isteyeceksiniz.
Git Ekstraları yüklüyse, son işlemi geri git undo
için git undo
çalıştırabilirsiniz. git undo 3
, son 3 taahhüdü iptal eder.
Paylaşılan depomuzdaki son 5 komisyonu iptal etmek istedim. Geri dönmek istediğim revizyon kimliğine baktım. Sonra aşağıdakileri yazdım.
prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt>
git rebase -i
bu görev için kullanmayı tercih ediyorum, çünkü kurtulmak için karar verebileceğim iyi bir liste var. Buradaki diğer cevapların bazıları kadar basit olmayabilir, ancak doğru görünüyor.
Listelemek istediğiniz komisyon sayısını seçin, ardından arayın (son üçünü almak için)
git rebase -i HEAD~3
Örnek liste
pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support
Git daha sonra silinecek herhangi bir satırın taahhüdünü kaldıracaktır.
Önceki yerel taahhüt nasıl düzeltilir?
git commit --amend
gerçekleştirmek için git-gui (veya eşdeğeri) kullanın. GUI'den, ayrı ayrı dosyaları ekleyebilir veya kaldırabilirsiniz. İleti mesajını da değiştirebilirsiniz.
Önceki yerel taahhüt nasıl iptal edilir
Sadece şubenizi önceki konumuna getirin (örneğin, gitk
veya git rebase
kullanarak). Ardından kaydedilen kopyadaki değişiklikleri yeniden uygulayın. Yerel deponuzdaki çöplerin toplanmasından sonra istenmeyen taahhütlerin gerçekleşmemiş olması gibi olacaktır. Bütün bunları tek bir komutta yapmak için git reset HEAD~1
tuşunu kullanın.
Bir uyarı : git reset
dikkatsiz kullanımı, çalışma kopyanızı karıştırmamak için iyi bir yoldur. Bunu yapabilmeleri için Git yenilerini öneririm.
Kamu taahhüdü nasıl iptal edilir
Değişiklikleri iptal etmek için seçme kirazı ( git-revert ) ters çevirin .
Eğer konuya başka bir değişiklik yapmadıysan, basitçe ...
git revert --no-edit HEAD
Ardından güncellenmiş şubeyi ortak depoya gönderin.
Taahhüt tarihi her iki komisyonu ayrı ayrı gösterecektir.
İsteğe bağlı: özel şubeyi genel depoda düzeltin
Bu tehlikeli olabilir - şubenin yerel bir kopyasına sahip olduğunuzdan emin olun.
Ayrıca not edin: Eğer dalda başka biri çalışıyorsa, bunu yapmak istemezsiniz.
git push --delete (branch_name) ## remove public version of branch
Şubenizi yerel olarak temizleyin, ardından itin ...
git push origin (branch_name)
Normal durumda, muhtemelen özel bir şubedeki taahhüt geçmişinize dokunulmasından endişe duymanıza gerek yoktur. Sadece müteakip bir taahhütte bulunun (yukarıdaki “Kamu taahhüdünü nasıl iptal edilir” başlığına bakın) ve hikayeyi gizlemek için bir squash birleştirin .
Bir hata yaptıysanız, ancak tıklamadıysanız,
git reset --soft HEAD~1
HEAD ~ 1 , kafanın önüne sabitlemek için kısa. Alternatif olarak, sıfırlamak istiyorsanız, SHA-1 karma değerine bakabilirsiniz. --soft, taahhüdünüzü kaldıracak ancak git durumunun dediği gibi tüm değiştirilmiş dosyalarınızı "Değişiklikler yapılacak" olarak bırakacaktır.
Çalışma ağacındaki izlenen dosyalardaki herhangi bir değişiklikten kurtulmak istiyorsanız, ses "- hard " kullanmadan önce verilen taahhütten sonra.
YA
Zaten tıkladıysanız ve birileri çektiyseniz, ki bu genellikle benim işimdir, git sıfırlamayı kullanamazsınız. Ancak, geri dönebilir
git revert HEAD
Bu, rastgele bir düzeltme ile girilen her şeyi iptal eden yeni bir düzeltme oluşturacaktır.
Kalıcı olarak iptal etmek istiyorsanız, bazı havuzları klonladınız
Sabit kimliği görülebilir.
git log
O zaman yapabilirsin -
git reset --hard <commit_id> git push origin <branch_name> -f
SourceTree'de (GitHub için GUI), işleme sağ tıklayıp Ters Düzeltme işlemini gerçekleştirebilirsiniz. Bu, değişikliklerinizi geri almalı.
Terminalde:
Ayrıca şunları da kullanabilirsiniz:
git revert
veya:
256
Tek takım:
241
Sadece git
komutunu kullanarak aşağıdaki komutu çalıştırarak sıfırlayın:
git reset --soft HEAD~1
git reset
ne yaptığını temelde reset
dönmek istediğiniz herhangi bir --soft
, ardından --soft
ile birleştirirseniz geri dönecek, ancak değişiklikleri dosyalarınıza kaydedecek, böylece olay yerine geri döneceksiniz. bir dosya eklendi, HEAD
dalın başıdır ve ~1
ile birleştirirseniz (bu durumda, HEAD^
da kullanırsınız), istediğiniz tek komuta geri dönecektir ...
Aşağıdaki durumlarda, gerçek durumlarda meydana gelebilecek tüm adımlar ve kodun yürütülmesi dahil, sizin için daha ayrıntılı olarak oluşturuyorum:
Son git nasıl iptal edilir?
Son işlemden önceki her şeyi geri yüklemek için, düzeltmeyi HEAD olarak sıfırlamamız gerekiyor.
Yaptığınız değişiklikleri kaydetmek istemiyorsanız:
git reset --hard HEAD^
Değişikliklerinizi kaydetmek istiyorsanız:
git reset --soft HEAD^
Şimdi git günlüğünü kontrol et. Son düzeltmemizin kaldırıldığını gösterecek.
Doğru durumu bulmak için reflog kullanın.
git reflog
2019
"Çalışan ağacı son işlemeden önce sıfırla"
git reset --hard HEAD^
"Çalışan ağaçtaki bilinmeyen dosyaları temizle"
git clean
see - Git hızlı başvuru
NOT. Bu komut önceki taahhüdü kaldıracak, bu yüzden dikkatli kullanın! git reset --hard
güvenlidir -
İlk çalıştırma:
git reflog
Size deponuzda gerçekleştirdiğiniz tüm olası eylemleri gösterir; örneğin, taahhüt, birleştirme, çekme, vb.
O zaman yapın:
git reset --hard ActionIdFromRefLog
Son işlemi iptal et:
git reset --soft HEAD^
veya git reset --soft HEAD~
Bu son taahhüdü geri alacak.
Burada - --soft
reset ayarları demektir.
HEAD~
veya HEAD^
HEAD'den önce bir taahhüde gitmek anlamına gelir.
Son taahhüdünü yenisiyle değiştirin:
git commit --amend -m "message"
Son taahhüdün yerine yeni bir tamirciyle geçecek.
Başka bir yol:
İade etmek istediğiniz şube için bir talepte bulunun, ardından yerel çalışma kopyasını uzaktaki sunucuda son kişi olmak istediğinize geri gönderin (hepsi elden geçtikten sonra). Bunu yapmak için SourceTree'ye sağ tıklayıp "BRANCHNAME ürününü bu işleme sıfırla" seçeneğini seçtim.
Ardından yerel depo dizinine gidin ve aşağıdaki komutu çalıştırın:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Bu, yerel depodaki mevcut olandan sonraki tüm taahhütleri siler, ancak yalnızca bir dal için siler.
git log
girin ve en son karma kodunu bulun ve girin:
git reset <the previous co>
Benim durumumda yanlışlıkla istemediğim bazı dosyalar yaptım. Ben de aşağıdakileri yaptım ve işe yaradı:
git reset --soft HEAD^ git rm --cached [files you do not need] git add [files you need] git commit -c ORIG_HEAD
Gitk veya git log --stat ile sonuçları kontrol et
Taahhütlerinizi ve ağacınızı görmek için SourceTree (Git için grafiksel bir araç) kullanın. Sağ tıklatarak el ile sıfırlayabilirsiniz.
İki ana senaryo var.
Taahhüdünüzü zorlamadınız
Sorun, taahhüt etmiş olduğunuz ek dosyalarla --amend
(ve bunları depoda kullanmak istemiyorsanız), bunları git rm
ve sonra --amend
ile --amend
ile --amend
git rm <pathToFile>
Dizinlerin tamamını -r
ile silebilir, hatta diğer bash komutlarıyla birleştirebilirsiniz.
git rm -r <pathToDirectory> git rm $(find -name '*.class')
Dosyaları sildikten sonra --amend seçeneğini kullanarak işlem yapabilirsiniz.
git commit --amend -C HEAD # the -C option is to use the same commit message
Bu, gereksiz dosyaları kaldırarak, yakın zamanda bir yerel işlemi yeniden yazmanıza izin verecek, böylece bu dosyalar hiçbir zaman zorlamaya gönderilmeyecek ve ayrıca yerel .git deponuzdan GC aracılığıyla silinecektir.
Zaten bir taahhüdü tıkladınız
Aynı çözümü farklı bir betiğe uygulayabilir ve sonra -f
seçeneğiyle -f
seçeneğiyle git push
komutunu çalıştırabilirsiniz, ancak bu önerilmemektedir, çünkü silinen geçmişi farklı bir değişiklikle değiştirir (bu, havuzunuza zarar verebilir).
Bunun yerine, --amend
olmadan işlem yapmanız gerekir (this -amend'i hatırlayın ": bu seçenek son işlemin tarihinin üzerine yazar).
Yerel sabitleme için
git reset --soft HEAD~1
veya tam olarak hangi fiksasyonun mümkün olduğunu hatırlamıyorsanız,
git rm --cached <file>
Basılı için
Dosyaları depo geçmişinden kaldırmanın doğru yolu git filter-branch
. Bu,
Git-filtre-dalı (1) Manuel bölümünde daha fazlasını okuyun.
Bunu yapmanın birçok yolu vardır:
Son taahhüt / önceki taahhütleri iptal etmek için Git komutu:
Uyarı: Ne yaptığınızı bilmiyorsanız - sert kullanmayın. - hard çok tehlikelidir ve dosyalarınızı silebilir.
Git kilidini açmak için temel komut şudur:
$ git reset --hard <COMMIT -ID>
veya
$ git reset --hard HEAD~<n>
COMMIT ID : taahhüt için kimlik
n: iade etmek istediğiniz son komisyon sayısı
Taahhüt kimliğini aşağıda gösterildiği gibi alabilirsiniz:
$ **git log --oneline** d81d3f1 function to subtract two numbers be20eb8 function to add two numbers bedgfgg function to mulitply two numbers
d81d3f1 ve be20eb8 , kesin tanımlayıcıdır.
Şimdi bazı vakaları göz önünde bulundurun:
'D81d3f1' son işlemine dönmek istediğinizi varsayalım. İşte iki seçenek:
$ git reset --hard d81d3f1
veya
$ git reset --hard HEAD~1
'Be20eb8' taahhüdüne dönmek istediğinizi varsayalım:
$ git reset --hard be20eb8
Daha fazla bilgi için, kafayı belirtilen bir duruma getirmek için bağlantı kurabilir ve diğer komutları deneyebilirsiniz:
$ git reset --help