Ö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.