Geri çekmeyi geri al, depolar eski duruma nasıl getirilir


1006

Git çekme işlemini geri almanın veya geri almanın herhangi bir yolu var mı? Bunu yapmak istiyorum, çünkü bunu yapmak istemediğim bazı dosyaları birleştirdi, ancak sadece diğer dosyaları birleştirdi. O dosyaları geri almak istiyorum, bu mümkün mü?

EDIT: Açıklama için git birleştirme geri almak istiyorum. Bazı cevapları gördükten sonra yaptım

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Şimdi ne yapmalıyım? Yapmak git reset --hard sorun değil mi? Tekrar vidalamak istemiyorum, bu yüzden ayrıntılı adımlar mı istiyorsun?


23
Tarihinizde sadece iki şey var gibi görünüyor: bir klon ve bir getirme. Sadece klonlamaya sıfırlayın: git reset --hard 01b34faBu durumda git reset --hard HEAD^HEAD'dan önce bir işleme sıfırlanmış olabilirsiniz .
jkp

2
- çalışma dizinizdeki dosyaları değiştirmek istiyorsanız - hard gereklidir
William Pursell

3
@ seg.server.fault: eğer işe yaradıysa, her zaman cevabı kabul edebilirsiniz;)
jkp

7
git reset --hard HEAD ^
funroll

7
git refloggit ile yapılan her şeyi gösterecek. git reset --hard [sha1 of something from reflog]Gösterilmiş olan reflog, bazen hedef olmayan her şeyi geri alacak bir endişe vardır , örneğin. Kökten gelen ana verilerde birleştirmeyi kötü verilerle (gerçekleşir) geri döndürmek istersiniz ve bu birleştirmeden sonra diğer dallarda çalıştınız. reflogher dalda diğer dalları gösterecek. Ancak git checkout masterve git reset --hard [SH1 of commit on master branch just before merge]sadece mevcut ana dalı sıfırdan çekerek birleştirme kaynağından kaldırır.
Vladimir Vukanac

Yanıtlar:


1427

Koşu git pull, aşağıdaki görevleri sırayla gerçekleştirir:

  1. git fetch
  2. git merge

Birleştirme adımı, yapılandırmanızda birleştirilecek şekilde ayarlanmış dalları birleştirir. Birleştirme adımını geri almak istiyorsunuz , ancak muhtemelen getirme (çok mantıklı değil ve gerekli olmamalıdır).

Birleştirmeyi geri almak için git reset --hard, yerel havuzu önceki bir duruma sıfırlamak için kullanın ; Kullanım git-reflog -1 SHA önceki halin bulmak ve sonra buna sıfırlamak için.

Uyarı

Bu bölümde listelenen komutlar, taahhüt edilmemiş tüm değişiklikleri kaldırır ve muhtemelen iş kaybına yol açar:

git reset --hard

Alternatif olarak, aşağıdaki gibi belirli bir noktaya sıfırlayın:

git reset --hard master@{"10 minutes ago"}

325
Gibi yerine git-reflog ve kopyalama karma kullanarak, önceki durumuna almak için mükemmel bir şekilde, bir kısayol kullanmaktır master@{1}önceki bir pozisyon olan master, master@{"5 minutes ago"}ya da master@{14:30}. Revizyonların bu şekilde belirlenmesine ilişkin tüm ayrıntılar, man git-rev-parse"Revizyonların belirlenmesi" adlı bölümde bulunabilir .
Cascabel

38
Bu durumda ORIG_HEAD da çalışmalıdır ("git reset --hard ORIG_HEAD")
Jakub Narębski

@Jelfromi: Bu ipucu için teşekkürler, revizyonlar hakkında bu kadar ayrıntılı olabileceğinizin farkında değildim. HEAD'e göre revizyonları seçmeyi biliyordum, ancak soru ortaya çıktığında, zamanda geri dönmek istediğini bilmiyordum.
jkp

Çektiğimde diyor Updating d2c90a3..035ac4d. Burada d2c90a3sıfırlamak için bir parametre olarak da kullanabilirsiniz .
Tayland

Reflog'u kullanırken karma yazmanıza gerek yoktur. HEAD @ {1} veya reflogda tanımlandığı gibi önceki sayıyı da kullanabilirsiniz.
Simon The Cat

338

Jkp'nin cevabı ile aynı, ancak tam komut:

git reset --hard a0d3fe6

a0d3fe6 yaparak

git reflog

ve geri almak istediğiniz noktaya bakın.


git reset HEAD --hardMesela neden yapamıyorum ?
Sung Cho

9
@MikeC Bu yaklaşım, örneğin, birkaç
çekim

2
Sol taraftaki kimlikleri kullanamadım ama git reset --hard HEAD@{n}çalıştım
E. Sundin

1
Yıllar sonra neredeyse burada çoğaltmak yerine jkp'nin cevabında bir düzenleme önermeliydiniz.
Abhishek Anand

Şunu varsa git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} ve bbbbbbb HEAD @ {2}. Eğer yaparsam git reset --hard bbbbbbbKAFA 0 ve 1'i kaybedeceğim?
pmiranda

115

Birleştirmeyi geri almanın daha modern bir yolu:

git merge --abort

Ve biraz daha eski bir yol:

git reset --merge

Önceki yanıtlarda açıklanan eski tarz (uyarı: tüm yerel değişikliklerinizi silecektir):

git reset --hard

Ama aslında, buna değer fark olduğunu git merge --abortsadece eşdeğer git reset --mergegöz önüne alındığında MERGE_HEADmevcuttur. Bu, birleştirme komutu için git yardımında okunabilir.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Hiçbir yokken başarısız bir birleştirme sonra MERGE_HEAD, başarısız birleştirme ile çözülmek olabilir git reset --mergeille ile değil git merge --abort, onlar aynı şey için eski ve yeni sözdizimi sadece bu yüzden . Bu yüzden git reset --mergegünlük işlerde çok daha yararlı buluyorum .


20
git merge --abortBirleştirme sırasında çalışır git pull, bittikten sonra değil . Yani bu cevap soru ile ilgisiz görünüyor.
Abhishek Anand

1
git reset --mergetaahhüt için hazırlanmayan tüm değişiklikleri siler. Bunu zor yoldan buldum.
theadriangreen

62

ilk kullanımda çalışır: git reflog

önceki durumunuzun SHA'sını bulun ve yapın (HEAD @ {1} bir örnektir)

git reset --hard HEAD@{1}

40

Gitk'iniz varsa (git komut satırınızdan "gitk --all komutunu çalıştırmayı deneyin"), basittir. Sadece çalıştırın, geri almak istediğiniz taahhüdü seçin (sağ tıklayın) ve "Ana dalı buraya sıfırla" yı seçin. Taranmamış değişiklikleriniz yoksa "zor" seçeneğini belirtin.


8
Eğer görmediyseniz koşmaya değer. Çılgın bir GUI ortaya çıkıyor.
Evan Moran

35

Diyelim ki $COMMITsiz gerçekleştirmeden önceki son taahhüt kimliği git pull. Son çekmeyi geri almak için ihtiyacınız olan şey

git reset --hard $COMMIT

.

Bonus:

Çekmekten bahsetmişken, ilginç bir hile paylaşmak istiyorum,

git pull --rebase

Bu yukarıdaki komut git hayatımda çok zaman kazandıran en kullanışlı komuttur.

Yeni taahhüdünüzü sunucuya aktarmadan önce bu komutu deneyin; en son sunucu değişikliklerini (getirme + birleştirme ile) otomatik olarak senkronize eder ve taahhüdünüzü git günlüğüne yerleştirir. Manuel çekme / birleştirme konusunda endişelenmenize gerek yok.

Ayrıntıları şu adreste bulabilirsiniz: http://gitolite.com/git-pull--rebase


17

Değişiklikleri geri almanın en kolay yolu budur.

** Warning **

Yeni oluşturulan dosya ve klasörleri sileceğinden lütfen değiştirilen dosyalarınızı yedekleyin .

git reset --hard 9573e3e0

9573e3e0{İşlem kimliği} niz nerede


Bu yanıt çok yararlıdır, çünkü bir git çekme orijini dalı yaparsak böyle bir şey alırsak Updating ffce65bd..e929e884, dogit reset --hard ffce65bd
Ernesto Alfonso

15

yapabilirsin git reset --hard ORIG_HEAD

çünkü "pull" veya "merge" bu eylemleri yapmadan önce ORIG_HEAD değerini geçerli durum olarak ayarlar.


5

aşağı çekme işlemi.

ben. git fetch

ii. git merge

Çekimi geri almak için herhangi bir işlem yapın:

ben. git reset --hard --- tüm yerel değişikliği de geri al

veya

ii. git reset --hard master@{5.days.ago} (gibi 10.minutes.ago, 1.hours.ago, 1.days.ago..) yerel değişiklikleri alır.

veya

iii. git reset --hard commitid

Gelişme:

Bir dahaki sefere kullanmak git pull --rebaseyerine git pull.. senkronizasyon sunucusu değiştirerek (getir ve birleştir).


4

Biri geri almak istemenin en yaygın nedeni olan başarısız bir birleştirme varsa git pull, çalışma git reset --mergetam olarak ne beklediğini yapar: getirilen dosyaları sakla, ancak birleştirmeye git pullçalışan birleştirme işlemini geri al . Daha sonra git mergebazen oluşan dağınıklık olmadan ne yapacağına karar verilebilir . Ve --harddiğer her cevapta belirtilen kesin taahhüt kimliğini bulmak için birine gerek yoktur .

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.