Soru Henüz itilmemiş bir Git birleştirmeyi geri al


Usta şubemde yaptım git merge some-other-branch Yerel olarak, ancak değişiklikleri kökeni ustasına itmedi. Birleştirmek istemedim, o yüzden geri almak istiyorum. Bir ne zaman git status Birleşmemden sonra şu mesajı alıyorum:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Bazı dayanarak bulduğum talimatlarıKoşmayı denedim

git revert HEAD -m 1

ama şimdi bu mesajı alıyorum git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Şubemin herhangi bir sayıda taahhütte bulunmasını istemiyorum. Bu noktaya nasıl geri dönerim?


3088
2018-03-05 19:24


Menşei


Eğer geçmişi korumanız gerekiyorsa, başka bir deyişle sizden herhangi birisinin çektiği bir değişiklik var ya da Yuri Ushakov'un çözümünde bir yere ittiniz! - Sedrik
Lütfen mevcut kazanan cevabın seçimini kaldırın, yine de oy toplamak olsa da, güvensiz (çoğu işaretli). Bana "MBO" -s en iyi görünüyor, ancak daha az puan var. - inger
Eğer gerekiyorsa geçmişi koru, kullan Yuriaşağı çözüm aşağıda! (sadece @Sedrik yoruma bir link ekleyerek) - cregox
İlgili: Önceki bir Git işlemine geri dön.
Bu, Github'dan gelen harika bir kaynaktır: Git ile neredeyse bir şey nasıl geri alınır - jasonleonhard


Cevaplar:


İle git reflog Birleştirme işleminden önce hangisinin daha önce olduğunu kontrol edin (git reflog git log'dan daha iyi bir seçenek olacaktır). Ardından şunları kullanarak sıfırlayabilirsiniz:

git reset --hard commit_sha

Başka bir yolu da var

git reset --hard HEAD~1

1 taahhüdü geri alacak.

Değiştirilen ve kaldırılmayan / kaydedilmemiş dosyaların, değiştirilmemiş duruma sıfırlanacağını unutmayın.. Onları uzak tutmak ya da görmek --merge seçeneği aşağıda.


@Velmont cevabında aşağıda belirtildiği gibi, bu doğrudan durumda şunu kullanarak:

git reset --hard ORIG_HEAD

değişikliklerinizi korumalı olduğundan daha iyi sonuçlar verebilir. ORIG_HEAD Birleşme gerçekleşmeden hemen önce bir taahhüt gösterecektir, bu yüzden kendiniz için avlamak zorunda değilsiniz.


Başka bir ipucu kullanmaktır --merge yerine geçmek --hard dosyaları gereksiz yere sıfırlamadığı için:

--merge

Dizini sıfırlar ve çalışma ağacındaki dosyaları <commit> ve HEAD öğelerinden farklı olarak güncelleştirir, ancak dizin ve çalışan ağaç arasında farklı olanları (yani, eklenmemiş değişiklikler olan) tutar.


3380
2018-03-05 19:34



Bunun (her zaman?) Çalışacağını sanmıyorum - "birleşme öncesinde bir tane", diğer şubeden gelen en yakın taahhüt olacaktır - mevcut şube üzerindeki en son taahhüt olmayacaktır. . Sağ? (Bu sadece neyin bir sonucu olabilir. git log varsayılan olarak göstermeyi seçer - belki farklı bir çıktı var git log veya git reflog bunun için kullanılabilir) - John Bachir
Birleşip ezmeyeceğine bağlı olabileceğini düşünüyorum. - Marcin Gil
@JohnBachir haklı. İçinde git log Çıktı, iki ebeveyn taahhütlerine bakmak istersiniz. Biri şubenizdeki en son işlem, biri birleştirdiğiniz şubedeki son işlem. İstiyorsun git reset --hardBirleştirdiğiniz şubede ana taahhütte bulunun. - Justin
@JohnBachir: "Birleştirme" gerçekten hızlı bir ileriye gitmediği sürece, günlüğün en üstünde yeni bir taahhütle sonuçlanacak ve bu işlemin iki ebeveyni var (veya bir ahtapot yaparsanız 2'den fazla ) birleştirme. Bu birleştirme işlemini kaldırırsanız, birleştirme işleminden gelen tüm eski işlemler de kaybolacaktır. Yine de güvenli olmak için, sıfırlamadan sonra yeni kafanın nerede olduğunu söyleyeceğiz: "HEAD şimdi 88a04de <commit message>". Her zaman olmasını beklediğim yere vardığımdan emin olmak için ona bakarım. Projem, işleri akılda tutmak için standart bir şube adlandırma şeması kullanıyor. - Mark E. Haase
Ne yararlı bulduğum, "git reflog" a bakmak ve usta yaptığım son taahhüdü aramaktı. O zaman yap git reset --hard <commit_sha> - Max Williams


Yerel efendinizin menşe / usta öncesinde olmadığını varsayarak, bunu yapabilmeniz gerekir.

git reset --hard origin/master

Sonra senin yerel master şube aynı görünmelidir origin/master.


1290
2018-03-17 18:06



@Carter aslında en iyi cevap değildir. Orijin / ustanın, yerel yöneticilerinizden, birleşme işleminin hemen öncesinde, birleşme işleminin bir parçası olabileceğinden, bu durumda istenen sonuçları vermeyebilir. - Dhruva Sagar
@ dhruva-sagar Evet, ama gitmediği sürece, arkandasınız ve siz almıyorsunuz, iyi olmalısınız. - Kelvin
Teşekkürler! Bu, eğer (ve sadece) bir uzak deponuz varsa mükemmeldir. - tomc
Hayır, bu soru için mükemmel olan değil, "varsay" maddesine bakın. MBO'nun cevabı aslında bu vakayı kapsamakta ve birleşmenin tek yerel taahhüt olmadığı durumdur. - inger
Bir kez daha, belki bu uyarı cevabın kendisine gitmeli: Her zaman git geçmişini yeniden yazma önlemek! - cregox


Görmek Git kitabındaki bölüm 4 ve Linus Torvalds tarafından yazılmış orijinal yazı.

Birleştirme işlemini geri almak için zaten itilmişti:

git revert -m 1 commit_hash

Linus'un söylediği gibi, şubeyi tekrar gönderiyorsan geri dönmeyi unutma.


1085
2018-06-02 16:31



^ - Tarihin kırılmadan birleştirmeyi nasıl geri alacağına dair tek doğru cevap. Paylaşılan bir repo ile çalışıyorsanız bu önemlidir. - Ruslan Kabalin
Bu daha fazla savunulamamıştır çünkü değişim hiçbir zaman zorlanmamıştır, bu nedenle tarihin kazayla birleştirilmesini eklemek için bir sebep yoktur. Yerel olarak sil ve devam et. - Justin
İtilmeyen bir taahhüdü geri almak, geçmişte çirkin görünüyor ve daha kafa karıştırıcı oluyor. Henüz itmemeniz durumunda, HEAD'inizi birkaç kez daha geriye doğru taşımak daha mantıklıdır, daha sonra itin. - Mark E. Haase
“Bu daha fazla kışkırtılmadı çünkü…” - yine de, bu soruya geldiğim insanlar için ek taahhütler aldığımız / itdiğimiz için, bu paha biçilemez. - perfectionist
@perfectionist kabul etti :) Bu cevabı başka bir soruya taşımanın bir yolu olsaydı-- (belki de var mı?) - mikermcneil


En basit komutun eksik olması garip. En çok cevaplar işe yarıyor ama yaptığın birleştirme işlemini geri al, bu kolay ve güvenli bir yol:

git reset --merge ORIG_HEAD

Ref ORIG_HEAD Birleşme öncesi orijinal taahhüt işaret edecektir.

( --merge seçeneğin birleştirmeyle alakası yoktur. Aynen öyle git reset --hard ORIG_HEADAncak, daha önce, kabul edilmeyen değişikliklere değmediğinden daha güvenlidir.)


833
2018-01-29 15:46



Evet, bu en basit yoldur. Diğer cevaplarla karşılaştırıldığında neden bu kadar az oyu olduğunu merak ediyorum. - Pablo Olmos de Aguilera C.
O zamandan beri çalışma ağacın kirlenmişse, git reset --merge ORIG_HEAD bu değişiklikleri korur. - yingted
Bu benim için cevap. İhtiyaç yok git reflog ya da başka bir şey. Teşekkür ederim. - crmpicco
Evet, en iyi cevap. Bu, stackoverflow oylama sisteminin temel olarak erken gönderilen cevapları nasıl ödüllendirdiğinin bir örneğidir. - samthebest
Eh, bu cevap kabul edilenin yaklaşık üç yıl sonra geldi; ama katılıyorum, bu harika çalıştı! - Mike Branski


Yeni Git sürümleriyle, henüz birleştirme işlemini gerçekleştirmediyseniz ve bir birleşme çatışması var, basitçe yapabilirsiniz:

git merge --abort

itibaren man git merge:

[Bu] yalnızca birleşme çakışmalarıyla sonuçlandıktan sonra çalıştırılabilir. git merge --abort Birleştirme işlemini iptal eder ve birleştirme öncesi durumu yeniden oluşturmaya çalışır.


307
2018-02-12 02:13





Bir önceki işleme sıfırlamanız gerekir. Bu çalışmalı:

git reset --hard HEAD^

Ya da HEAD^^ geri verme işlemini geri almak. Ne kadar geri adım atmanız gerektiğinden emin değilseniz, her zaman tam bir SHA referansı verebilirsiniz.

Sorun yaşadığınızda ve ana dalınızın herhangi bir yerel değişikliği olmadığında, origin/master.


104
2018-03-05 19:31



IMHO'nun en iyi cevabı, OP'nin kendi modelini (Q'da olduğu gibi geri dönmek için sadece 1 adım olduğu gibi) ve randomguy3'ün kısayolunu ("ana dalınız herhangi bir yerel değişiklik yapmadığında" çalışan ") - inger
Buraya en iyi cevabın tamamen katılıyorum! - Konstantin
Yorum yapanlar, @Inger ve @Konstantin, neden? Cevabım oluşturulduktan sonra buraya geldin ve daha doğru. Sadece KAFA'ya bir adım atmak çoğu zaman yanlıştır ve aslında ne kadar ilerlemeniz gerektiğini de hesaba katmanız gerekir. Git zaten ayarlandı ORIG_HEAD Senin için neden kullanmıyorsun? - odinho - Velmont
yerel değişiklikleri de sıfırlayacak mı? #Lütfen güncelle. - CoDe
Bu benim için gayet iyi çalıştı, kafanın bu şekilde sıfırlanması, burada verilen cevapların yarısından çok daha anlamlı. - Varda Elentári


Son zamanlarda kullanıyorum git reflog bu konuda yardımcı olmak için. Bu çoğunlukla sadece JUST birleştiğinde çalışır ve makinenizdeydi.

git reflog gibi bir şey dönebilir:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

İlk satırda bir birleşmenin meydana geldiğini belirtir. 2. satır benim birleşme öncesindeki zamandır. Ben sadece git reset --hard 43b6032 Bu dalı birleşme öncesi ve takip etmeden önce takip etmeye zorlamak.


78
2017-12-19 17:51



Omigosh hayat koruyucu :) - M.G.Palmer
Oh dostum. Çok teşekkür ederim. - Ross Henderson
Neden bu bilmediğim en önemli cevap değil. Bu mükemmel çalıştı. - Matt
Bunun için teşekkürler, harika! - zooblin


Modern Git ile şunları yapabilirsiniz:

git merge --abort

Eski sözdizimi:

git reset --merge

Eski okul:

git reset --hard

Ama aslında, bunun farkına varmak git merge --abort sadece eşdeğerdir git reset --merge verilen MERGE_HEAD mevcut. 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.

Başarısız bir birleşmeden sonra, yokken MERGE_HEAD, başarısız birleştirme ile geri alınabilir git reset --mergeama zorunlu olarak değil git merge --abort, Bu yüzden aynı şey için sadece eski ve yeni sözdizimi değiller.

Şahsen bulacağım git reset --merge günlük işlerde çok daha güçlü ve kullanışlı, bu yüzden hep kullanıyorum.


42
2018-05-08 19:13



Benim için harika çalıştı. Diğer her yazı, bunun çok karmaşık olduğunu söylüyor, ama bu tam olarak beklenen şeyi yaptı. Sanırım sadece işe yaradı, çünkü asıl soruyu tam olarak cevaplamayan çatışmalar vardı. - Jeremy
Bu cevap OP'nin durumuna odaklanmamakta ve önemli bir bağlam ortaya koymaktadır. - Ben Wheeler


Pekala, diğer insanların bana verdiği cevaplar yakındı ama işe yaramadı. İşte yaptığım şey.

Bunu yapmak ...

git reset --hard HEAD^
git status

... bana aşağıdaki durumu verdi.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Ben de aynısını yazmalıydım git reset birkaç kez daha komut. Bunu her yaptığımda, mesaj aşağıda görebileceğiniz gibi değişti.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

Bu noktada durum mesajının değiştiğini gördüm, ben de git pullve bu işe yaramış görünüyordu:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Çok uzun bir hikâye kısaydı, emirim buydu:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

32
2018-03-05 19:54



ya da sen kullanabilirdin HEAD^^^^ - hasen
belki bile sıfırlamak origin/master ;) - hasen
Vaov! Bu çalıştı! - Yiğit Güler


Kullanabilirsin git reflog önceki ödeme bulmak için. Bazen geri dönmek istediğiniz iyi bir durumdur.

somut olarak,

$ git reflog
$ git reset --hard HEAD@{0}

21
2018-01-17 22:36



Teşekkür ederim! İşimin yarım gününü kurtardın. Ancak herhangi bir komutla reflog modundan çıkamadım. - Katarzyna
@Katarzyna, reflog'dan çıkmak için "q" tuşunu kullanır - Amjed Baig


Henüz yapmadıysanız, yalnızca kullanabilirsiniz

$ git checkout -f

Birleştirme işlemini (ve yaptığınız her şeyi) geri alacaktır.


12
2018-01-18 15:25



Bunu denedim ve aslında yerel şubemin önündeki taahhüt sayısını artırdım. - barclay