2009-10-06 10 views
8

Uzak bir yerel şubede bir işlem yapıyorum ve bu taahhüdünü tarihe atmak ve bazılarını kendi şubesine koymak istiyorum.git: ek geri dönüşü olmayan bir geri dönüş için gitmenin daha iyi bir yolu

  D---E---F---G master 

Ve istediğim:

Temelde, şu anda var

   E---G topic 
      /
      D master 

benim yerel ve (denilen köken, sadece bir tane) Uzak depoda hem olmalıdır That .

Bunu elde etmenin en temiz yolu hangisidir? Ayrıca, bu repoyu klonlayan ve ana dalı kontrol eden başka insanlar da vardır. Uzaktan repoda böyle bir değişiklik yapacak olsaydım, aynı duruma gelmeleri için 'git' çeker miydi?

cevap

7

Eğer yayınladıysanız, master'un tarihini tekrar yazmak istemediğinizi haklısınız. İstediğin şey, geçmişini D olduğu duruma geri getirerek ana geçmişini geri getirerek, diğer kullanıcıların işlerini kolayca birleştirebilmeleri veya yeniden ispat edebilmelerini sağlamak için bir taahhüt yayınlamaktır.

o zaman muhtemelen de sonradan topic birleştirme zaman, sen 'yok, böylece master ve topic arasında yeni bir ortak üs yapmak olduğunu ne yapmak istediğinizi master içine topic birleştirmek için gelecekte bir noktada planlıyorsanız master'da geri gönderilen işlemleri kaybetmeyin. Bunu yapmanın en kolay yolu, 'geri alma' taahhüdünün üstesinden gelmek ve master'u orijinal durumuna döndürmek ve bunun üzerine yeni topic şubesini temel almaktır. Eğer yapmış bir alternatif olarak

# checkout master branch (currently at G) 
git checkout master 

# Reset the index to how we want master to look like 
git reset D 

# Move the branch pointer back to where it should be, leaving the index 
# looking like D 
git reset --soft [email protected]{1} 

# Make a commit (D') for the head of the master branch 
git commit -m "Temporarily revert E, F and G" 

# Create the new topic branch based on master. 
# We're going to make it on top of master and the 'undo' 
# commit to ensure that subsequent merges of master->topic 
# or topic->master don't merge in the undo. 
git checkout -b topic 

# Revert the undo commit, making a redo commit (G'). 
git revert HEAD 

E 'F' taahhüt ve G 'Her bölümü ayrı ayrı yineleme ama E, F ve G yayımlanmış tarihinin zaten olduğu gibi sadece referans eğer muhtemelen daha anlaşılabilir' taahhüdünü geri al ve bu işlemin geri alındığını söyle. Bu zaten git revert'un yaptığı şeydir.

Esasen bildiğiniz şey budur.

D -- E -- F -- G -- D'  <-- master 
        \ 
         \ 
         G' <-- topic 

önemli şeylerden

Eğer tarihi yeniden değil ve birleştirmeleri yanlışlıkla herhangi bir 'geri al' geçerli olmayacaktır böylece konu usta dayandığını vardır taahhüt eder. Artık güvenli bir şekilde uzak deponuza master ve topic'u da itebilirsiniz. Ben git stash bulmak

+0

Teşekkürler, bu tam olarak benim yaptığım şeydi (Jefromi'nin bazı yorumlarında da önerdim). Tarih, bu başarısızlıktan dolayı biraz çirkin ama bu konuda hiçbir şey yapamam. – Albert

+0

2 hafta git kullanıcı burada. Önce G'den G'ye dalmak daha kolay olmaz mı? Bu şekilde, herhangi bir şeyi geri almanıza/tekrar etmenize gerek yok, ki bu da bana daha güvenli geliyor. (Zaten git reset ile uğraşmaktan dolayı düzeltilemez şekilde düzenlemelerimi kaybettim.) – bart

+0

@bart, 'git reflog''a bir göz atın. Taahhüt edilen ve sonradan vidalanan şeyler her zaman en azından birkaç günlüğüne reflogdan kurtarılabilir. Bununla birlikte, gerçekleştiremediğiniz değişiklikleri geri dönüşü olmayan bir şekilde kaybedebilirsiniz. – dubiousjim

4

Geçmişinizi istediğiniz gibi yeniden yazabilirsiniz, ancak geçmişin kopyaları varsa, bu kötü bir fikirdir. Bu durumda, muhtemelen etkileşimli rebase: git rebase -i master topic kullanırsınız. Bu size, ustadan konuya nasıl bir şekilde çalışılacağına dair ipuçları veren bir liste verecektir. Kaldırmak istediğiniz işlemi içeren satırı kaldırmanız yeterlidir.

Bu tarihin başka biri varsa, bunun sorumsuz olduğunu vurgulamalıyım. Onu merkezi repoya zorla zorlamanız gerekecek ve herkesin depolarını eşleştirmek için tamir etmesi gerekecek, koşullara bağlı olarak nispeten basit veya karmaşık olabilir.

git-rebase man page numaralı telefondan "Başlangıcından kurtarma" denen güzel bir bölüm var.

Düzenleme

: sırt eski usta yukarı

  • : Basit tarihi için

    , ortak bir senaryo merkezi repo (push -f), diğer geliştiricilerin olmayan bir FastForward itmek zorlayarak sonra şöyle olacaktır: git branch -m master master_old

  • güncellemeleri almak ve kökenlerinden usta yeniden: git remote update origin; git branch master origin/master
  • rebase yeni master üzerine tüm konu dalları: git rebase --onto master master_old topic

henüz kökenli değildir onların ana dalında eser, bunlar şevkiniz gerekecek varsa, bu işi ve ustasının yeni konumu üzerine tüm konu dalları rebasing ... Bu size vermelidir Başkalarının sahip olduğu tarihi yeniden yazmanın neden bu kadar korkunç bir fikir olduğu. Gerçekten, bir şey kamu havuzuna geçtikten sonra, bunu hızlı ve hızlı bir şekilde kaydedilmiş bir tarih olarak görmelisiniz, devam eden bir çalışma değil.

+0

Tamam, bu bilgiler için çok teşekkürler. Yani bu gerçekten bir çözüm değil, çünkü böyle bir baskı yapmak istemiyorum. Benzer bir sonuç elde etmek için en temiz çözüm ne olurdu? Şimdi düşünebildiğim, E, F, G'yi ustalaştırmak, sonra da bu eyaletten yeni bir dal yaratmak ve E ve G'yi almak. Doğal olarak ne yapmalı? – Albert

+0

Bu tür sorunlara neden olmadan, geçmişten gelen bir işlemi kaldırmak için * bir yol * yoktur. Ne yaparsanız yapın, ustalığınızı, ustasının geçmişinde daha önceki bir pozisyonu olmayan bir sürece yönlendirin. – Cascabel

+0

Bu, sorunun cevabının yeni versiyonuna büyük ölçüde cevaplandırılmıştır, ancak yorumunuza cevap vermek için: master'in tarihini yeniden yazdığınız bir duruma nasıl girdiğiniz önemli değildir. Yine de yeniden yazmış olacaksın. Bunların hepsini yaparsanız * yerel *, sorun değil. Buna temizlik denir. Eğer bunları yayınlanmış bir çalışmaya yaparsanız, bir şeyleri karıştırıyorsunuz, kimsenin güvenebileceği bir kamusal repo yaratıyorsunuz, vb. – Cascabel

-3

Sadece uzak Saklayacak tekrar bakmak asla

oldukça yararlıdır.

+2

Zaten taahhüt ettiğiniz değişiklikleri saklayamazsınız. –

+0

'' sıfırlama HEAD^'işlevini kullanarak değişikliklerinizi kaybetmeden dışarı çıkın. – twig

İlgili konular