ทำไมฉันสามารถเช็คเอาท์สาขาที่ถูกลบออกจาก GitHub ได้?


26

ในพื้นที่เก็บข้อมูล GitHub releaseของเราผู้ร่วมงานลบออกสาขาที่มีชื่อว่า แต่เมื่อผมทำงานในประเทศผมเคยได้รับสาขาออกgit checkout release releaseเดียวกันแม้ในขณะที่ฉันจะตรวจสอบจากสาขาอื่นที่ถูกลบreleaseสาขาด้วยและวิ่งอีกครั้งgit branch -D releasegit checkout release

มีบางอย่างที่ต้องแก้ไขในที่เก็บ GitHub หรือฉันจะแก้ไขบางอย่างในเครื่อง?


1
สิ่งที่ไม่git branch --remoteออกหลังจากทำงานgit fetch? คุณอาจต้องตัดด้วยgit fetch -pเพื่อลืมลบสาขาระยะไกล
Stephen Kitt

2
หากสาขานั้นถูกผลักไปที่ GitHub และคุณดึงหลังจากนั้นคุณก็มีสำเนาของสาขาด้วย พื้นที่เก็บข้อมูล git ทุกแห่งนั้นเสร็จสิ้นภายในและของตัวเองเว้นแต่ว่าคุณจะใช้โคลนตื้น ๆ หรืออะไรบางอย่าง
muru

@StephenKitt: ขอบคุณ เอาท์พุตgit branch --remote origin/releaseคุณหมายถึงการรันgit fetch -pโดยไม่มีอาร์กิวเมนต์เพิ่มเติมหรือไม่และจะตัดกิ่งระยะไกลที่ถูกลบทั้งหมดหรือไม่
ทิม

1
ใช่git fetch -pโดยไม่มีข้อโต้แย้งเพิ่มเติมจะตัดกิ่งระยะไกลที่ถูกลบทั้งหมด
Stephen Kitt

1
ยินดีต้อนรับสู่โลกของการควบคุมเวอร์ชันแบบกระจาย!
chrylis -on strike-

คำตอบ:


24

หลังจากลบสาขาในด้านรีโมตแล้วคุณอาจยังเห็นสาขารีโมตที่เรียกมาก่อนหน้านี้แบบโลคัลให้ดู:

$ git branch -a
[...]
release
remotes/origin/release
[...]

คุณได้ลบ "release" แต่ไม่ได้ "remotes / origin / release" ลบแบบนี้:

$ git branch -rd origin/release

หรือลบสาขาที่ดึงข้อมูลทั้งหมดซึ่งไม่มีอยู่ในฝั่งระยะไกลอีกต่อไป:

$ git remote prune origin 

ขอบคุณ ในgit branch -rd origin/releaseสิ่งที่ไม่-rหมายถึง? ไม่-dได้หมายความว่าเช่นเดียวกับ-D? สามารถ git branch -rd origin/releaseถูกแทนที่ด้วย git branch -d remotes/origin/release?
ทิม

@Tim: จากคู่มือ; -r: List or delete (if used with -d) the remote-tracking branches.; -D:Shortcut for --delete --force.
looper

ขอบคุณ สามารถgit branch -rd origin/releaseถูกแทนที่ด้วยgit branch -d remotes/origin/release?
ทิม

@ ไม่มีการ-rอ้างถึงสาขาระยะไกลมันเป็นสิ่งจำเป็น สาขาท้องถิ่นและระยะไกลจะถูกเก็บไว้ในไดเรกทอรีที่แตกต่างเปรียบเทียบ และls -l .git/refs/heads ls -l .git/refs/remotesนอกจากนี้คุณยังอาจมีสาขาในประเทศที่เรียกว่าซึ่งจะเป็นลบโดยไม่ต้องremotes/origin/release -rนี่อาจฟังดูสับสน แต่คุณสามารถเล่นสร้างสาขาที่มีชื่อแปลก ๆ และดูว่ามันมีลักษณะ.git/อย่างไร
rimeimeier

15

เมื่อสาขาถูกลบจากระยะไกลคุณจะต้องตัดพื้นที่เก็บข้อมูลในเครื่องของคุณ - วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ

git fetch -p

สิ่งนี้จะอัพเดตที่เก็บข้อมูลโลคัลของคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำกับที่เก็บรีโมต แต่ไม่มีการอัพเดตสาขาโลคัลของคุณ หลังจากรันสิ่งนี้

git branch --remote

จะไม่แสดงสาขาระยะไกลที่ถูกลบอีกต่อไป

git repository เสร็จสมบูรณ์ไม่ว่าจะเป็นระบบของคุณเองหรือบนเซิร์ฟเวอร์ ดังนั้นเมื่อคุณโคลนพื้นที่เก็บข้อมูลเป็นครั้งแรกคุณจะได้รับสำเนาที่สมบูรณ์และคอมไพล์ในพื้นที่ของคุณ“ รู้” เกี่ยวกับสาขาระยะไกลทั้งหมดเช่นเดียวกับสาขาท้องถิ่นของคุณ ข้อมูลนี้จะไม่ถูกซิงค์โดยอัตโนมัติดังนั้นเมื่อเพื่อนร่วมงานของคุณลบreleaseสาขาบนเซิร์ฟเวอร์ที่เก็บ git ในพื้นที่ของคุณจะไม่สูญเสียความคิดของreleaseสาขาระยะไกล การซิงค์กับgit fetchอัพเดตข้อมูลโลคัลทั้งหมดบนรีโมตกิ่งไม้เพื่อให้ตรงกับสถานะบนเซิร์ฟเวอร์ (พูดอย่างเคร่งครัดที่เก็บรีโมตไม่ว่าจะอยู่ที่ใด) แต่โดยไม่ลบข้อมูลโลคัลใด ๆ บนรีโมตสาขา การตัดด้วยgit fetch -p(หรือgit fetch --pruneหรือgit remote prune) ลบข้อมูลโลคัลบนรีโมตกิ่งที่ถูกลบ


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

มันคือการอัพเดททางไกลทั้งหมด ที่เก็บข้อมูล git ในท้องถิ่นของคุณแยกสาขาในพื้นที่ของคุณและสาขาระยะไกล แต่สาขาระยะไกลไม่ได้ซิงค์กับเซิร์ฟเวอร์อย่างน่าอัศจรรย์ - สาขาเหล่านั้นมีอยู่ในตัวเครื่องด้วยเช่นกัน การดึงข้อมูลซิงค์ที่เก็บในเครื่องของคุณกับที่เก็บระยะไกลและอัพเดทสถานะของสาขาระยะไกล โดยค่าเริ่มต้นถูกลบสาขาระยะไกลจะไม่ถูกลบออกจากข้อมูลท้องถิ่นในสาขาระยะไกล-p( --prune) บังคับว่า
Stephen Kitt

ขอบคุณ ทำไมไม่ลบreleaseสาขาโดยgit branch -D releaseก่อนที่จะgit checkout releaseทำให้git checkout releaseหยุดรับreleaseสาขา?
ทิม

1
เพราะgit checkout releaseจะสร้างสาขาใหม่โดยอัตโนมัติหากมีสาขาระยะไกลที่มีชื่อนั้น
Stephen Kitt

โดย "remote branch" คุณหมายถึงสาขาในที่เก็บในเครื่องของฉันหรือที่เก็บ Github หรือไม่? หากเดิมgit branch -D releaseลบreleaseสาขาในที่เก็บในเครื่องของฉันแล้ว หากหลังเพื่อนร่วมงานได้ลบreleaseสาขาใน GitHub; ดังนั้นฉันยังไม่แน่ใจว่าทำไม "จะสร้างสาขาใหม่โดยอัตโนมัติหากมีสาขาระยะไกลที่มีชื่อนั้น"
ทิม

3

ทิม: Git แจกจ่าย VCS ดังนั้นเมื่อคุณโคลน repo จากระยะไกลไปยังเครื่องของคุณมันจะทำการโคลนทุกอย่าง (ประวัติ) ดังนั้นเมื่อคุณโคลน repo ของคุณมันมีสาขาที่เรียกว่าปล่อย เนื่องจากเพื่อนร่วมงานของคุณลบสาขาย่อยออกจากระยะไกลจนกว่าคุณจะตัดgit fetch -pหรือลบสาขานั้นอย่างชัดเจนท้องถิ่นของคุณจะมีสาขานั้น


3
คำตอบนี้แตกต่างจากคำตอบที่มีอยู่แล้วอย่างไร
Stephen Rauch

1

อาจจะเล็กน้อยสักนิด แต่มุมมองของเว็บไซต์นี้อาจช่วยให้เข้าใจหัวข้อทั่วไปของการลบสาขา:

http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/

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

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(น่าเสียดายที่ "ดีย่อยได้" ใช้ไม่ได้กับการจัดรูปแบบของสคริปต์เอง)

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