Bagaimana mengubah remote yang dilacak cabang?

675

The centralrepositori harus mengatur pada server baru, jadi saya membuat remote baru pada repo lokal saya, dan mendorong itu.

Tetapi sekarang ketika saya melakukannya git pull, itu mengklaim saya up to date. Itu salah — ini memberitahuku tentang cabang terpencil yang lama , bukan yang baru, yang aku tahu pasti punya komitmen baru untuk diambil.

Bagaimana cara mengubah cabang lokal saya untuk melacak remote yang berbeda?

Saya dapat melihat ini di file konfigurasi git tetapi saya tidak ingin mengacaukan semuanya.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master
joachim
sumber
1
Saya mengubah judul Anda - Anda sebenarnya mencoba mengubah remote yang Anda lacak, tetapi masih melacak nama cabang yang sama di dalamnya.
Cascabel
5
Sulit untuk menganggap ini sebagai duplikat dari Bagaimana Anda membuat cabang Git yang ada melacak cabang jarak jauh? . Pertanyaan itu tidak menentukan bahwa cabang sudah melacak cabang jarak jauh. Yang ini.
1
Sepertinya saya suka mengedit file konfigurasi adalah cara termudah dan teraman untuk melakukan ini
Steven Lu

Jawaban:

1082

Menggunakan git v1.8.0 atau yang lebih baru:

git branch branch_name --set-upstream-to your_new_remote/branch_name

Atau Anda dapat menggunakan -usakelar:

git branch branch_name -u your_new_remote/branch_name

Menggunakan git v1.7.12 atau yang lebih lama:

git branch --set-upstream branch_name your_new_remote/branch_name

urschrei
sumber
2
Inilah yang saya cari - mengubah cabang pelacakan jarak jauh untuk cabang yang diberikan. Terima kasih!
joachim
7
Ah, salahku. Saya masih akan melakukannya melalui konfigurasi, karena Anda dapat yakin untuk tidak secara tidak sengaja mengubah nama cabang, tetapi semuanya baik-baik saja. +1.
Cascabel
Dari catatan rilis 1.8.0 : "Sangat menggoda untuk mengatakan" git branch --set-upstream origin / master ", tetapi itu memberitahu Git untuk mengatur" asal / master "cabang lokal untuk berintegrasi dengan cabang yang saat ini keluar, yang sangat tidak mungkin apa yang dimaksud pengguna. Opsi ini ditinggalkan; gunakan opsi "--set-upstream-to" baru (dengan "-u") opsi pendek dan manis. "
Jared Beck
Begitu bersih ;_; Saya bisa memperbaiki kekacauan kecil yang saya buat dengan mudah! Terima kasih =))
Aditya MP
56
Jika cabang pelacakan jarak jauh belum ada tetapi cabang pelacakan jarak jauh yang ada saat ini dilacak, cabang pelacakan jarak jauh yang ada tidak dapat diubah. Anda harus terlebih dahulu menghapus cabang pelacakan jarak jauh saat ini: git branch --unset-upstream- kemudian berfungsi seperti yang diberikan dalam jawaban ini (atau dengan yang berikutnya git push -u / --set-upstream).
hakre
88

Bagi saya perbaikannya adalah:

git remote set-url origin https://some_url/some_repo

Kemudian:

git push
kritikus
sumber
3
Ini adalah cara yang dikatakan Github untuk melakukannya. help.github.com/articles/changing-a-remote-s-url
fsharp
18
Ini sebenarnya mengubah di mana remote berada, itu tidak mengubah remote yang Anda lacak (secara teknis) - Anda masih melacak "asal", itu hanya memperbarui definisi asal. Untuk beberapa kasus penggunaan, ini bisa menjadi hal yang buruk. Misalkan Anda melakukan fork jQuery dan membuat remote baru. "asal" adalah garpu Anda, "hulu" adalah jQuery. Maka anggaplah Anda perlu untuk sementara melacak repo asli bukan garpu Anda. Jika Anda menggunakan set-urldan lupa untuk mengaturnya kembali, maka git pushperintah di masa depan akan gagal
stevendesu
42

Dengan git terbaru (2.5.5) , perintahnya adalah sebagai berikut:

git branch --set-upstream-to=origin/branch

Ini akan memperbarui cabang yang dilacak jarak jauh untuk cabang lokal Anda saat ini

Ko2r
sumber
3
Memukul git branch --set-upstream-to=origin/developmengangkat kesalahan: error: the requested upstream branch 'origin/develop' does not exist. Sebelumnya, saya mengganti nama cabang jauh menjadi delelop.
belgoros
1
@ belgoros git fetch --allmungkin?
Gabriel Devillers
25

Opsi lain untuk memiliki banyak kendali atas apa yang terjadi adalah mengedit konfigurasi Anda dengan tangan:

git config --edit

atau steno

git config -e

Kemudian edit file sesuka hati, simpan dan modifikasi Anda akan diterapkan.

wranvaud
sumber
1
Ini menyelamatkan hari bagi saya. Terima kasih!
Martyn Chamberlin
Masalah saya adalah bahwa ada dua asal. (asal dan asal-algo). Tetapi master lokal sedang melacak "origin-algo". Tapi saya ingin melacak "asal". Satu-satunya cara saya bisa mengubahnya adalah dengan mengedit konfigurasi git.
Aswin Prasad
19

Jika Anda waras, mengedit file konfigurasi cukup aman. Jika Anda ingin menjadi lebih paranoid, Anda dapat menggunakan perintah porselen untuk memodifikasinya:

git config branch.master.remote newserver

Tentu saja, jika Anda melihat konfigurasi sebelum dan sesudah, Anda akan melihat bahwa ia melakukan persis apa yang akan Anda lakukan.

Tetapi dalam kasus pribadi Anda, apa yang akan saya lakukan adalah:

git remote rename origin old-origin
git remote rename new-origin origin

Artinya, jika server baru akan menjadi remote kanonik, mengapa tidak menyebutnya asal seolah-olah Anda awalnya dikloning dari itu?

Cascabel
sumber
3
Saya sebenarnya telah melakukan itu sebelum mengatasi masalah ini - git pandai dan membawa remote rename ke file konfigurasi, jadi pada contoh Anda, file konfigurasi saya mengatakan 'old-origin'.
joachim
Secara pribadi, saya pikir cara ini lebih masuk akal secara konseptual daripada cara yang diterima, tapi saya kira mereka secara fungsional setara, benar?
Evan Donovan
1
@ Jefromi: A remote renametidak akan melakukan apa yang diminta karena ia mengubah nama remote baik di [remote]konfigurasi maupun di [branch]konfigurasi. Jadi apa yang perlu dilakukan dalam hal ini adalah mengedit file konfigurasi dan melakukan apa yang Anda katakan (mengubah nama remote) hanya di [remote]baris konfigurasi.
Sumeet Pareek
7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

atau

git fetch
git checkout -b local_branch_name origin/branch_name
uma
sumber
Untuk kasus saya, saya perlu git fetch. Saya telah membuat cabang baru di bitbucket dan ingin beralih ke itu. git tidak tahu tentang perubahan jarak jauh jadi saya harus lakukan git fetchsebelumnya git checkout feature/new-feature-branch. Semoga ini bisa membantu orang lain.
TelamonAegisthus
6

Ini adalah perintah termudah:

git push --set-upstream <new-origin> <branch-to-track>

Misalnya, diberi perintah git remote -vmenghasilkan sesuatu seperti:

origin  ssh://[email protected]/~myself/projectr.git (fetch)
origin  ssh://[email protected]/~myself/projectr.git (push)
team    ssh://[email protected]/vbs/projectr.git (fetch)
team    ssh://[email protected]/vbs/projectr.git (push)

Untuk mengubah pelacakan tim:

git push --set-upstream team master
Andries
sumber
Cabang yang akan dilacak adalah opsional ketika tidak ada yang ambigu. Saya menggunakan saran Anda ketika pindah dari Github;) Terima kasih.
gouessej
4

Anda dapat menghapus cabang saat ini dan melakukan:

git branch --track local_branch remote_branch

Atau ubah perubahan server jarak jauh ke server saat ini di konfigurasi

RDL
sumber
tidak bekerja untuk saya, hanya perintah yang bekerja dari @uma: git checkout --track -b local_branch_name origin/branch_name
Saad Benbouzid
2

Berdasarkan apa yang saya pahami dari dokumentasi git terbaru , sinopsisnya adalah:

git branch -u upstream-branch local-branch
git branch --set-upstream-to=upstream-branch local-branch

Penggunaan ini tampaknya sedikit berbeda dari jawaban urschrei, seperti dalam sinopsisnya adalah:

git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

Saya kira mereka mengubah dokumentasi lagi?

Arshan Khanifar
sumber
1

Dalam versi git terbaru seperti 2.7.4 ,

git checkout branch_name # cabang nama yang ingin Anda ubah cabang pelacakan

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - nama jarak jauh

Mohideen bin Mohammed
sumber
1

Saya menemukan postingan @critikaster bermanfaat, kecuali saya harus melakukan perintah ini dengan GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master
pengguna8128167
sumber
0

cara termudah adalah dengan hanya mendorong ke cabang baru:

git push -u cabang asal / nama

ArthNRick
sumber