Ödeme yapmadan diğer şubeyi güncel olarak sıfırlayın


110

Git iş akışım için bazı komut dosyaları yazıyorum.

Diğer (mevcut) şubeyi, ödeme yapmadan mevcut şubeye sıfırlamam gerekiyor.

Önce:

 CurrentBranch: commit A
 OtherBranch: commit B

Sonra:

 CurrentBranch: commit A
 OtherBranch: commit A

Eşiti

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Not --soft: Çalışma ağacını etkilemek istemiyorum.)

Mümkün mü?


Bunun Egit'te de mümkün olup olmadığını bilen var mı?
zedoo

Yanıtlar:


84

Tanımladığınız iş akışları eşdeğer değildir: gerçekleştirdiğinizde reset --hardçalışma ağacındaki tüm değişiklikleri kaybedersiniz (bunu yapmak isteyebilirsiniz reset --soft).

İhtiyacın olan şey

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch

3
Dostum, bunun gereksiz refs/heads/
şeyler

41
Bunu yapmanın çok daha güzel bir yolu git push . current:other. Bu, refs/heads(/ cc @elliottcable) olmadan çalışır ve ayrıca teslim alınan şubeyi güncellemenizi engeller. +current:otherGüncelleme hızlı ileri sarma değilse -f'yi geçmeniz (veya kullanmanız ) gerekebileceğini unutmayın .
Lily Ballard

4
Ayrıca , "CurrentBranch ile senkronize edildi" gibi -m 'some text', ref güncellemesinin git reflog OtherBranchkomutla gösterilme nedenini kaydetmek için argümanı da kullanabilirsiniz . Bunu neden daha sonra yaptığınızı hatırlamanız faydalı olabilir.
Levi Haskell

18
Neden kullanmak istiyorsunuz git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchya git push . CurrentBranch OtherBranchsen çok temizleyici (IMO) de kullanabilir zaman git branch -f OtherBranch CurrentBranchyerine? ( Aşağıdaki git dalı -f ile ilgili cevabıma bakın)
Colin D Bennett

1
@BenHymers Yani "git push" man sayfası lanet olası bir yalan. Komutu "Uzak başvuruları güncelle ..." olarak tanımlar. aslında yerel referansları gayet iyi güncelleyebiliyor.
Kaz

228

Set otherbranchaynı noktaya kadar taahhüt currentbranchçalıştırarak

git branch -f otherbranch currentbranch

-f(Kuvvet) seçeneği söyler git branch evet, gerçekten ortalama varolan herhangi üzerine yazmak otherbranchyenisiyle referansı .

Gönderen belgeler :

-f
--force

Zaten varsa olarak sıfırlayın. -F olmadan git dal mevcut bir dalı değiştirmeyi reddeder.


6
Bu en kolay cevap. Teşekkürler!
Robert Karl

Bunu fatal: Cannot force update the current branch.yapmaya çalışırken anlıyorum .
Fuad Saud

4
@FuadSaud, çünkü zaten otherbranchkontrol etmişsinizdir . Bu SO sorusu özellikle başka bir dalı farklı bir işleme sıfırlamakla ilgilidir (yani teslim alınan dalı sıfırlamamak). Yapmak istediğiniz şey, geçerli dalı git reset targetbranchişaretlenmeye zorlamak için mevcut dalı sıfırlamaktır targetbranch. --hardÇalışma ağacını bu içeriğe zorlamak için ekleyin . Veya --softdizini yalnız bırakıp sadece şubenin kendisini değiştirmek için.
Colin D Bennett

Doğru, sıfırlamayı biliyorum. Aradığım şey, bir rutin içinde, kontrol edilen şeyden bağımsız olarak, her zaman yerel ustayı yukarı / ana yöne yönlendirmenin bir yoluydu. Bunu branch -fyapabileceğini düşündüm .
Fuad Saud

9
Imo, bu kabul edilen cevap olmalı. Bu, iş akışımı çok geliştirdi!
lethal-guitar

23

Dilediğiniz zaman şubelerinizi bu komutla senkronize edebilirsiniz

$ git push . CurrentBranch:OtherBranch -f

Ayrıca -f bu komut dizisini değiştirmeden

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

Tüm dosyalarınızı CurrentBranch'da kaydetmeniz gerekmediğinde ve bu nedenle başka dallara geçemediğinizde yararlı olabilir.


"Uzak: hata: hızlı ilerlemeyi reddetme" ye neden olabilir
Basilevs

3
Ben dahil olmaz -fkesinlikle kaçınılmaz olmadıkça seçeneği. Benim durumumda onsuz iyi çalışıyor.
Melebius
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.