Git'teki yerel taahhütleri atın


1469

Bazı kötü kiraz toplama nedeniyle, yerel Git depom şu anda iyi durumda değil, başlangıçtan beş komisyon ileridedir. Tüm bu taahhütlerden kurtulmak ve yeniden başlamak istiyorum.

Açıkçası, çalışma dizinimi silmek ve yeniden klonlamak bunu yapardı, ancak GitHub'dan her şeyi tekrar indirmek aşırıya kaçmış gibi görünüyor ve zamanımı iyi kullanmıyor.

Belki git revertihtiyacım olan şeydir, ancak kodun kendisini doğru duruma getirse bile, başlangıçtan önce (hatta altı) 10 taahhüt yapmak istemiyorum . Sadece son yarım saatte hiç olmamış gibi yapmak istiyorum.

Bunu yapacak basit bir komut var mı? Bu bariz bir kullanım örneği gibi görünüyor, ancak bunun bir örneğini bulamıyorum.


Bu soru hakkında özellikle unutmayın kaydedilmesini , değil hakkında:

  • izlenmeyen dosyalar
  • değişmemiş değişiklikler
  • aşamalı, ancak taahhüt edilmemiş değişiklikler

Yanıtlar:


2470

Fazla taahhütleriniz yalnızca sizin tarafınızdan görülebiliyorsa git reset --hard origin/<branch_name> , başlangıç ​​noktasına geri dönmek için bunu yapabilirsiniz . Bu, deponun durumunu önceki işleme sıfırlar ve tüm yerel değişiklikleri atar.

Bir Doing git revertyapar yeni hareketin kaldırmak için eski herkesin geçmişi delirmemi önlüyor şekilde kaydedilmesini.


91
git reset --hard <commit hash, branch, or tag>uzak bir dal dışında belirli bir referansa gitmek istiyorsanız.
Sam Soffes

55
Açık olmak gerekirse, üzerinde çalışmıyorsanız, masterancak başka bir dalda çalışıyorsanızgit reset --hard origin/<your-branch-name>
Zoltán

33
Bu sadece yerel taahhütleri atmakla kalmaz, aynı zamanda çalışma ağacınızdaki her şeyi (yani yerel dosyalarınız) atar. Yapmak istediğiniz her şey tamamlanmamışsa, ancak çalışmanızı sağlam bırakın, stackoverflow.com/questions/2845731/…
aaronbauman

3
Bundan sonra bir Getir yapmak isteyebilirsiniz. Bu, SourceTree'deki push-to-push-to-push-bekleyen sayacı düzeltildi.
Stan

2
git reset --hard origin/<branch_name>Proje yapılandırmasını da sıfırlayacaktır, bu yüzden buna dikkat edin. .cfgVarsayılan olarak sıfırlanmış büyük bir dosyam var . Bunun için tekrar saatler harcamak zorunda kaldım.
MAC

271

Yerel ana dalınızı silin ve şu şekilde yeniden oluşturun:

git branch -D master
git checkout origin/master -b master

2
Bu, değişikliklerinizin geri izlenmesinin çok fazla zaman alacağı zaman iyi çalışır, bu da birkaç yeniden bazın ardından bana oldu.
14'te

1
Ekip üyeleri arasında ağaç altı çekme / itme sorunları için kullanışlıdır!
Jorge Orpinel

Bu, yalnızca master yerine bir dalı geri yüklemek istediğinizde mükemmeldir.
Vladimir Ralev

1
bu, tekli yerel taahhüdü silmek için iyi bir yol değildir. Daha iyi kullanmak içingit reset --hard origin/<branch_name>
Kirit Vaghela

1
Belki bu çözüm işe yarayacaktır, ancak bu doğru çözüm olduğu anlamına gelmez.
Adly

202

Deneyin:

git reset --hard <the sha1 hash>

başınızı istediğiniz yere sıfırlayın. Hangi taahhütte olmak istediğinizi görmek için gitk komutunu kullanın. Gitk içinde de sıfırlama yapabilirsiniz.


5
Bu b / c'yi yararlı buldu, ancak Ben Jackson'ın yanıtı, tam olarak istediğimi çözmek için onay işaretini alıyor - taahhüt karmalarını aramamı gerektirmeyen bir şekilde. :)
David Moles

2
Bu henüz yeni şube kökenli itilmiş olmamıştı biridir
Jan

126

En son taahhüdü silin:

git reset --hard HEAD~1

Yaptığınız işi yok etmeden en son taahhüdü silin:

git reset --soft HEAD~1


5
Yararlı cevap. Teşekkür ederim! Git Reset kullantım --soft origin / master
Tarun Kumar

2
@TarunKumar TEŞEKKÜRLER! VS entegrasyonunu kullanıyorum ve çözümünüz, check-in iznine sahip olmadığım bir şubede istemediğim bir sürü birleştirme taahhüdünü silmemin tek yoluydu.
DVK

Teşekkürler, sadece aradığım şey, "git reset --soft HEAD ~ 1" yanlışlıkla istemeden ve geri dönmek istedim ama geri döndükten sonra imha etmek istemediğim diğer dosyaları vardı gibi yaptı.
edvard_munch

47

Eğer kullanıyorsanız Atlassian SourceTree uygulamasını, bağlam menüsündeki sıfırlama seçeneğini kullanabilirsiniz.

resim açıklamasını buraya girin


42

Şube girişiminizde:

git reset --hard origin/<branch_name>

Bu nedenle " git log" veya " git status" kullanarak geri dönüşü (yerel taahhüt olmadan devlete) doğrulayın .


1
@Troyseph: Yukarıda listelenen tüm cevaplar, olduğu gibi denedim ve senaryoyu düzeltmedim. Yukarıdaki cevapların hiçbirinde gösterilmeyen jenerik yaklaşım, burada cevaplanmaya çalışılan şeydir.
parasrish

3
Kabul edilen cevap sizinkilerle aynıdır, genel şube adı eksi ve yorumlarda @Zoltan açıkça diyorJust to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
Troyseph

1
Bence en iyi cevap bu.
dwjohnston

21

git reset --hard @{u}* taahhütler dahil, mevcut şubedeki tüm yerel değişikliklerinizi siler. Kimsenin bunu yayınlamadığına şaşırdım, ancak dallara geri dönme veya dallarla oynama taahhüdüne bakmak zorunda kalmayacağınızı düşünüyoruz.

* Yani, şu anki şubeye sıfırlayın - @{upstream}genellikle origin/<branchname>, ancak her zaman değil


1
Balık gibi bazı kabuklar "@" değerini yorumlayacaktır, bu yüzden '@ {u}' i tırnak içine almanız gerekebilir, örneğin `` git reset --hard '@ {u}'. Neyse, iyi bul!
trysis

Müthiş cevap harika
Marko

1
@ {U} değerini nasıl yazdırıyorsunuz?
Philip Rego

12

Geri dönmek istediğiniz taahhüdün SHA-1 kimliğini görmek / almak için

gitk --all

Bu taahhüde geri dönmek için

git reset --hard sha1_id

!Not. Bu taahhütten sonra yapılan tüm taahhütler silinecektir (ve projede yaptığınız tüm değişiklikler). Bu yüzden önce projeyi başka bir şubeye kopyalayın veya başka bir dizine kopyalayın.


bu, uzaktan kumandanın artık kullanılamadığı durumlar için harikadır ve birinin yerel bir kararlılığa sıfırlanması gerekir. gitk harika - önceden farkında değildi.
theRiley

Zaten gitk içinde iseniz, sadece taahhütte sağ tıklayın ve "Şube XY'yi buraya sıfırla" yı seçin.
mkrieger1

Ve yeni taahhütler hemen silinmeyecektir. Artık onlara işaret eden bir şube yok (unutmayın, bir şube belirli bir taahhüdün "yer imi" nden başka bir şey değildir).
mkrieger1

9

Zorlanmayan bir taahhüdü kaldırmak istediğim bir durum vardı, ancak taahhüt bir öncekinden önceydi. Bunu yapmak için aşağıdaki komutu kullandım

git rebase -i HEAD~2 -> son iki taahhüdü yeniden doğuracak

Kaldırmak istediğim taahhüt imzası için 'bırak' kullandım.


9

İzlenmeyen dosyaları kaldır (taahhüt edilmeyen yerel değişiklikler)

git clean -df

Tüm yerel taahhütleri kalıcı olarak silmek ve en son uzaktan taahhüdü almak

git reset --hard origin/<branch_name>

8

Aktarılmayan yerel taahhütler için, git rebase -ibir taahhüdü silmek veya ezmek için de kullanabilirsiniz .


1
Bunun en kısa çözüm olmayabileceğini biliyorum, ancak IMHO git rebase -ibirçok benzer sorunu çözmenin daha genel bir yolu olduğundan ve çeşitli durumlarda yardımcı olabileceğinden sizi destekledim .
Stefan Marinov

1
dropRebase'in iptal edilmesini önlemek için tüm taahhütleri kaldırırken anahtar kelimeyi (bir satırı silmek yerine) kullanın .
Michal Čizmazia

6

Basit çözüm yerel ana şube HEAD'ını başlangıç ​​/ ana şube HEAD'iyle eşleştirmek

git reset --hard origin/master

PS: origin / master - ana dalın uzak göstergesidir. Master'ı herhangi bir şube adıyla değiştirebilirsiniz


4

Cevaplamadan önce bunun ne olduğunu açıklayarak biraz arka plan ekleyelim HEAD. çünkü aşağıdaki seçeneklerden bazıları kopuk kafa ile sonuçlanacaktır

First of all what is HEAD?

HEADyalnızca geçerli daldaki geçerli taahhüde (en son) bir referanstır. Herhangi bir zamanda
sadece bir tane olabilir HEAD. (hariç git worktree)

İçeriği HEADdepolanır .git/HEADve mevcut taahhüdün 40 bayt SHA-1'ini içerir.


detached HEAD

En son taahhütte değilseniz - yani HEADtarihte önceki bir taahhüde işaret eden anlamına gelir detached HEAD.

resim açıklamasını buraya girin

Komut satırında, HEADşu anki dalın ucuna işaret etmediğinden , dal adı yerine SHA-1 gibi görünecektir.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Müstakil bir KAFADAN kurtarma için 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, istenen taahhüde işaret eden yeni şubeyi kontrol edecektir.
Bu komut, verilen bir taahhüde ödeme yapar.
Bu noktada, bir şube oluşturabilir ve bu noktadan itibaren ç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 da kullanabilirsiniz reflog.
git refloggüncellenen değişiklikleri görüntüleyecek HEADve istenen reflog girişini kontrol HEADetmek bu işleme geri dönecektir.

HEAD her değiştirilişinde, reflog

git reflog
git checkout HEAD@{...}

Bu sizi istediğiniz taahhüde geri götürür

resim açıklamasını buraya girin


git reset --hard <commit_id>

HEAD'inizi istenen işleme geri "taşıyın".

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

git revert <sha-1>

Verilen taahhüt veya taahhüt aralığını "Geri al".
Sıfırlama komutu, verilen işlemde yapılan değişiklikleri "geri alır".
Geri alma yamasıyla yeni bir taahhüt gerçekleştirilecek, orijinal taahhüt de tarihte kalacaktır.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Bu şema hangi komutun ne yaptığını gösterir.
Gördüğünüz gibi orada reset && checkoutdeğiştirin HEAD.

resim açıklamasını buraya girin


3

Visual Studio çözümü ile ilgilenenler için, burada matkap:

  1. Gelen Team Explorerpencerede, hedef repo bağlanın.
  2. Ardından Branches, ilgili dalı sağ tıklayın ve öğesini seçin View history.
  3. HistoryPenceredeki bir taahhüdü sağ tıklayın ve öğesini seçin Reset -> Delete changes (--hard).

Bu, yerel taahhütlerinizi ortadan kaldıracak ve repo durumunuzu seçilen taahhüde sıfırlayacaktır. Yani repoyu çektikten sonra yaptığınız değişiklikler kaybolacak.


2

origin/XXXŞubeniz ` ` 5 komisyondan öndeyse.

Şunları yapabilirsiniz:

git reset --hard HEAD~5

Ve son 5 taahhüdü kaldırmalıdır.


0
git reset --hard <SHA-Code>

Yerel kopyanızda yanlışlıkla uzak şubenize aktarılmadığından emin olmak istediğiniz bazı hatalar yaptıysanız, bu kullanışlı olacaktır.

SHA Kodu, şubedeki son işlem için git gösterge tablonuzun webVersion'a bakarak elde edilebilir.

Bu şekilde şubedeki son işlemle senkronize olabilirsiniz.

git pullSenkronize edilecek yeni hiçbir şeyi onaylamak için donanım sıfırlamasını başarıyla tamamladıktan sonra yapabilirsiniz , yani mesajı göreceksiniz.

Şubeniz ile güncel Origin/<Branch Name>


0

Yerel deponuzu tam bir karmaşaya sokarsanız, Git'teki yerel taahhütleri atmanın güvenilir bir yolu ...

  1. Uzak kaynaklı URL'yi almak için "git config --get remote.origin.url" komutunu kullanın
  2. Local git klasörünü "my_broken_local_repo" olarak yeniden adlandır
  3. Uzak git deposunun yeni yerel kopyasını almak için "git clone <url_from_1>" kullanın

Benim tecrübelerime göre Eclipse, dünyayı değiştirmeyi çok iyi idare ediyor. Ancak, Eclipse'de etkilenen projeleri seçmeniz ve Eclipse'i yeniden oluşturmaya zorlamak için temizlemeniz gerekebilir. Sanırım diğer IDE'ler de zorla yeniden inşaa ihtiyaç duyabilir.

Yukarıdaki prosedürün bir yan yararı, projenizin git'e yerleştirilmemiş yerel dosyalara bağlı olup olmadığını öğrenmenizdir. Dosyaları eksik bulduğunuzda "my_broken_local_repo" adresinden kopyalayıp git'e ekleyebilirsiniz. Yeni yerel deponuzun ihtiyacınız olan her şeye sahip olduğundan emin olduktan sonra "my_broken_local_repo" silebilirsiniz.


0

Sadece yerel taahhütleri atmak ve değişiklikleri dosyalarda tutmak istiyorsanız
git reset @ ~
Diğer cevaplar sert sıfırlamaya yöneliktir

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.