ฉันจะสลับไปยังสาขาอื่นในคอมไพล์ได้อย่างไร?


222

บรรทัดใดในบรรทัดเหล่านี้ที่ถูกต้อง

git checkout 'another_branch'

หรือ

git checkout origin 'another_branch'

หรือ

git checkout origin/'another_branch'

และความแตกต่างระหว่างเส้นเหล่านี้คืออะไร?



32
git checkout [branch]สำหรับผู้ใช้ส่วนใหญ่ที่มาถึงคำถามนี้
JGallardo

คำตอบ:


225

หากanother_branchมีอยู่แล้วในพื้นที่และคุณไม่ได้อยู่ในสาขานี้ให้git checkout another_branchเปลี่ยนเป็นสาขา

ถ้าanother_branchไม่ได้อยู่ แต่origin/another_branchไม่แล้วเทียบเท่ากับgit checkout another_branch git checkout -b another_branch origin/another_branch; git branch -u origin/another_branchที่จะสร้างanother_branchจากorigin/another_branchชุดเป็นต้นน้ำของorigin/another_branchanother_branch

หากไม่มีอยู่git checkout another_branchจะส่งคืนข้อผิดพลาด

git checkout origin another_branchส่งคืนข้อผิดพลาดในกรณีส่วนใหญ่ ถ้าoriginเป็นการแก้ไขและanother_branchเป็นไฟล์มันจะตรวจสอบไฟล์ของการแก้ไขนั้น แต่ส่วนใหญ่อาจไม่ใช่สิ่งที่คุณคาดหวัง originส่วนใหญ่จะใช้ในgit fetch, git pullและgit pushเป็นระยะไกลนามแฝงของ URL ที่เก็บระยะไกล

git checkout origin/another_branchสำเร็จถ้าorigin/another_branchมีอยู่ มันนำไปสู่การอยู่ในสถานะ HEAD เดี่ยวไม่ใช่ในสาขาใด ๆ หากคุณทำคอมมิชชันใหม่คอมมิชชันใหม่จะไม่สามารถเข้าถึงได้จากสาขาที่มีอยู่และจะไม่มีการอัปเดตสาขาใด ๆ

อัปเดต :

ในฐานะที่เป็น 2.23.0 ได้รับการปล่อยตัวด้วยเรายังสามารถใช้git switchในการสร้างและสลับสาขา

หากfooมีอยู่ให้ลองเปลี่ยนเป็นfoo:

git switch foo

หากfooไม่มีอยู่และorigin/fooมีอยู่พยายามสร้างfooจากorigin/fooนั้นเปลี่ยนเป็นfoo:

git switch -c foo origin/foo
# or simply
git switch foo

โดยทั่วไปหากfooไม่มีอยู่ให้ลองสร้างfooจากการอ้างอิงหรือการคอมมิชชันที่รู้จักแล้วสลับไปที่foo:

git switch -c foo <ref>
git switch -c foo <commit>

หากเรารักษาที่เก็บใน Gitlab และ Github ในเวลาเดียวกันที่เก็บในเครื่องอาจมีรีโมทสองตัวเช่นoriginGitlab และgithubGithub ในกรณีนี้ที่เก็บได้และorigin/foo จะบ่นเพราะมันไม่ได้เป็นที่รู้จักกันจากการที่เตะ, หรือการสร้าง เราจำเป็นต้องระบุด้วยหรือตามความต้องการ ถ้าเราต้องการสร้างสาขาจากทั้งสองรีโมตเราควรใช้ชื่อที่แตกต่างสำหรับสาขาใหม่:github/foogit switch foofatal: invalid reference: fooorigin/foogithub/foofoogit switch -c foo origin/foogit switch -c foo github/foo

git switch -c gitlab_foo origin/foo
git switch -c github_foo github/foo

หากfooมีอยู่ให้ลองสร้าง / force-create fooจาก (หรือรีเซ็ตfooเป็น) อ้างอิงที่รู้จักหรือยอมรับแล้วเปลี่ยนเป็นfoo:

git switch -C foo <ref>
git switch -C foo <commit>

ซึ่งเทียบเท่ากับ:

git switch foo
git reset [<ref>|<commit>] --hard

ลองเปลี่ยนไปใช้ HEAD ที่แยกออกมาของการอ้างอิงที่รู้จักหรือการกระทำ:

git switch -d <ref>
git switch -d <commit>

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

git branch foo <ref>
git branch foo <commit>

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

11
นี่เป็นคำตอบที่ถูกต้อง แต่แสดงให้เห็นว่าระบบคอมไพล์มีความผิดพลาดในบรรทัดคำสั่งอย่างไร git checkout เพื่อเปลี่ยนสาขา?
ธ.ค.

3
@thang ด้วยรีลีส 2.23.0 นี่เป็นการแก้ไข: ตอนนี้คุณสามารถใช้git switchเพื่อเปลี่ยนเป็นสาขาได้แล้ว
legends2k

Switch ดูเหมือนจะใช้งานไม่ได้กับ git รุ่นนี้ ฉันจะใช้อะไรเพื่อสลับไปยังสาขาอื่นใน git รุ่นนี้ C: \ widget> git --version git เวอร์ชัน 2.11.0.windows.3 C: \ widget> git สวิตช์หลัก git: 'switch' ไม่ใช่คำสั่ง git ดู 'git --help' C: \ widget>
จอห์น

1
@John ใช้git checkoutแทนเวอร์ชันเก่าซึ่งใช้งานได้ในเวอร์ชันที่ทันสมัย
ElpieKay

66

สลับไปยังสาขาอื่นในคอมไพล์ คำตอบที่ตรงไปตรงมา

git-checkout - สลับสาขาหรือเรียกคืนไฟล์ทรีที่ใช้งานได้

git fetch origin         <----this will fetch the branch
git checkout branch_name <--- Switching the branch

ก่อนที่จะเปลี่ยนสาขาตรวจสอบให้แน่ใจว่าคุณไม่มีไฟล์ที่แก้ไขใด ๆ ในกรณีนี้คุณสามารถคอมมิทการเปลี่ยนแปลงหรือซ่อนมันได้


คำสั่งสุดท้ายทำให้ฉันเข้าสู่สถานะ HEAD เดี่ยว หมายความว่าเราไม่สามารถแก้ไขสาขาได้

2
สาขาที่คุณพยายามเช็คเอาต์ไม่ได้ถูกดึงข้อมูลจากนั้นคุณต้องดึงข้อมูลก่อนทำการเช็คเอาต์ คุณสามารถข้ามการดึงข้อมูลได้หากสาขานั้นล้าสมัยจากนั้นเพียงใช้ branchname ชำระเงิน git
danglingpointer

มันจะไม่เพียงพอที่จะทำการ "git pull" หลังจากเปลี่ยนมาใช้สาขาหรือไม่

ดึงยังตกลงดึงดึงและผสานเข้าด้วยกันในพื้นหลัง ฉันไม่เห็นความแตกต่าง
danglingpointer

17

[ git checkout "branch_name"]

เป็นอีกวิธีที่จะพูดว่า:

[ git checkout -b branch_name origin/branch_name]

ในกรณีที่ "branch_name" มีอยู่จากระยะไกลเท่านั้น

[ git checkout -b branch_name origin/branch_name] มีประโยชน์ในกรณีที่คุณมีหลายรีโมท

เกี่ยวกับ [ git checkout origin 'another_branch'] ฉันไม่แน่ใจว่าเป็นไปได้ AFAK คุณสามารถทำได้โดยใช้คำสั่ง "fetch" - [ git fetch origin 'another_branch']


ฉันรู้คำสั่ง "git checkout -b branchName" เพื่อสร้างสาขาอื่น นี่ไม่ใช่คำถาม!


6

สิ่งที่ใช้ได้ผลสำหรับฉันคือ:

เปลี่ยนเป็นสาขาที่ต้องการ:

git checkout -b BranchName

แล้วฉันก็ดึง "ปรมาจารย์" โดย:

git pull origin master

6

คำสั่งที่มีประโยชน์ในการทำงานในชีวิตประจำวัน:

git checkout -b "branchname" ->  creates new branch
git branch                   ->  lists all branches
git checkout "branchname"    ->  switches to your branch
git push origin "branchname" ->  Pushes to your branch
git add */filename           -> Stages *(All files) or by given file name
git commit -m "commit message" -> Commits staged files
git push                     -> Pushes to your current branch

5

หากคุณต้องการให้สาขาติดตามสาขาระยะไกลซึ่งเป็นการนำเข้ามากถ้าคุณกำลังจะทำการเปลี่ยนแปลงสาขาและดึงการเปลี่ยนแปลง ฯลฯ คุณต้องใช้เพิ่ม -t สำหรับการชำระเงินจริงเช่น: git checkout -t branchname


4

ตรวจสอบ: git branch -a

หากคุณได้รับเพียงสาขาเดียว จากนั้นทำตามขั้นตอนด้านล่าง

  • ขั้นตอนที่ 1 : git config --list
  • ขั้นตอนที่ 2 : git config --unset remote.origin.fetch
  • ขั้นตอนที่ 3: git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*

2
ฉันสงสัยว่าคำสั่งชุดนี้จะเปลี่ยนไปใช้สาขาอื่นได้อย่างไร

สิ่งนี้อาจเป็นประโยชน์เมื่อคุณทำโคลนตื้น (ใช้depthparam) ก่อนหน้านี้และตอนนี้สงสัยว่าทำไมคุณไม่สามารถดึงกิ่งระยะไกลอื่นได้error: pathspec 'another_branch' did not match any file(s) known to gitโดยใช้คำสั่งที่แนะนำข้างต้น มันไม่ใช่คำถามเดิมที่เกี่ยวกับ แต่มันสามารถช่วยให้คนอื่นเกาหัวของพวกเขาที่นี่
luciash d 'กำลัง

0

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

git switch [branchName] หรือ git checkout [branchName]

เช่นการพัฒนาสวิตช์
git หรือการชำระเงิน git พัฒนา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.