Git tuşuna bastıktan sonra yerel olarak ve uzaktan kumandadaki bir `` go kesin '' i nasıl geri alabilirim?


242

Bunu git commita git push. Bu değişikliği hem yerel hem de uzak depolarda nasıl geri alabilirim?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

Yanıtlar:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(Örnek itme: git push -f origin bugfix/bug123)

Bu, son taahhüdü geri alır ve güncellenmiş geçmişi uzaktan kumandaya gönderir. Geçiş yapmanız gerekiyor, -fçünkü uzaktan kumandadaki yukarı akış geçmişini değiştiriyorsunuz.


24
Alternatif olarak, kullanın git reset --hard <the-sha-you-want-to-return-to>.
Alexander Groß

2
Referans HEAD (büyük / küçük harfe duyarlı) olarak adlandırılır
dunni

26
Ayrıca, dikkatli olun - AFAIK, diğer insanlar repodan çekildiyse bunu yapmamalısınız.
Amadan

1
@BipinVayalu Şu anda bulunduğunuz dalı etkiler. Daha doğrusu, KAFA. HEAD çoğunlukla bir dala "bağlıdır" (doğrudan bir taahhüdü işaret etmek yerine bir şube adına işaret eder). Yani, genel olarak konuşursak, şube HEAD'in işaret ettiği nokta etkilenecektir. Kullanım git log --decorate --onelineiçin nerede BAŞ noktalarını öğrenmek için.
Alexander Groß

4
git reset HEAD~1değişikliklerinizin gitmesini istemiyorsanız (değişmemiş değişiklikler). Değişim, taahhüt ve tekrar itmegit push -f [origin] [branch]
softvar

161

Genellikle aşağıdakileri kullanarak "ters" bir taahhütte bulunun:

git revert 364705c

sonra her zamanki gibi uzaktan kumandaya gönderin:

git push

Bu, taahhüdü silmez: İlk taahhüdün yaptıklarını geri alan ek bir taahhüt yapar. Başka bir şey, gerçekten güvenli değil, özellikle değişiklikler zaten yayılmışsa.


9
Bu Alexander Groß'un (seçilen cevap) daha güvenli (dolayısıyla muhtemelen daha iyi) bir cevaptır.
Graeck

6
@Graeck Çözümlerin her birinin etkileri ve değerleri vardır.
Alexander Groß

5
Bu kabul edilen cevap olmalı, bir ekiple işbirliği yapıyorsa daha fazla tarihin üzerine yazmamak en iyi uygulamadır. git resetyalnızca sunucuda değişiklikleri göndermediyseniz kabul edilir.
Josue Alexander Ibarra

17
@JosueIbarra Tüm davalara katılmıyorum. Çoğu durumda, evet, tarihin üzerine yazmamalısınız. Ancak, kesinlikle yapmanız gereken meşru davalar olduğuna inanıyorum. Örneğin, yanlışlıkla dosyalarınızı taahhüt edersiniz. Git deposunda olmamalý. Böylece, burada kabul edilen yanıtı kullanarak hızlı bir şekilde kaldırabilirsiniz.
bfcoder

11
@bfcoder uzak bir repoya bir "sır" aktardıysanız, artık bir sır değildir. Ve doğru düzeltme, hatayı gizlemeye çalışmak değil, yeni bir sır yaratmaktır.
erbsman

41

Her şeyden önce, sakin ol.

"Hiçbir şey bizim kontrolümüz altında değil. Bizim kontrolümüz sadece bir yanılsamadır.", "Hata hatadır"

İstemeden kodunuzu zorladınız remote-master. BU iyi olacak.

1. İlk olarak, SHA-1geri döndürmeye çalıştığınız taahhüdün değerini alın , örn. Ana şubeye taahhüt. bunu çalıştır:

git log

her bir taahhütle birlikte 'f650a9e398ad9ca606b25513bd4af9fe ...' gibi dizeler göreceksiniz. bu numarayı geri dönmek istediğiniz taahhütten kopyalayın .

2. Şimdi aşağıdaki komutu yazın:

git reset --hard your_that_copied_string_but_without_quote_mark

"HEAD şu anda" şeklinde bir mesaj görmelisiniz. açıksın. Az önce yaptığı bu değişikliği yerel olarak yansıtmak.

3. Şimdi aşağıdaki komutu yazın:

git push -f

gibi görmelisin

"uyarı: push.default ayarlanmamış; örtük değeri değişti ..... ... Toplam 0 (delta 0), yeniden kullanılan 0 (delta 0) ... ... your_branch_name -> master (zorunlu güncelleme) ."

Şimdi, hepiniz açıksınız. "Git log" ile master'ı tekrar kontrol edin, fixed_destination_commit listenin başında olmalı.

Birşey değil (önceden;))

GÜNCELLEME:

Şimdi, tüm bunlar başlamadan önce yaptığınız değişiklikler artık gitti. Bu zor işleri tekrar geri getirmek istiyorsanız, mümkün. Sayesinde git reflog ve git kiraz almak komutları.

Bunun için lütfen bu blogu veya bu gönderiyi takip etmenizi öneririm .


"git push -f" yaparken uzaktan kumandayı ve dalı belirtmek iyi bir önlemdir, ancak "git push -f" çoğu zaman yine de çalışır
Robson

8

git reset HEAD~1değişikliklerinizin gitmesini istemiyorsanız (değişmemiş değişiklikler). Değiştirin, taahhüt edin ve tekrar itingit push -f [origin] [branch]


3

Etkileşimli bir rebase yapabilirsiniz:

git rebase -i <commit>

Bu, varsayılan düzenleyicinizi getirecektir. Bu taahhüdü silmek için kaldırmak istediğiniz komutu içeren satırı silmeniz yeterlidir.

Elbette bu değişikliği orada uygulamak için uzak depoya erişmeniz gerekecek.

Şu soruya bakın: Git: seçilen taahhütleri depodan kaldırma


3

Kullanmayı deneyin

git reset --hard <commit id> 

Lütfen Dikkat: Burada taahhüt kimliği, gitmek istediğiniz taahhüdün kimliği olacaktır, ancak sıfırlamak istediğiniz kimliği değil. bu da sıkışmış tek nokta oldu.

sonra it

git push -f <remote> <branch>

2

Alternatif:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Menşe uzak deposunun ana dalını son işlemin üst öğesine zorla

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.