Yalnızca git://
erişebileceğim bir havuz varsa (ve genellikle yalnızca + çekin), bu havuzdaki dalları yerel olarak yaptığım şekilde yeniden adlandırmanın bir yolu var git branch -m
mı?
Yalnızca git://
erişebileceğim bir havuz varsa (ve genellikle yalnızca + çekin), bu havuzdaki dalları yerel olarak yaptığım şekilde yeniden adlandırmanın bir yolu var git branch -m
mı?
Yanıtlar:
İstediğiniz ada sahip yeni bir yerel şube oluşturmanız, uzaktan kumandanıza itmeniz ve ardından eski uzak dalı silmeniz yeterlidir:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
Ardından, eski şube adını görmek için, deponun her istemcisinin şunları yapması gerekir:
$ git fetch origin
$ git remote prune origin
NOT: Eski dalınız ana dalınızsa, ana dal ayarlarınızı değiştirmeniz gerekir. Aksi takdirde, çalıştırdığınızda "geçerli dalın silinmesi yasak"$ git push origin :old-branch-name
hatasını alırsınız .
git fetch origin --prune
(yeni dalları etkili bir şekilde getirmek ve artık uzaktan kumandadaki referanslardan kurtulmak için).
-d
veya --delete
yerine kullanılabilir :
.
Yerel şubeleri aynı anda yeniden adlandırmadan şubeleri uzaktan yeniden adlandırmak istiyorsanız, bunu tek bir komutla yapabilirsiniz:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
Yukarıdakileri kolayca yapmak için kullanışlı bir kısayol sağlayan bu komut dosyasını ( git-rename-remote-branch ) yazdım .
Bir bash işlevi olarak:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
@ Ksrb'nin yorumunu entegre etmek için : Bunun temel olarak yaptığı şey, tek bir komutta iki kez itmektir , önce git push <remote> <remote>/<old_name>:refs/heads/<new_name>
eski uzaktan izleme kolunu temel alan yeni bir uzak dalı itmek ve sonra git push <remote> :<old_name>
eski uzak dalı silmek için.
git push <remote>/<old_name>:refs/heads/<new_name>
itme, eski uzaktan kumandayı src olarak kullanan yeni bir uzaktan kumandayı itmek anlamına gelir, daha sonra git push [space]:<old_name>
eski uzaktan kumandayı silmek anlamına gelir
refs/heads/name
? Sadece name
doğrudan komut kullanamaz git push <remote> <remote>/<old_name>:<new_name>
mısın?
<new_name>
henüz mevcut değil. Şube mevcut değilse Git, tam adı kullanmanızı gerektirir; aksi takdirde <new_name>
etiket adına da başvurabilir.
refs/heads/<new_name>
zaten varsa. Silme işlemi hala başarılı olur ve <remote>/<old_name>
yalnızca silinir. El öncesi bazı kontroller bunu kolayca önleyebilir.
Yeniden adlandırmak istediğiniz şubeye ilk ödeme:
git branch -m old_branch new_branch
git push -u origin new_branch
Eski bir dalı kaldırmak için remote
:
git push origin :old_branch
git push -u origin new_branch
) Aksi takdirde yeniden adlandırılan şube (new_branch) orijin / old_branch'ı izlemeye devam eder. Ve old_branch uzaklığını sildiğinizde, new_branch yine de bu şube gitti olsa da, orijin / old_branch'ı takip edecektir.
Elbette. Sadece şubeyi yerel olarak yeniden adlandırın, yeni dalı itin ve eskisini silin.
Tek gerçek sorun, deponun diğer kullanıcılarının yerel izleme dallarının adını değiştirmemeleri.
Uzak bir dalın "yeniden adlandırılması" aslında 2 adımlı bir işlemdir (zorunlu olarak sipariş edilmez):
git push [space]:<old_name>
olarak ksrb açıklanmıştır );Kullandığım TortoiseGit İlk komut satırı dalı silmeye çalışırken, ben hallederim ve:
$ git push origin :in
fatal: 'origin' bir git deposu gibi görünmüyor
ölümcül: Uzak depodan okunamadı.
Lütfen doğru erişim haklarına sahip olduğunuzdan ve havuzun var olduğundan emin olun.
Bunun nedeni, pageant'ın özel anahtarı ( TortoiseGit otomatik olarak pageant'a yükleyememesi ) yüklememesiydi . Dahası, TortoiseGit komutlarının origin
içinde ref olmadığını (örneğin git.exe push --progress "my_project" interesting_local:interesting
) fark ettim .
Ayrıca Bitbucket kullanıyorum ve diğerleri web tabanlı çevrimiçi git yöneticileri gibi (GitHub, GitLab), uzak dalı doğrudan arabirimleri (şubeler sayfası) aracılığıyla silebilirdim:
Bununla birlikte, TortoiseGit'te Uzak Dalları Referanslara Gözat ile de silebilirsiniz :
Uzak bir dalı (uzaktan kumandalar listesi) sağ tıklatarak Uzak dalı sil seçeneği görünür :
Eski uzak dalı sildikten sonra, yalnızca Push penceresinin Remote: alanına yeni adı yazarak TortoiseGit aracılığıyla doğrudan yeni bir uzak şubeye ittim ve bu dal otomatik olarak oluşturuldu ve Bitbucket'te görünür .
Bununla birlikte, yine de el ile yapmayı tercih ediyorsanız, bu iş parçacığında henüz belirtilmemiş bir nokta -u
= --set-upstream
.
Gönderen git push
dokümanlar , -u
sadece bir diğer adıdır --set-upstream
, cevaplarından kadar komutlar Sylvain ( -set-upstream new-branch
) ve shashank ( -u origin new_branch
) , eşdeğerdir uzak ref beri varsayılanorigin
başka hiçbir ref Eğer daha önce:
git push origin -u new_branch
= git push -u new_branch
Den dokümanlar açıklama :
Yapılandırma eksikse, varsayılan olarak
origin
.
Sonunda, buradaki diğer cevaplar tarafından önerilen komutları manuel olarak yazmadım veya kullanmadım, bu yüzden belki de bu benzer bir durumda başkaları için yararlı olabilir.
origin
. Komutu çalıştırırken uzaktan kumandanızı adlandırmanız gerekir git remote
. Git ssh
, genel + özel anahtarları kullandığınız anlamına gelen şeylerle çalışır . Autoload Putty keys
TortoiseGit'in uzaktan referansınızla herhangi bir şey yapmanız için gerekli anahtarları otomatik olarak yüklediğini varsayıyorum . Son şey, git push -u
uzak bir dalı itmek için bir takma ad değil, yerel olarak oluşturulan uzak bir dalda itmek için bir takma addır ve uzaktan başvurusunda henüz bu dal yoktur .
-u
, --set-upstream
"yapılandırma eksikse varsayılan olarakorigin
" bir takma addır . Sylvain ve Shashank bunu yeni oluşturulan uzak bir şubeye itmek için kullanıyor . Anahtar konu nedeniyle olabilir yarışmasında Denedim zaman yüklü olmamasından git push origin :in
kabuk üzerinde. Bu yüzden downvote'unuzu anlamadım, diğer cevaplarda benimkini ve ele alınmamış ayrıntıları işaret ettim, açıkladım ve çözdüm.
-u
için bir takma addır, --set-upstream
ancak dediğin gibi uzak bir şubeye itmek için takma ad değildir. Bir uzak dalı içine itmek için benzersiz bir şekilde ihtiyacınız var git push <remote>
ve henüz uzaktan kumandada değilse, eklersiniz git push -u <remote>
. Bu nedenle, -u
uzaktan kumandadaki dalın bir referansını oluşturmak için kullanılır.
Nedenini bilmiyorum ama @Sylvain Defresne'nin cevabı benim için çalışmıyor.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Yukarı akışın ayarını kaldırmalıyım ve sonra akışı tekrar ayarlayabilirim. İşte bunu nasıl yaptım.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
Bunun doğru ya da yanlış olup olmadığını bilmiyorum, ancak dalın "eski adını" dalın "yeni adına" ittim, sonra eski dalı tamamen aşağıdaki iki satırla sildim:
git push origin old_branch:new_branch
git push origin :old_branch
Daha önce verilen yanıtlara ek olarak, önce yeni dalın zaten var olup olmadığını kontrol eden bir sürüm (böylece bir komut dosyasında güvenle kullanabilirsiniz)
if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"
(çek bu cevaptan alınmıştır )
git show-ref --quiet --verify -- refs/heads/$new_name
yerine kullanırdım ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.