Henüz itilmemiş bir Git birleştirmeyi geri alma


3942

Usta şubemde, git merge some-other-branchyerel olarak yaptım , ancak değişiklikleri asıl ustaya itmedim. Birleştirmek istemedim, bu yüzden geri almak istiyorum. git statusBirleştirmeden sonra bir şey yaparken şu mesajı alıyordum:

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

Bulduğum bazı talimatlara dayanarak , koşmayı denedim

git revert HEAD -m 1

ama şimdi şu 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. O noktaya nasıl geri dönebilirim?


3
Tarihi korumanız gerekiyorsa, başka bir deyişle sizden hiç kimsenin çekmediği bir değişiklik var ya da bir yere ittiyseniz, aşağıdaki Yuri Ushakov cevabındaki çözümü kullanın!
Sedrik

6
Lütfen mevcut kazanan cevabın seçimini kaldırın, yine de oy toplamaya rağmen güvenli değil (işaret edildiği gibi). Bana göre "MBO" -s yol daha az puan olmasına rağmen, en iyi görünüyor.
inger



3
Bu doğrudan
Github'dan

Yanıtlar:


4457

İle git reflogbir önceki birleştirme olduğunu taahhüt çek ( git reflogdaha iyi bir seçenek olacaktır git log). Ardından aşağıdakileri kullanarak sıfırlayabilirsiniz:

git reset --hard commit_sha

Başka bir yol daha var:

git reset --hard HEAD~1

Size 1 taahhüt geri alacak.

Değiştirilmiş ve yüklenmemiş / görevlendirilmemiş dosyaların değiştirilmemiş durumlarına sıfırlanacağını unutmayın . Bunları saklamak için ya saklayın ya da aşağıdaki --mergeseçeneğe bakın.


@Velmont'un cevabında aşağıda önerdiği gibi, bu doğrudan durumda:

git reset --hard ORIG_HEAD

değişikliklerinizi koruması gerektiği için daha iyi sonuçlar verebilir. ORIG_HEADbirleşmeden önce bir taahhüdüne işaret eder, bu yüzden kendiniz için avlanmanıza gerek yoktur.


Diğer bir ipucu, dosyaları gereksiz yere sıfırlamadığı için --mergeanahtarı kullanmaktır --hard:

git reset --merge ORIG_HEAD

--birleştirmek

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


129
Bunun (her zaman?) İşe yarayacağını sanmıyorum - "birleşme öncesi" diğer daldan birleştirilen en son taahhüt olacak - mevcut daldaki en son taahhüt olmayacak . Sağ? (Bu sadece git logvarsayılan olarak göstermeyi seçenlerin bir sonucu olabilir - belki bunun farklı bir çıktısı olabilir git logveya git reflogbunun için kullanılabilir)
John Bachir

6
Bence birleştirmeyi ezip ezmemenize bağlı olabilir.
Marcin Gil

29
@JohnBachir haklı. Gelen git logçıkış, iki ebeveyn kaydedilmesini bakmak istiyorum. Birincisi şubenizdeki en son taahhüt, diğeri birleştirdiğiniz şubedeki son taahhüttür. Sen istiyorsan git reset --hardsen birleştirilecek şube üzerinde ebeveyne.
Justin

7
@JohnBachir: "Birleştirme" gerçekten hızlı ilerlemediği sürece, günlüğün en üstünde yeni bir taahhütle sonuçlanır ve bu taahhüdün iki ebeveyni vardır (veya bir ahtapot yaparsanız 2'den fazla birleştirmek). Bu bir birleştirme taahhüdünü kaldırırsanız, birleştirme işleminden gelen tüm eski taahhütler de kaybolur. Ancak, güvenli olmak için, sıfırlamadan sonra git size yeni kafanın nerede olduğunu söyleyecektir: "HEAD şu anda 88a04de <taahhüt mesajı>". Beklediğim yere geldiğimden emin olmak için her zaman buna bakarım. Projem, işleri unutulmaz kılmak için standart bir şube adlandırma düzeni kullanıyor.
Mark E. Haase

44
Ne yararlı buldum "git reflog" bakmak ve master yaptığım son taahhüt aramak oldu. Sonra yapıngit reset --hard <commit_sha>
Max Williams

1455

Yerel kaptanınızın başlangıç ​​noktasından / kaptandan önde olmadığını varsayarsak,

git reset --hard origin/master

O zaman yerel masterşubeniz aynı görünmelidir origin/master.


71
@Carter aslında en iyi cevap değil. Kök / ustanın, bazı taahhütler tarafından birleştirme işleminden hemen önce yerel ustanızın önünde olması mümkündür, bu durumda bu istenen sonuçları
vermeyebilir

15
@ dhruva-sagar Evet, ama git geride olduğunuzu söylemedikçe ve getirmediğiniz sürece iyi olmalısınız.
Kelvin

3
Teşekkürler! Bu, uzak bir deponuz varsa (ve yalnızca) mükemmeldir.
tomc

2
Hayır, bu soru için mükemmel bir soru değil, "varsay" maddesine bakınız. MBO'nun cevabı aslında bu davayı ve birleşmenin tek yerel taahhüt olmadığı vakayı kapsamaktadır.
13'te inger

2
Bir kez daha, belki bu uyarı cevabın kendisine girmelidir: Git tarihini yeniden yazmaktan daima kaçının!
cregox

1175

Bkz Git kitapta bölüm 4 ve Linus Torvalds tarafından orijinal yayından .

Zaten itilmiş bir birleştirmeyi geri almak için :

git revert -m 1 commit_hash

Linus'un dediği gibi, şubeyi tekrar taahhüt ediyorsanız, geri döndürmeyi unutmayın.


10
@perfectionist kabul etti :) Bu yanıtı başka bir soruya taşımanın bir yolu olsaydı - (belki de var mı?)
mikermcneil

geri döndürme hakkında daha fazla bilgi için: link
assaqqaf

1
Bu geri dönüşün işe yaradığından emin olmak için git diff hash1 hash2'yi yapabilirsiniz ; burada hash1, kararlı geri dönüştür ve hash2, geri almaya çalıştığınız eski taahhüttür. Çıktı yok == başarı! En son birleştirmeyi geri alarak ve geriye doğru çalışarak başlayarak bunu birden çok kez geri alabildim. git diff bana istediğim duruma geldiğimi gösterdi.
Robert Sinton

6
O Bildirimi Bu mu değil aslında orijinal Yazarın sorusunu çözmek . Orijinal poster zaten kullanılmış git revert -m 1 <commit>. Sorun şu ki, bunu yapması yanlışlıkla yaptığı ve henüz itmediği birleştirmeyi silmez. Sabit sıfırlamaları içeren diğer yanıtlar orijinal posterin sorunu için daha iyidir.

Bu doğrudan Github'dan harika bir kaynak: Git ile her şeyi nasıl geri alırsınız (neredeyse)
Github'dan alırsınız

986

En basit komutun eksik olması garip. Çoğu yanıt işe yarıyor, ancak az önce yaptığınız birleştirmeyi geri almak, bu kolay ve güvenli yoldur :

git reset --merge ORIG_HEAD

Ref ORIG_HEAD, birleşmeden önceki orijinal taahhüdüne işaret edecektir.

( --mergeSeçeneğin birleştirme ile ilgisi yoktur. Bu git reset --hard ORIG_HEAD, ancak taahhüt edilmemiş değişikliklere değmediği için daha güvenlidir.)


17
git reset --merge ORIG_HEADO zamandan beri çalışma ağacınızı kirlettiyseniz, bu değişiklikleri korur.
Nisan'da

1
Bu tek doğru cevap (bunun en iyi cevap olduğunu söylemiyorum - farkı not edin). Diyelim ki ustada t1, t3 ve t5'te 3 taahhüt yaptım. Diyelim ki şube1'de t2, t4 ve t6'da 3 yorum yaptım (t1, t2, t3, t4, t5 ve t6'nın kronolojik sırada olduğunu varsayın). Buna benzer herhangi bir komut git reset --hard HEAD~5yalnızca HEAD'i sıfırlar (hem master hem de branch1'deki işlemleri kaldırabilir). Yalnızca --mergeseçenek merge.
Manu Manjunath

@Manu --mergeSeçenek aslında birleştirme kaldırmaz, --hardayrıca iyi çalışır kullanabilirsiniz . Buradaki ipucu ORIG_HEAD referansı, o noktada durduğunuz yerde birleştirme yapmadan önce ayarlanır. :)
odinho - Velmont

@yingted "Çalışma ağacınızı o zamandan beri kirlettiyseniz git reset --merge ORIG_HEAD bu değişiklikleri korur." U birleştirdikten sonra dosyaları değiştirmek mi demek istediniz? Her neyse, birleştirme yaptım ve daha sonra çatışmaları çözme işini yaptım. Ama sonra birleştirmeyi sıfırlamak istedim ve bu cevapta belirtildiği gibi yaptım. Her şey iyiydi ve birleştirme işleminden sonra yaptığım değişiklikleri korumamış. Yerel repo, birleşmeden önceki pozisyona benziyor.
Samitha Chathuranga

git reset --hard ORIG_HEADKomut için beni mükemmel çalıştı - bu yerel sonra depo başka değişiklikler yapmadığını gerçeğiyle yardımcı olabilir git mergeben geri almak için çalışıyordu. Komut, depo durumunu birleştirmeden önceki haline sıfırlar. Büyük ipucu için teşekkürler!
bluebinary

391

Daha yeni Git sürümlerinde, birleştirmeyi henüz işlemediyseniz ve birleştirme çakışması varsa , şunları yapabilirsiniz:

git merge --abort

Gönderen man git merge:

[Bu] ancak birleşme çatışmalarla sonuçlandıktan sonra çalıştırılabilir. git merge --abortbirleştirme işlemini durduracak ve birleştirme öncesi durumunu yeniden yapılandırmaya çalışacaktır.



135

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

git reset --hard HEAD^

Ya da HEAD^^bu geri dönüşü geri almak için bile . Geriye kaç adım atmanız gerektiğinden emin değilseniz, her zaman tam bir SHA referansı verebilirsiniz.

Sorunlarınız olduğunda ve ana dalınızda herhangi bir yerel değişiklik yoksa, sıfırlayabilirsiniz origin/master.


5
En iyi cevap IMHO, OP'nin kendi yanıtını (geri dönmek için sadece 1 adım varsa, Q'da olduğu gibi görünüyor) ve randomguy3'ün kısayolunu (ana şubenizde herhangi bir yerel değişiklik olmadığında çalışır) içerir. ")
Mart'ta

4
Siz yorumcular, @Inger ve @Konstantin, neden? Cevabım oluşturulduktan sonra buraya geldiniz ve bu daha doğru. Sadece HEAD'e bir adım çıkmak genellikle yanlıştır ve aslında ne kadar ileri gitmeniz gerektiğini saymanız gerekir. Git zaten ORIG_HEADsenin için hazır, neden kullanmıyorsun?
odinho - Velmont

yerel değişiklikleri de sıfırlayacak mı? #Lütfen güncelle.
CoDe

Bu benim için mükemmel çalıştı, kafayı bu şekilde sıfırlamak, buradaki cevapların yarısından çok daha mantıklı.
Varda Elentári

HEAD ^ HEAD öncesi taahhüt eder mi? ve ^^ iki işlemden önce mi? Bunun hızlı ileri birleştirme ile işe yaramayacağını mı tahmin ediyorsunuz?
Marcus Leon

87

Son zamanlarda, git reflogbu konuda yardımcı olmak için kullanıyorum . Bu çoğunlukla yalnızca birleştirme SADECE olduğunda ve makinenizdeyse işe yarar.

git reflog gibi bir şey döndürebilir:

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ır bir birleşme olduğunu gösterir. İkinci satır birleşmemden önceki zaman. Ben sadece git reset --hard 43b6032birleştirme önce gelen izleyebilir ve carry-on için bu şubeyi zorlamak için.


Harika cevap, teşekkürler! Bir birleştirmeyi geri almak gerekiyordu, ancak diğer cevaplar sadece SHA'yı reflogalıp git resetişe yaradı.
Lankymart

51

Modern Git ile şunları yapabilirsiniz:

git merge --abort

Eski sözdizimi:

git reset --merge

Eski okul:

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 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 --mergeama mutlaka ile, git merge --abort, bunlar aynı şey için eski ve yeni sözdizimi sadece bu yüzden .

Şahsen git reset --mergegünlük işlerde çok daha güçlü ve kullanışlı buluyorum , bu yüzden her zaman kullanıyorum.


Benim için harika çalıştı. Diğer her yazı bunun çok karmaşık olduğunu söylüyor, ancak bu tam olarak beklenen şeyi yaptı. Sanırım sadece işe yaradı çünkü orijinal soruyu tam olarak cevaplamayan çatışmalar vardı.
Jeremy

Bu cevap OP'nin durumuna odaklanmaz ve önemli bağlamı dışarıda bırakır.
Ben Wheeler

37

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

Bunu yaparken ...

git reset --hard HEAD^
git status

... bana şu durumu verdi.

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

Daha sonra aynı git resetkomutu birkaç kez daha yazmak zorunda kaldım . Bunu her yaptığımda, mesaj aşağıda gördüğünüz 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, bu yüzden bir yapmayı denedim git pullve bu işe yaradı:

> 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

Uzun lafın kısası, komutlarım şöyle oldu:

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

19
ya da kullanılmış olabilirHEAD^^^^
hasen

17
belki de sıfırlandı origin/master;)
hasen

23

git reflogÖnceki ödemeyi bulmak için kullanabilirsiniz . Bazen bu geri dönmek istediğiniz iyi bir durumdur.

somut olarak,

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

1
Teşekkür ederim! İşimin yarım gününü kurtardın. Ancak herhangi bir komutla reflog modundan çıkamadım.
Katarzyna

1
@Katarzyna reflog'dan çıkmak için "q" tuşunu kullanıyor
Amjed Baig

21

Birleştirmenin ortasındaysanız, her zaman iptal edebilirsiniz git merge --abort


2
teşekkürler kardeşim ve ben o korkunç şeyler doğru cevap yapmak üzereydi. şanslı aşağı kaydırdım. sadece birleştirme kafasını silmek istiyorum
Nyuu

15

Bu sorunu bir taahhüt kimliğine bakmayı içermeyen tek bir komutla çözebildim.

git reset --hard remotes/origin/HEAD

Kabul edilen cevap benim için işe yaramadı, ancak bu komut aradığım sonuçları elde etti.


Kesinlikle! Şube başındaki değişikliklerinizi sıfırlar! Tek tek yapmıyoruz
Carlos Zinato

benim için çalışmadı. aslında yerel şubeyi bir iki ay geri göndermeye başladı. Neyse ki bu tüm yerel yani her zaman dalı yok ve tekrar getir. Başkalarının bunu denemesi durumunda bunu belirtmek istedim.
Matt Pengelly

@MattPengelen bu yöntem büyük ölçüde belgesizdir ve genellikle birleştirme işleminden önce dalınız uzak dalla eşitlenmişse çalışır. Şubenizin uzak şubeyle senkronize olmasından bu yana aylar geçti mi?
Ralph Ritoch

@MattGenel olarak HEAD'ın hangi şubeye yönlendirildiğine de bağlıdır. Projelerimden birinde gitflow kullanıyorum ve geliştirme dalında olmama rağmen, uzaktan kumandalar / origin / HEAD orijin / master'a yönlendirildi, bu yüzden bir birleştirmeyi geri almam gerekirse uzaktan kumandalara sıfırlamam gerekir / origin / develop
Ralph Ritoch

14

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

$ git checkout -f

Birleştirmeyi (ve yaptığınız her şeyi) geri alır.


Bunu denedim ve yerel şubemin önde olduğu taahhüt sayısını artırdı.
barclay

14

Bu soruya da menşei eşleştirmek için geri dönmek isteyen (yani, menşei öncesinde NO taahhüt eder) var. Daha fazla araştırma, resettam olarak bunun için bir komut olduğunu buldu:

git reset --hard @{u}

Not: @{u}kısaltmasıdır origin/master. (Ve elbette, bunun çalışması için o uzak depoya ihtiyacınız var.)


14

HEAD'inizi değiştirmek zorundasınız, tabii ki sizin değil, git HEAD ....

Cevap vermeden önce bunun ne olduğunu açıklayan bir arka plan ekleyelim HEAD.

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


Bu hazine 👤‍👤🐱‍👤🐱‍👤
Jawand Singh

12

En basit cevap odinho tarafından verilen cevaptır - Velmont

İlk önce git reset --merge ORIG_HEAD

Değişiklikler itildikten sonra sıfırlamak isteyenler için bunu yapın (Çünkü bu, git reset birleştirme soruları için görülen ilk gönderi olduğu için)

git push origin HEAD --force

Bu, çekme işleminden sonra birleştirilmiş değişiklikleri tekrar almayacak şekilde sıfırlanır.


10

: Ekstra seçenek bakmak Sadece için, çoğunlukla dallanma modeli burada açıklanan takip ediyorum http://nvie.com/posts/a-successful-git-branching-model/ ve bu şekilde birleşiyor edilmiştir --no-ffhayır ( hızlı ileri).

Bu sayfayı okudum çünkü yanlışlıkla dağıtım şubem yerine bir test şubesini konuşlandırma için master ile birleştirdim (web sitesi, master canlı olan). Test şubesinde birleştirilen iki şube daha vardır ve toplamda yaklaşık altı taahhüt vardır.

Tüm taahhüdü geri almak için sadece birine ihtiyacım vardı git reset --hard HEAD^ve tüm birleşmeyi geri döndürdü. Birleştirmeler hızlı bir şekilde iletilmediğinden, birleştirme bir bloktu ve bir adım geri "dal birleştirilmedi".


10

Bir birleştirmeyi geri almak veya belirli bir işlemle yeniden başlatmak için yalnızca iki komut kullanabilirsiniz:

  1. git reset --hard commitHash (yeniden başlatmak istediğiniz taahhüdü kullanmalısınız, örn. 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (Yeni yerel ana dalı başlangıç ​​/ ana konuma gönderme)

İyi şanslar ve devam et!


10

Birden çok yolla yapılabilir.

1) Birleştirmeyi İptal Et

Kötü bir birleştirme arasındaysanız (yanlışlıkla yanlış dalla yapılırsa) ve birleştirme işleminin aşağıdaki gibi en son şubeye geri dönmesini önlemek istiyorsanız:

git merge --abort

2) HEAD'ı uzak şubeye sıfırlayın

Uzaktan geliştirme dalından çalışıyorsanız, KAFA'yı uzak daldaki son işleme sıfırlayabilirsiniz:

git reset --hard origin/develop

3) Geçerli dalı silin ve uzak depodan yeniden ödeme yapın

Dikkate alındığında, yerel repoda geliştirme dalı üzerinde çalışıyorsunuz, uzaktan / geliştirme dalı ile senkronize oluyor, aşağıdaki gibi yapabilirsiniz:

git checkout master 
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :) 

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

"1) Birleştirmeyi İptal Et" oldukça yeterliydi. Upvoting.
CodeToLife

1
Dikkatli ol! git merge --abort "yalnızca birleştirme çakışmalarla sonuçlandıktan sonra çalıştırılabilir. git merge --abort birleştirme işlemini iptal eder ve birleştirme öncesi durumu yeniden yapılandırmaya çalışır"
Pedro García Medina

8

Birleştirmeniz ve ilgili taahhütleriniz henüz aktarılmadıysa, her zaman başka bir dala geçebilir, orijinali silebilir ve yeniden oluşturabilirsiniz.

Örneğin, yanlışlıkla bir geliştirme dalını efendiye birleştirdim ve bunu geri almak istedim. Aşağıdaki adımları kullanarak:

git checkout develop
git branch -D master
git branch -t master origin/master

İşte bu kadar! Üstat, başlangıç ​​noktasıyla aynı aşamadadır ve yanlış birleştirilmiş durumunuz silinir.


1
Not: Bu sadece birleştirme işlemini değil, aynı zamanda en son çıkıştan bu yana yapılan yerel taahhütleri de geri alır.
Martijn Heemels

4

Bir komut satırı çözümü istiyorsanız, sadece MBO'nun cevabı ile gitmenizi öneririm.

Eğer bir acemi iseniz, grafiksel yaklaşımı beğenebilirsiniz:

  1. Başlama gitkişareti (komut satırından veya varsa dosya tarayıcısında sağ tıklayın)
  2. Birleştirme taahhüdünü kolayca görebilirsiniz - iki ebeveyn ile üstten ilk düğüm
  3. İlk / sol ebeveynin bağlantısını (birleştirmeden önce mevcut dalınızda bulunan, genellikle benim için kırmızı olan) izleyin
  4. Seçilen işlemde, "Şube buraya sıfırla" yı sağ tıklayın, orada sıfırlamayı seçin

4

Strateji: Her şeyin iyi olduğu yeni bir şube oluşturun.

Gerekçe: Birleşmeyi geri almak zordur. Birleştirmenizi taahhüt edip etmediğiniz veya birleştirdiğinizden veya birleştirmenizden bu yana yeni taahhütler olup olmadığı gibi birçok faktöre bağlı olarak çok fazla çözüm var. Ayrıca hala bu çözümleri davanıza uyarlamak için git konusunda derin bir anlayışa sahip olmanız gerekir. Bazı talimatları körü körüne uygularsanız, hiçbir şeyin birleştirilmeyeceği "boş birleştirme" ile sonuçlanabilir ve daha fazla birleştirme girişimi Git'in size "Zaten güncel" olmasını sağlar.

Çözüm:

Let en Birleştirmek istediğiniz demek deviçine feature-1.

  1. Birleştirme almak istediğiniz düzeltmeyi bulun:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Check it out (zamanda geri dön):

    git checkout e5f6g7h8
    
  3. Oradan yeni bir şube oluşturun ve inceleyin:

    git checkout -b feature-1
    

Şimdi birleştirmenizi yeniden başlatabilirsiniz:

  1. Birleştirmek: git merge dev

  2. Birleştirme çakışmalarınızı düzeltin.

  3. Teslim Et: git commit

  4. Sonuçlardan memnun olduğunuzda, eski şubeyi silin: git branch --delete feature-1


2

Sadece yeni bir dal yaratın, sonra kiraz seçimini yapın.

Tasarrufu ve daha basit olması, yukarıdaki birçok cevapta açıklananları sıfırlar


1
Özellikle, listelenen git komutları ile tamamen rahat değilseniz, bu öneriye katılıyorum. Bu daha fazla "zahmet" ile daha yavaş olabilir, ancak çok fazla gelmiyorsa ve işinizi kaybetmekten endişe ediyorsanız, çabaya değer.
Greg

1

Ben ne kadar uzak artı bir (ya da geri gitmek istediğiniz birçok taahhüt geri) istediğiniz geri ne kadar tanımlayıcı karma git rebase -i [hash] [branch_name] nerede yapabilirsiniz [hash]ve daha sonra artık istemediğiniz editör taahhüt satırları silmek düşünüyorum . Dosya 'yı kaydet. Çıkış. Dua etmek. Ve geri sarmalısın. Yapmanız gerekebilir git reset --hard, ama bu noktada iyi olmalı. Bunu, geçmişinizde tutmak istemiyorsanız, ancak deponuzu muhtemelen istemediğiniz bir durumda bırakabilecekse, belirli işlemleri bir yığından çıkarmak için de kullanabilirsiniz.


1

Birleştirmeyi taahhüt ettiyseniz:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard

1
  1. İlk olarak, her şeyi taahhüt ettiğinizden emin olun.

  2. Ardından deponuzu önceki çalışma durumuna sıfırlayın:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    veya kullanarak --hard( bu, taahhüt edilen tüm yerel değişiklikleri kaldıracaktır! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    Yanlış birleştirilmiş taahhüdünüzden önce orada bulunan hash'ı kullanın.

  3. Önceki doğru sürümün üstünde hangi taahhütleri tekrar taahhüt etmek istediğinizi kontrol edin:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. Doğru taahhütlerinizi deponuzun sağ sürümünün en üstüne aşağıdaki yollarla uygulayın:

    • Kiraz toplama kullanarak (mevcut bazı taahhütlerin getirdiği değişiklikler)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • Veya taahhütlerin aralığını kiraz olarak seçerek:

      • Birleştirmeden önce doğru değişiklikleri kontrol edin:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • Birleştirmeden önce doğru değişiklikleri kontrol edin:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        bu, taahhüt ettiğiniz doğru taahhütlerin aralığıdır (yanlış taahhüt edilen birleştirme hariç).


1
  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

Bu benim için çalıştı .. !!


0

Birleştirme işleminden hemen sonra geri dönmeniz gerektiğini fark ederseniz ve birleştirme girişiminden sonra başka bir şey yapmadıysanız, bu komutu verebilirsiniz: git reset --hard HEAD@{1} .

Esasen, birleştirme işleminden sonra başka hiçbir işlem yapılmadığı takdirde birleşmeniz shaişaret eder HEAD@{0}ve bu HEAD@{1}da birleşmeden önceki bir önceki nokta olur.


0

En basit şansın en basiti, burada söylediklerinden çok daha basit:

Yerel şubenizi (yerel değil, uzak değil) çıkarın ve tekrar çekin. Bu şekilde ana dalınızdaki değişiklikleri geri alırsınız ve itmek istemediğiniz değişiklikten herkes etkilenir. Başla.


0

Bu durumda, şubenizi ile sıfırlamak isteyeceksiniz git reset --hard <branch_name>. Değişikliklerinizi sıfırlamadan önce kaydetmek istiyorsanız, yeni bir şube oluşturduğunuzdan emin olun vegit checkout <branch_name> .

Durumu belirli bir işlemle sıfırlayabilirsiniz. git reset --hard <commit_id> .

Değişiklikler aktarılmışsa git revert <branch_name>bunun yerine kullanabilirsiniz . Git revert ve git checkout'un diğer senaryolarda nasıl kullanıldığını kontrol ettiğinizden emin olun .

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.