Git, Orijin / master bir taahhüde nasıl sıfırlanır?


245

Yerel yöneticimi şu komutla bir taahhüdüne sıfırladım:

git reset --hard e3f1e37

$ git statusKomuta girdiğimde terminal diyor ki:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Orijin / üstbilgiyi de sıfırlamak istediğim için, orijin / master'a çıkış yapıyorum:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

ve başlığı şu komutla sıfırlayın:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Sonra başarama / başlığa başarılı olamadığımı taahhüt etmeye çalıştım.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Sonunda, yerel üstadı kontrol ediyorum.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Yerel ve menşein aynı yönde olmasını beklediğimden orijin / master'ın kafasını sıfırladığım için, gördüğünüz gibi git, local / master'ımın 7 komisyon tarafından orijin / master'ın arkasında olduğunu söylüyor.

Bu sorunu nasıl düzeltebilirim? Aradığım şeyler, yerel / master ve orijin / master noktası aynı taahhütte. Aşağıdaki görüntü ne yaptığımı gösterir. Teşekkürler.

resim açıklamasını buraya girin


Her şeyden önce, itme kodunu projenizdeki korumalı bir şubeye zorlamanıza izin verdiğinizden emin olun, aksi takdirde yapamazsınız ...
DarmVillegas

Yanıtlar:


564

origin/xxxdalları her zaman bir uzak işaretçi. Yerel deponuza işaret etmedikleri için onları kontrol edemezsiniz (yalnızca taahhüdü ödersiniz. Bu nedenle, komut satırı arabirimi şube işaretçisinde yazılmış adı görmezsiniz, yalnızca kesin karmayı görürsünüz).

Uzaktan kumandayı güncellemek için yapmanız gereken, yerel değişikliklerinizi master yapmaya zorlamaktır:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
talep edilen işlemi yapar, ancak taahhütleri zaten ustadan çeken insanların mutsuz olacağını unutmayın.
mnagel

Bu adımları izledim ve geri döndü. Ancak köken / HEAD artık ustadan başka bir şubeye işaret ediyor. Bunu düzeltmek için ne yapabilirim?
Daniil Shevelev

1
Menşei / KAFA ile ilgilenmemelisiniz, sadece menşe / ref için iyi referansı itin
Simon Boudrias

Anlaşılan, bunu yanlışlıkla yanlış dalları bir araya getirdikten ve sonra kökene ittikten sonra yapmak zorunda kaldı. İyi çalışıyor, ancak diğer insanlar etkilenen dalları kökeninden kontrol ediyorlarsa çok rahatsız edici olabilir. Dikkatle kullanın.
Nick W.

1
Çalışmıyor. remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

Burada bulunan çözüm, ustayı zaten itilmiş olan önceki bir taahhüde güncellememize yardımcı oldu:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Kabul edilen cevaptan en önemli fark push komutunda master'dan önce "e3f1e37:" sağlama karmasıdır.


1
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
Çalışmıyor

@ m0skit0 mesajı Say'ın olarak you should pull first:)
intuitivepixel

Bunun cevabı stackoverflow.com/a/10544328/1019307 adresinde - git config receive.denynonfastforwards falseama aslında /opt/gitburadaki fikirlerle oynamak için oluşturduğum yerel git depomda manuel olarak ayarladım . Nasıl bitbucket, github vb için bunu yapabilir veya emin değilim ... Ve @intuitivepixel sert sıfırlama ile elde etmeye çalıştığınız şey tersine anlamsız.
HankCa

Merhaba @jkovacs, master'daki yeni değişikliklerin kaldırılmasını istemiyorum. Ben sadece bu taahhüt "e3f1e37" kökeni usta itmek istiyorum. Git reset --hard "e3f1e37" komutunu atlayarak mümkün müdür?
KarenAnne

Merhaba @jkovacs, sadece 2. adımı atlayabileceğimi doğruladım. :)
KarenAnne

2

Şubenizin masterhem burada hem de uzaktan çağrıldığını ve uzaktan kumandanızın çağrıldığını varsayarak originşunları yapabilirsiniz:

git reset --hard <commit-hash>
git push -f origin master

Ancak, başka biri uzak deponuzla çalışıyorsa ve değişikliklerinizi yaptıysa bunu yapmaktan kaçınmalısınız. Bu durumda, istemediğiniz taahhütleri geri almak daha sonra normal şekilde itmek daha iyi olacaktır.


1

Benzer bir durum yaşadığım için durumumu paylaşacağımı ve bu cevapların bana nasıl yardımcı olduğunu düşündüm (herkese teşekkürler).

Bu yüzden, ilerlememi ana şubeye kaydetmek istediğim her seferinde son taahhüdümü değiştirerek yerel olarak çalışmaya karar verdim (biliyorum, dallanmalıyım, buna bağlı kalmalıyım, itmeye devam ettim ve daha sonra ustalığa geri dönmeliydim).

Bir gece geç saatte, paranoyak donanım aksamındaki ilerlememi ya da eterden başka bir şeyi kaybetme korkusuyla ustayı kökenine itmeye karar verdim. Daha sonra yerel ana dalımı değiştirmeye devam ettim ve tekrar itme zamanına karar verdiğimde, farklı ana dallarla karşı karşıya kaldım ve yerel kalkınma dallarında olduğu gibi orijin / yukarı akışta ( duh! ) Değişiklik yapamayacağımı öğrendim .

Bu yüzden yerel olarak ödeme yapmadım çünkü zaten bir taahhütten sonraydım. Üstat değişmedi. Sıfırlamaya bile gerek duymadım - sert, mevcut taahhüdüm tamamdı.

Usta üzerinde hangi taahhüdü zorlamak istediğimi bile belirtmeden, kökenini zorlamaya zorladım çünkü bu durumda KAFA ne olursa olsun. Kontrol git diff master..origin/masteredildi, herhangi bir fark yoktu ve hepsi bu. Hepsi düzeltildi. Teşekkürler! (Biliyorum, ben bir git acemi, lütfen affet!).

Dolayısıyla, ana dalınızla yerel olarak zaten sorun yaşıyorsanız, sadece:

git push --force origin master
git diff master..origin/master
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.