git: beralih cabang tanpa melepaskan kepala

102

Saya memiliki repositori di github dengan cabang utama (master) dan cabang untuk beberapa pekerjaan eksperimental. Saya membuat beberapa komitmen dan mendorong ke cabang percobaan dan semuanya baik-baik saja.

Sekarang, pada mesin yang berbeda, saya mencoba untuk clone saya repositori (git clone repositori ) dan kemudian beralih ke cabang eksperimental (git checkout branchname ) tapi setiap kali saya melakukan ini kepala saya akan terlepas dan saya tidak bisa mendorong perubahan saya. Apa yang saya lakukan salah? Saya merasa saya kehilangan konsep dasar git di suatu tempat tetapi membaca halaman manual git secara acak tidak memberi saya petunjuk apa pun.

Saya baru mengenal git jadi saya minta maaf jika saya menjadi idiot tetapi saya tidak dapat menemukan apa pun di dokumen yang akan membantu saya memasang kembali kepala saya.

EDIT

Konsep cabang pelacakan adalah apa yang saya lewatkan. Sekarang saya mendapatkan konsep itu, semuanya jelas. Secara pribadi, saya menemukan git branch --tracksintaksnya jauh lebih intuitif daripada git checkout -b branch-name origin/branch-name.

Terima kasih untuk bantuannya!

Dana Robinson
sumber
Untuk berpindah cabang tanpa melepaskan head, dengan Git 2.23 (Agustus 2019), gunakan git switch: lihat jawaban saya di bawah .
VonC

Jawaban:

115
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

Untuk kenyamanan, Anda dapat menggunakan string yang sama untuk nama lokal & nama cabang
Ketika Anda memeriksa origin/branchnameAnda tidak benar-benar memeriksa cabang. origin/branchnameadalah nama "jarak jauh", dan Anda bisa mendapatkan daftarnya dengan

branch -a 

Jika Anda mengaktifkan warna, cabang lokal akan menjadi satu warna, dan menjauhkan warna lainnya.

Anda harus terlebih dahulu membuat cabang jarak jauh dilacak secara lokal agar dapat beralih ke dan mengerjakannya.

Kent Fredric
sumber
9
Astaga, mengapa "git checkout origin / branchname" tidak mulai melacak cabang secara otomatis jika belum dilacak?
Martin Konicek
4
karena Anda masih membutuhkan nama lokal untuk cabang luar negeri.
Kent Fredric
Inilah yang saya lakukan, dan pesan kesalahannya: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: jalur pembaruan tidak kompatibel dengan peralihan cabang. Apakah Anda bermaksud untuk melakukan pembayaran 'upstream / topic / fetch' yang tidak dapat diselesaikan sebagai commit?
ulu
2
Terima kasih atas tip tentang warna. Untuk mengaktifkan warna:git config --global --add color.ui true
PonyEars
1
Perlu dicatat bahwa "origin / branchname" secara harfiah dapat berupa apa pun yang memutuskan untuk SHA1, atau SHA1 itu sendiri =). Saya secara teratur menggunakannya untuk membuat cabang sembarang dengan akar sembarangan.
Kent Fredric
16
git clone [email protected]:abc/def.git
cd def

Sekarang buat cabang pelacakan:

git branch --track experimental origin/experimental
git checkout experimental

Kemudian, setelah bekerja di sana, cukup dorong ke github

git push
Christoph Rüegg
sumber
3
git branch -t origin / eksperimental # tidak perlu mengetik terlalu banyak :)
Dustin
Cabang yang ingin saya lacak disebut topic / fetch. Ketika saya mencoba melakukan $ git branch --track topic / fetch upstream / topic / fetch dikatakan, fatal: Bukan nama objek yang valid: 'upstream / topic / fetch'.
ulu
1
@Dustin, perintah itu membuat 'origin / eksperimental' cabang lokal yang melacak master lokal. Saya menduga itu adalah kesalahan yang cukup umum.
PDug
1
@PDug% git checkout -t origin / eksperimental Cabang eksperimental disiapkan untuk melacak eksperimental cabang jarak jauh dari asal dengan rebasing. Beralih ke 'eksperimental' cabang baru
Dustin
11

Untuk memperluas jawaban Kent, setelah Anda melakukan klon, satu-satunya cabang yang Anda miliki (remote tidak dihitung) adalah cabang yang aktif dalam repositori tempat Anda kloning - master dalam kasus Anda.

Jadi, pertama-tama Anda ingin membuat cabang baru untuk melacak cabang percobaan jarak jauh:

$ git branch experimental origin/experimental

dan kemudian periksa:

$ git checkout experimental

Namun, Kent benar - kedua perintah ini dapat digabungkan

$ git checkout -b experimental origin/experimental
Pat Notz
sumber
3

Dengan Git 2.23 (Agustus 2019), Anda akan menggunakan file git switch perintah

Jika Anda memiliki cabang jarak jauh dengan nama yang sama, maka secara otomatis akan dilacak:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
VonC
sumber