git: สลับสาขาโดยไม่ต้องถอดหัว


102

ฉันมีที่เก็บบน github ที่มีสาขาหลัก (หลัก) และสาขาสำหรับงานทดลองบางอย่าง ฉันมุ่งมั่นและผลักดันไปยังสาขาทดลองและทุกอย่างก็เรียบร้อยดี

ตอนนี้ในเครื่องอื่นฉันพยายามโคลนที่เก็บของฉัน (git clone repository ) จากนั้นเปลี่ยนไปใช้สาขาทดลอง (git checkout branchchname ) แต่ทุกครั้งที่ทำสิ่งนี้หัวของฉันจะหลุดออกและฉันไม่สามารถผลักดันการเปลี่ยนแปลงของฉันได้ ผมทำอะไรผิดหรือเปล่า? ฉันรู้สึกว่าฉันคิดถึงแนวคิดพื้นฐานของคอมไพล์ แต่การอ่านเพจคนคอมไพล์แบบสุ่มไม่ได้ให้เบาะแสอะไรเลย

ฉันเพิ่งเริ่มคอมไพล์ดังนั้นฉันขอโทษถ้าฉันเป็นคนงี่เง่า แต่ฉันไม่พบสิ่งใดในเอกสารที่จะช่วยให้ฉันใส่หัวกลับเข้าไปใหม่ได้

แก้ไข

แนวคิดของสาขาการติดตามคือสิ่งที่ฉันขาดหายไป ตอนนี้ฉันคิดว่าแนวคิดทุกอย่างชัดเจน โดยส่วนตัวแล้วฉันพบว่าgit branch --trackไวยากรณ์นั้นใช้งานง่ายกว่าgit checkout -b branch-name origin/branch-nameไฟล์.

ขอบคุณสำหรับความช่วยเหลือ!


หากต้องการเปลี่ยนสาขาได้โดยไม่ต้องถอดหัวกับ Git 2.23 (สิงหาคม 2019) การใช้งานgit switch: เห็นคำตอบของฉันด้านล่าง
VonC

คำตอบ:


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

# othertimes 
git checkout localname 

git push origin

เพื่อความสะดวกคุณอาจใช้สตริงเดียวกันสำหรับชื่อท้องถิ่นและชื่อสาขา
เมื่อคุณชำระเงินorigin/branchnameคุณไม่ได้ตรวจสอบสาขาจริงๆ origin/branchnameเป็นชื่อ "ระยะไกล" และคุณจะได้รับรายชื่อด้วย

branch -a 

หากคุณเปิดใช้งานสีสาขาในพื้นที่จะเป็นสีเดียวและอีกสีหนึ่งจากระยะไกล

คุณต้องสร้างสาขาระยะไกลที่ติดตามในเครื่องก่อนเพื่อให้สามารถสลับไปใช้และทำงานได้


9
ผู้ชายทำไม "git checkout origin / minorchname" ไม่เริ่มติดตามสาขาโดยอัตโนมัติหากยังไม่ได้ติดตาม
Martin Konicek

4
เนื่องจากคุณยังต้องการชื่อท้องถิ่นสำหรับสาขาต่างประเทศ
Kent Fredric

นี่คือสิ่งที่ฉันกำลังทำและข้อความแสดงข้อผิดพลาด: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: การอัปเดตเส้นทางใช้กับการสลับสาขาไม่ได้ คุณตั้งใจจะชำระเงิน "upstream / topic / fetch" ซึ่งไม่สามารถแก้ไขได้ว่าเป็นการกระทำหรือไม่?
ulu

2
ขอบคุณสำหรับเคล็ดลับเกี่ยวกับสี ในการเปิดใช้งานสี:git config --global --add color.ui true
PonyEars

1
เป็นที่น่าสังเกตว่า "ต้นกำเนิด / รำชื่อ" อาจเป็นอะไรก็ได้ที่แก้ไข SHA1 หรือ SHA1 ในตัวเอง =) ฉันใช้สิ่งนั้นเป็นประจำเพื่อสร้างกิ่งก้านที่มีรากตามอำเภอใจ
Kent Fredric

16
git clone git@github.com:abc/def.git
cd def

ตอนนี้สร้างสาขาการติดตาม:

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

จากนั้นหลังจากทำงานที่นั่นให้กดไปที่ github โดย

git push

3
git branch -t origin / trial # ไม่ต้องพิมพ์มาก :)
Dustin

สาขาที่ฉันต้องการติดตามเรียกว่า topic / fetch เมื่อฉันพยายามทำ $ git branch - track topic / fetch upstream / topic / fetch มันบอกว่าร้ายแรง: ไม่ใช่ชื่อวัตถุที่ถูกต้อง: 'upstream / topic / fetch'
ulu

1
@Dustin คำสั่งนั้นจะสร้าง 'ต้นทาง / การทดลอง' สาขาโลคัลที่ติดตามโลคัลมาสเตอร์ ฉันเดาว่ามันเป็นข้อผิดพลาดทั่วไป
PDug

1
@PDug% git checkout -t ต้นทาง / สาขาการทดลองตั้งค่าการทดลองเพื่อติดตามการทดลองสาขาระยะไกลจากจุดเริ่มต้นโดย rebasing เปลี่ยนไปใช้ 'การทดลอง' สาขาใหม่
Dustin

11

หากต้องการขยายการตอบกลับของ Kent หลังจากที่คุณทำการโคลนสาขาเดียวที่คุณมี (ไม่นับรีโมท) คือสาขาที่ใช้งานอยู่ในที่เก็บที่คุณโคลนมา - master ในกรณีของคุณ

ก่อนอื่นคุณจะต้องสร้างสาขาใหม่เพื่อติดตามสาขาทดลองระยะไกล:

$ git branch experimental origin/experimental

จากนั้นตรวจสอบ:

$ git checkout experimental

อย่างไรก็ตาม Kent ถูกต้อง - สองคำสั่งนี้สามารถรวมกันได้

$ git checkout -b experimental origin/experimental

3

ด้วย Git 2.23 (สิงหาคม 2019) คุณจะใช้git switchคำสั่ง

หากคุณมีสาขาระยะไกลที่มีชื่อเดียวกันสาขานั้นจะถูกติดตามโดยอัตโนมัติ:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.