/git-new-branch — สร้าง local branch สำหรับเริ่มงาน ticket ใหม่
Sibling ของ [[git-clone-grouplife]] และ [[git-clone]] (ใช้ clone repo ลงเครื่องก่อน
หน้านี้แล้ว ไม่ว่าจะเป็น App ในกลุ่ม delphi group-insurance หรือ repo ทั่วไปจาก
GitBlit) และอยู่คนละช่วงกับ [[git-merge-master]] (ทำตอนจบงานเพื่อ merge เข้า
master) — skill นี้
ทำตอนเริ่มงาน: เตรียม local branch ชื่อ ticket/<N> ที่แตกออกมาจาก base branch
ล่าสุดจาก origin (ปกติคือ master) ให้พร้อมแก้โค้ด
เหตุผลที่ต้องมี: [[git-merge-master]] สมมติไว้เลยว่า current branch ตอนจะ merge
ต้องชื่อ ticket/<N> — ถ้าไม่มีขั้นตอนสร้าง branch นี้ไว้ก่อน ผู้ใช้เสี่ยงแก้โค้ดค้างอยู่
บน local master โดยไม่รู้ตัว แล้วไปเจอปัญหาตอน merge (local master มี commit ค้างที่
[[git-merge-master]] จะไม่ยอม reset ทับให้เงียบ ๆ)
ลำดับก่อนหลังที่ถูกต้อง — ต้องเปิด ticket บน remote ก่อนเสมอ: เลข ticket ของ
Gitblit เป็นเลข auto-increment ที่ฝั่ง server เป็นคนกำหนดให้ตอนสร้าง ticket จริง —
ถ้าสร้าง local branch ด้วยเลขที่เดา/จองไว้ล่วงหน้าเองก่อนที่ ticket จะถูกเปิดจริงบน
remote จะเสี่ยงชนกับเลขที่คนอื่นเปิด ticket คนละใบพร้อม ๆ กัน (race condition ฝั่ง
server) ดังนั้นลำดับที่ถูกต้องคือ [[git-new-ticket]] ก่อน (เปิด ticket บน Gitblit
จริง ได้เลข <N> ที่ server ยืนยันแล้ว) แล้วค่อยเรียก skill นี้ เอาเลข <N> จริง
นั้นมาใช้ตั้งชื่อ local branch — ไม่ใช่กลับกัน
กฎเหล็ก: ห้ามเดา ticket number หรือ base branch เอง ต้องได้จาก user ตรง ๆ และ
ห้าม checkout -b ทับ/ลบ branch เดิมที่มีอยู่แล้วโดยไม่ถามก่อนเสมอ — ถ้า user ยังไม่มี
เลข ticket จริง (ยังไม่ได้เปิดผ่าน [[git-new-ticket]]) ให้แนะนำให้ไปเปิด ticket ก่อน
อย่ารับเลขที่ user "คิดจะใช้" หรือเลขที่เดาไว้มาสร้าง branch ให้เด็ดขาด
Step 0: Init
date "+🕐 %H:%M %Z (%A %d %B %Y)"
Step 1 — รับข้อมูล + ตรวจสอบ path local
รับ argument ตามลำดับ <Path code ในเครื่อง> <เลข ticket> [base branch] — ข้อไหนขาด
ให้ถามเพิ่ม ห้ามเดาแทน:
- Path code ในเครื่อง — path ที่ clone ไว้แล้ว (ปกติมาจาก [[git-clone-grouplife]]
หรือ [[git-clone]] ก่อนหน้านี้ในงานเดียวกัน แล้วแต่ว่า repo นี้เป็น App กลุ่ม
delphi group-insurance หรือ repo ทั่วไป) ต้องตรวจสอบก่อนแตะอะไรเสมอ:
ถ้า path ไม่มีอยู่จริง หรือไม่ใช่ git repo จริง ให้หยุดแจ้ง user ทันที ห้ามเดาต่อgit -C "<path>" rev-parse --is-inside-work-tree git -C "<path>" remote get-url origin git -C "<path>" branch --show-current - เลข ticket (Gitblit) ที่จะเริ่มงาน (เช่น
15) — ต้องเป็นเลขจาก ticket ที่เปิด บน remote จริงแล้วเท่านั้น (ผ่าน [[git-new-ticket]]) ห้ามรับเลขที่ user เดา/จองไว้ ล่วงหน้าเอง (เสี่ยงชนกับ ticket ที่คนอื่นเปิดพร้อมกัน เพราะเลขนี้ server เป็นคน auto-increment ให้ ไม่ใช่เลขที่เลือกเองได้) ถ้า user ยังไม่มีเลข ticket จริง ให้ถาม ก่อนว่าเปิด ticket ผ่าน [[git-new-ticket]] แล้วหรือยัง ถ้ายัง ให้แนะนำไปเปิดก่อน — ใช้เลขที่ได้มาตั้งชื่อ branch เป็นticket/<N>ตาม convention เดียวกับ [[reference_claim_dataextraction_gitblit]] - Base branch — default
masterถ้า user ไม่ได้ระบุ (ตรงกับ convention ที่ [[git-merge-master]] ใช้อยู่แล้ว) ถามยืนยันเฉพาะถ้า user ต้องการ base อื่น
Step 2 — เช็ค working tree สะอาดก่อนสร้าง branch
git -C "<path>" status --porcelain
- ถ้ามีผลลัพธ์ (มีไฟล์แก้ไข/untracked ค้างอยู่) ให้เตือน user ว่า
checkout -bจะพา ไฟล์ที่แก้ค้างเหล่านี้ติดไปอยู่บน branch ใหม่ด้วย (ไม่ใช่การ commit ทับ แค่ working tree จะข้ามไปด้วย) — ถามยืนยันว่าตั้งใจแบบนี้จริงไหม หรืออยากจัดการ (commit/stash) ไฟล์เหล่านั้นก่อน ห้ามตัดสินใจแทน - ถ้าสะอาดอยู่แล้ว ข้ามไป Step 3 ได้เลย
Step 3 — เช็คว่า local branch ticket/<N> มีอยู่แล้วหรือยัง
git -C "<path>" show-ref --verify --quiet refs/heads/ticket/<N>
ถ้ามีอยู่แล้ว (exit code 0) ห้ามเขียนทับ/ลบเองโดยไม่ถาม — แจ้ง user แล้วให้เลือก:
- Checkout branch เดิมที่มีอยู่ (ไม่สร้างใหม่ ข้าม Step 4-5 ไปแค่
git -C "<path>" checkout ticket/<N>) - ลบของเดิมแล้วสร้างใหม่จาก base ล่าสุด (เฉพาะถ้า user ยืนยันว่าของเดิมไม่ต้องการ
แล้ว — เช็ค
git -C "<path>" log origin/ticket/<N>..ticket/<N>ก่อนด้วยว่ามี commit ค้างที่ยังไม่ push หรือเปล่า ถ้ามีให้เตือนซ้ำก่อนลบจริง) - ยกเลิก
ถ้ายังไม่มี (exit code ไม่ใช่ 0) ไปต่อ Step 4 ปกติ
Step 4 — Fetch base branch ล่าสุดจาก origin
git -C "<path>" fetch origin <base branch>
ถ้า fetch fail (network/auth) ให้รายงาน error กับ user ตรง ๆ ห้ามลองซ้ำเดา ๆ เอง — ถ้า
เป็น host ที่รู้จักว่าใช้ password auth ผ่าน SSH (เช่น 10.100.2.187:29418) ใช้
credential จาก [[reference_gitblit_credentials]] แทนการเดา (password rotate รายเดือน
ถ้า auth fail ให้ถาม user รหัสใหม่)
Step 5 — สร้าง local branch ticket/<N> จาก base ล่าสุด
git -C "<path>" checkout -b ticket/<N> "origin/<base branch>"
- Branch ใหม่นี้เป็น local-only ทันทีหลังสร้าง — ยังไม่มีอยู่บน remote จนกว่าจะ
push ครั้งแรก (ผ่าน [[git-commit-push]] โดยระบุ target branch เป็น
ticket/<N>) - ถ้า checkout fail (เช่น base branch ไม่มีจริงบน origin) ให้รายงาน error ตรง ๆ
Step 6 — สรุปผล + บอกขั้นตอนถัดไป
git -C "<path>" log -1 --oneline
git -C "<path>" branch --show-current
สรุปให้ user: สร้าง branch ticket/<N> จาก origin/<base branch> (commit ล่าสุดคือ
อะไร) พร้อม path ที่ใช้งานอยู่ แล้วบอกขั้นตอนถัดไปตามลำดับงานปกติ:
- แก้โค้ดใน path นี้ตามปกติ
- เมื่อพร้อม commit+push ใช้ [[git-commit-push]] โดยระบุ target branch =
ticket/<N> - เมื่อพร้อม merge เข้า master ใช้ [[git-merge-master]] (ต้องอยู่บน branch
ticket/<N>นี้ตอนเรียก)
Notes
- Skill นี้จบงานที่สร้าง local branch เท่านั้น — ไม่ push, ไม่แตะ remote เลย
- ไม่ log time หรือ comment กลับ Redmine อัตโนมัติ
- ถ้า repo ไหนไม่ได้ใช้ pattern
ticket/Nแบบ Gitblit skill นี้ไม่รองรับ — แจ้ง user แทนที่จะเดาชื่อ branch อื่น
ARGUMENTS: $ARGUMENTS