Başka bir şubeye gönderme taahhütleri


384

Değişiklikleri bir şubeden diğerine aktarmak ve uygulamak mümkün müdür?

BRANCH1'de değişiklik yaptığımı ve bunları BRANCH2'ye aktarmak istediğimizi varsayalım .

Gönderen BRANCH1 , geçerli yapmaktır:

git push origin **BRANCH2**

Ve sonra BRANCH1 sıfırlansın mı?

Yanıtlar:


710

Neredeyse işe yarayacak.

Varsayılan olmayan bir şubeye iterken, kaynak ref ve hedef ref'yi belirtmeniz gerekir:

git push origin branch1:branch2

Veya

git push <remote> <branch with new changes>:<branch you are pushing to> 

26
Her iki mı branch1ve branch2uzaktan olmak gereğini? Yerelden branch1uzaktan kumandaya itmek isterseniz ne olur origin branch2?
orad

11
@orad: Hayır. İlk bölüm aslında sadece yerel bir taahhüdün tanımlayıcısıdır; bir şube olmasına bile gerek yok.
SLaks

6
@abhisekp: Aynı sözdizimini kullanın. Kaynak şubeye başvurmak için<remote>/<branch>
SLaks

4
@abhisekp: Az önce söylediğim şeyi yap. Mevcut şube tamamen ilgisizdir.
SLaks

21
Herkesin (kendim gibi) git push origin :branch2geçerli yerel dalı uzaktan kumandaya iteceğini, branch2bunun yerine uzaktan kumandayı sileceğini düşünmeye çalıştığını unutmayın branch2! Doğru yol git push origin HEAD:branch2.
Helder Pereira

72

Kesinlikle, ancak sadece BRANCH2'nin hızlı bir ileri hareketi varsa veya zorlarsanız çalışacaktır. Böyle bir şeyi yapmak için doğru sözdizimi

git push <remote> <source branch>:<dest branch> 

Nasıl çalıştığı hakkında daha fazla ayrıntı için git push man sayfasındaki "refspec" açıklamasına bakın . Ayrıca, hem bir zorlama itme hem de sıfırlama işleminin "geçmişi yeniden yazan" işlemler olduğunu ve uzak depolar ve diğerleriyle ilgili olarak ne yaptığınızı kesinlikle bilmediğiniz sürece kalp zayıflığı tarafından denenmemesi gerektiğini unutmayın. aynı projenin çatalları / klonları olan kişiler.


6
Teşekkürler! Sadece zorlayabileceğini ekleyeceğim git push --force remote local-branch:remote-branch.
Ferran Maylinch

16

Çok basit. Hem yerel hem de uzaktan bulunan A Şubenizde değişiklik yaptığınızı, ancak bu değişiklikleri hiçbir yerde bulunmayan B Şubesine aktarmak istediğinizi varsayalım .

Adım-01: Oluşturun ve yeni dal B'ye geçin

git ödeme -b B

Adım-02: Yeni yerel şubeye değişiklik ekleme

git ekleyin. // veya belirli dosya (lar)

Adım-03: Değişiklikleri yapın

git commit -m "commit_message"

Adım-04: Değişiklikleri yeni dal B'ye itin . Aşağıdaki komut uzaktan da yeni bir B dalı oluşturur

git itme başlangıç ​​noktası B

Şimdi, bitbucket'ten B dalının A dalından bir tane daha taahhüt edeceğini doğrulayabilirsiniz . A dalına baktığınızda, B dalına itildikleri için bu değişiklikler olmayacaktır .

Not: Değişikliklerinizi A dalında gerçekleştirdiyseniz ve bundan sonra bu değişiklikleri yeni B dalına kaydırmak istiyorsanız, önce bu değişiklikleri sıfırlamanız gerekir. #HappyLearning


2

Benim durumumda ben itilmiş değildi ki, yerel bir taahhüt vardı origin\master, ama benim yerel taahhüt masterşube. Bu yerel taahhüt şimdi başka bir şubeye gönderilmelidir.

Git Uzantıları ile şöyle bir şey yapabilirsiniz:

  • (Mevcut değilse oluşturun) ve taahhüdünüzü zorlamak istediğiniz yeni şubeye göz atın.
  • Taahhüt edilmesi ve bu şubeye aktarılması gereken geçmişten taahhüdü seçin.
  • Sağ tıklayın ve Kiraz toplama taahhüdü'nü seçin .
  • Daha sonra Kiraz seçim düğmesine basın .
  • Seçilen tamamlama işlemi teslim alınmış dalınıza uygulanır. Şimdi taahhüt edin ve itin.
  • Hatalı taahhüt ile eski şubenizi kontrol edin.
  • Bu dalı, her şeyin yolunda olduğu ikinci son işleme sıfırlayın (burada ne yaptığınızın farkında olun!). Bunu, ikinci son işleme sağ tıklayıp Geçerli dalı buraya sıfırla'yı seçerek yapabilirsiniz . Ne yaptığınızı biliyorsanız, rakibinizi onaylayın.

Bunu GIT komut satırında da yapabilirsiniz . David Christensen'den kopyalanan örnek :

Bence git cherry-pick+ git resetçok daha hızlı bir iş akışı bulacaksınız :

Aynı senaryoyu kullanarak, "özellik" en üstteki taahhüt yanlış olan dal olmakla birlikte, bunu yapmak çok daha kolay olurdu:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

Biraz işten git cherry-pick tasarruf sağlar ve üstesinden gelmek için tasarlanmış senaryodur .

Ayrıca, en üst düzey taahhüt değilse bunun da işe yarayacağını da not edeceğim; sadece kiraz toplama argümanı için bir taahhüt gerekir, yoluyla:

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history


2

git push origin branch1:branch2Komutu ile kötü bir sonuç aldım :

Benim durumumda, branch2silinir ve branch1bazı yeni değişikliklerle güncellendi.

İsterseniz Bu nedenle, yalnızca değişiklikler üzerinde itmek branch2gelen branch1, aşağıdaki prosedürleri deneyin:

  • Açık branch1:git add .
  • Açık branch1:git commit -m 'comments'
  • Açık branch1:git push origin branch1

  • Açık branch2:git pull origin branch1

  • Açık branch1: bir önceki işleme geri dönün.


0

bunu kolayca yapabilirsin

git status
git add .
git commit -m "any commit"
git pull origin (branch name, master in my case)
git push origin current branch(master):branch 2(development)(in which you want to push changes)

-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  


1
Lütfen kodun bir açıklamasını ekleyin.
Nakx

-4

BRANCH1'i taahhüt ettiniz ve değişiklikleri kaybetmeden bu taahhütten kurtulmak mı istiyorsunuz? git reset ihtiyacınız olan şey. Yapmak:

git branch BRANCH2

BRANCH2'nin yeni bir şube olmasını istiyorsanız. İsterseniz bunu sonunda başka bir dalla da birleştirebilirsiniz. BRANCH2 zaten varsa, bu adımı dışarıda bırakın.

Sonra şunları yapın:

git reset --hard HEAD~3

taahhüt ettiğiniz şubedeki taahhüdü sıfırlamak istiyorsanız. Bu, son üç taahhüdün değişikliklerini gerektirir.

Ardından, sıfırlanan işlemleri BRANCH2'ye getirmek için aşağıdakileri yapın

git checkout BRANCH2

Bu kaynak yardımcı oldu: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

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.