ผมย้ายงาน git จากปุ่มใน PHPStorm มาไว้ใน terminal
ที่ผ่านมางาน git เกือบทั้งหมดของผมอยู่ใน PHPStorm กด Cmd+G Cmd+B ก็มีหน้าต่าง branch ขึ้นมา พิมพ์ค้นชื่อ branch แล้วเลือก Checkout, Checkout and Rebase onto develop หรือ Checkout and Update ตอนเริ่มงานก็กด Update Project พอเสร็จก็ Commit แล้ว Push
ช่วงหลังผมเปิดหลาย branch ไว้พร้อมกัน แต่ละ branch อยู่คนละโฟลเดอร์ และสั่งงานใน terminal มากขึ้นเรื่อย ๆ เลยย้ายงาน git ตามมาด้วย ข้อดีที่เห็นชัดคือรู้ว่าแต่ละปุ่มสั่ง git ทำอะไรจริง ๆ พอมีอะไรแปลก ๆ ก็ตามได้ว่าเกิดจากคำสั่งไหน
โพสต์นี้รวมคำสั่งที่ใช้กันจริงในงานแต่ละวัน ไล่ตั้งแต่ดูสถานะจนเปิด PR ท้ายโพสต์มีตารางเทียบปุ่มใน PHPStorm กับคำสั่ง git ไว้ให้ ตัวอย่างทั้งหมดใช้ git 2.54
branch ในโปรเจกต์ที่ผมดูแลแบ่งแบบนี้
ตัวอย่างในโพสต์นี้มาจากโปรเจกต์ลูกค้าที่ผมดูแลอยู่ ซึ่งแบ่ง branch ไว้แบบนี้
developเป็น branch หลักที่รวมงานทุกชิ้น และเป็น default branch บน GitHubuatคือเวอร์ชันที่ deploy ให้ลูกค้าทดสอบmainคือ production- งานแต่ละชิ้นแตก branch สั้น ๆ ออกจาก develop ชื่อขึ้นต้นด้วยประเภทงาน เช่น
feat/งานใหม่fix/แก้บั๊กhotfix/แก้ด่วนบน productionchore/งานเก็บกวาดci/แก้ pipeline เสร็จแล้วเปิด Pull Request (PR) กลับเข้า develop

branch ของงานแต่ละชิ้นอยู่ไม่นาน merge เข้า develop แล้วก็ลบทิ้ง
ถ้าโปรเจกต์ของเรามีแค่ main คำสั่งในโพสต์นี้ก็ใช้ได้เหมือนกัน แค่อ่าน develop เป็น main
ดูสถานะก่อนทุกครั้งด้วย git status -sb
ก่อนสลับ branch ก่อน pull ก่อน commit สั่งคำสั่งนี้ก่อน
git status -sb
## develop...origin/develop [ahead 1, behind 2]
M app/Models/Order.php
?? app/Exports/OrderPdf.php
-s ย่อผลให้เหลือบรรทัดละไฟล์ -b เพิ่มบรรทัดแรกที่บอกว่าเราอยู่ branch ไหน และเทียบกับ branch ไหนบน remote
ahead 1เรามี commit ที่ยังไม่ได้ push 1 ตัวbehind 2บน remote มี commit ใหม่ 2 ตัวที่เรายังไม่มีMคือไฟล์ที่แก้ ถ้าอยู่คอลัมน์ซ้ายแปลว่าgit addแล้ว อยู่คอลัมน์ขวาแปลว่ายังไม่ได้ add??คือไฟล์ใหม่ที่ git ยังไม่ได้ติดตาม (untracked)
ตัวเลข ahead/behind เทียบกับ origin/develop ที่เก็บอยู่ในเครื่อง ซึ่งอัปเดตตอน fetch ครั้งล่าสุด อยากได้ตัวเลขล่าสุดจริง ๆ ต้อง git fetch ก่อน
ดู branch ทั้งหมดด้วย git branch -vv
git branch -vv
develop 484dda4 [origin/develop: ahead 1, behind 1] Add order status
* feat/export-pdf 08ea314 Export orders as PDF
+ fix/login-redirect 560407c (/Users/me/www/app-login) [origin/fix/login-redirect] Redirect after login
main 5dd3c7e [origin/main] Release 2.4
*คือ branch ที่โฟลเดอร์นี้อยู่+คือ branch ที่เปิดอยู่ใน worktree อื่น วงเล็บข้างหลังบอกว่าโฟลเดอร์ไหน (worktree อธิบายไว้ด้านล่าง)- วงเล็บเหลี่ยมคือ branch บน remote ที่ผูกไว้ (upstream) พร้อม ahead/behind ถ้าไม่มี แปลว่ายังไม่เคย push ด้วย
-u
ตัวเลือกอื่นที่ใช้บ่อย
# รวม branch บน remote ด้วย (remotes/origin/...)
git branch -a
# เรียงให้ branch ที่มี commit ล่าสุดขึ้นก่อน
git branch --sort=-committerdate
# ค้นจากชื่อ แทนช่องค้นหาใน popup
git branch -a --list '*login*'
โปรเจกต์ที่ทำมานานจะมี branch เยอะ --sort=-committerdate ช่วยได้มาก branch ที่เพิ่งทำอยู่จะขึ้นมาบนสุด ถ้าใช้บ่อย ตั้งเป็นค่าเริ่มต้นได้ด้วย git config --global branch.sort -committerdate
สลับ branch และสร้าง branch ใหม่ด้วย git switch
# ไป branch ที่มีอยู่แล้ว
git switch develop
# สร้าง branch ใหม่จากที่อยู่ตอนนี้ แล้วสลับไปเลย
git switch -c feat/export-pdf
# สร้างจาก develop ตัวล่าสุดบน remote โดยไม่ต้องสลับไป develop ก่อน
git fetch
git switch -c fix/login-redirect --no-track origin/develop
# กลับไป branch ก่อนหน้า
git switch -
ตัวที่สามต้องใส่ --no-track เพราะถ้าสร้าง branch จาก origin/develop ตรง ๆ git จะผูก branch ใหม่กับ origin/develop ให้เอง ทีนี้ git status จะเทียบ ahead/behind กับ develop และ git push ก็ไม่ยอม push เพราะชื่อ branch ไม่ตรงกัน
ถ้า branch นั้นมีบน remote แต่ยังไม่มีในเครื่อง เช่นเพื่อนเพิ่ง push มา สั่ง git switch fix/xxx ได้เลย git จะสร้าง branch ในเครื่องและผูกกับ origin/fix/xxx ให้
ถ้ามีไฟล์ที่แก้ค้างอยู่ git จะพาไฟล์พวกนั้นไปด้วยตอนสลับ แต่ถ้าไฟล์เดียวกันใน branch ปลายทางต่างจากที่นี่ git จะไม่ยอมสลับ ต้อง commit หรือ stash ก่อน
git switch กับ git restore แยกงานออกมาจาก git checkout ที่ทำทั้งสลับ branch และย้อนไฟล์ในคำสั่งเดียว checkout ยังใช้ได้เหมือนเดิม แต่คำสั่งใหม่อ่านแล้วรู้เลยว่าจะทำอะไร
| งาน | คำสั่งใหม่ | คำสั่งเดิม |
|---|---|---|
| สลับ branch | git switch develop |
git checkout develop |
| สร้าง branch | git switch -c feat/x |
git checkout -b feat/x |
| ทิ้งที่แก้ในไฟล์ | git restore app/Models/Order.php |
git checkout -- app/Models/Order.php |
| เอาไฟล์ออกจากที่ add ไว้ | git restore --staged app/Models/Order.php |
git reset HEAD app/Models/Order.php |
git restore ทิ้งงานที่แก้ไปเลย ไม่มีถังขยะให้กู้คืน ดู git diff ให้แน่ใจก่อนสั่ง
fetch แค่ดาวน์โหลด ส่วน pull ดาวน์โหลดแล้วรวมเข้า branch เรา
git fetchดาวน์โหลด commit ใหม่จาก remote มาเก็บไว้ที่origin/develop,origin/mainและ branch อื่นบน remote ในเครื่อง ไม่แตะไฟล์ที่เราทำอยู่ ไม่แตะ branch ของเรา สั่งเมื่อไรก็ได้git pullคือ fetch แล้วตามด้วยการรวมงานจาก remote เข้า branch ที่อยู่ตอนนี้
ปัญหาอยู่ที่คำว่ารวม ถ้าเรามี commit ที่ยังไม่ได้ push และบน remote ก็มี commit ใหม่ ประวัติจะแยกเป็นสองทาง git รุ่นใหม่ไม่เลือกให้ แต่หยุดแล้วถามว่าจะเอาแบบไหน
hint: You have divergent branches and need to specify how to reconcile them.
...
fatal: Need to specify how to reconcile divergent branches.
มีสามทางให้เลือก
# ย้าย commit ของเราไปต่อท้ายงานบน remote ประวัติเป็นเส้นตรง
git pull --rebase
# รวมแบบ merge ได้ merge commit เพิ่มมาหนึ่งตัว
git pull --no-rebase
# รับเฉพาะตอนที่ต่อท้ายได้ตรง ๆ ถ้าแยกทางให้หยุด
git pull --ff-only
ทางที่สองคือที่มาของ commit Merge remote-tracking branch 'origin/develop' into develop ที่เห็นใน log ของหลายโปรเจกต์ (ของผมเองก็มี) ไม่ได้ทำให้อะไรพัง แต่ log รกขึ้นโดยไม่ได้บอกอะไรเพิ่ม
แนะนำให้แยกแบบนี้
- อยู่บน branch งานของตัวเอง ใช้
--rebasecommit ของเรายังไม่มีใครเอาไปต่อ ย้ายได้ - อยู่บน develop หรือ main แค่อยากตามให้ทัน ใช้
--ff-onlyถ้า git หยุด แปลว่าเราเผลอ commit ลง develop ตรง ๆ จะได้รู้ตัวก่อน push
ถ้าไม่อยากพิมพ์ทุกครั้ง ตั้ง git config --global pull.rebase true ไว้ได้ บน develop ที่ไม่มี commit ของเราค้างอยู่ pull ก็แค่เลื่อนไปข้างหน้าเหมือน --ff-only
อัปเดต develop โดยไม่ต้องสลับไป
git fetch origin develop:develop
คำสั่งนี้เอา origin/develop มาอัปเดต develop ในเครื่องให้เลย ทั้งที่เรายังอยู่บน branch งาน git ยอมทำเฉพาะตอนที่เลื่อนไปข้างหน้าได้ตรง ๆ (fast-forward) ถ้า develop ในเครื่องมี commit ที่ remote ไม่มี git จะปฏิเสธ (! [rejected] develop -> develop (non-fast-forward)) และถ้า develop เปิดอยู่ใน worktree อื่น git ก็ไม่ยอมเหมือนกัน ต้องไป pull ในโฟลเดอร์นั้นแทน
commit ทีละเรื่องด้วย git add -p
git add -p
git diff --staged
git commit -m "Export orders as PDF"
git add -p ไล่ถามทีละก้อนที่แก้ว่าจะเอาเข้า commit นี้ไหม กด y เอา n ข้าม s แบ่งก้อนให้เล็กลง q เลิก ใช้ตอนที่แก้หลายเรื่องปนกันอยู่ แล้วอยากแยกเป็นหลาย commit ส่วน git diff --staged ให้ดูอีกรอบว่าจะ commit อะไรไปบ้าง
ไฟล์ใหม่ที่ git ยังไม่ได้ติดตาม add -p จะไม่เห็น ต้อง git add ชื่อไฟล์นั้นเองก่อน
push ครั้งแรกใส่ -u ส่วน push ทับใช้ --force-with-lease
git push -u origin feat/export-pdf
-u ผูก branch ในเครื่องกับ origin/feat/export-pdf ครั้งต่อไปพิมพ์แค่ git push หรือ git pull ได้เลย และ git status ก็บอก ahead/behind ให้ ถ้าไม่อยากพิมพ์ชื่อ branch ใช้ git push -u origin HEAD แทน หรือตั้ง git config --global push.autoSetupRemote true ไว้ แล้ว git push เฉย ๆ ครั้งแรกจะผูกให้เอง
หลัง rebase branch ที่เคย push ไปแล้ว ประวัติในเครื่องกับบน remote จะไม่ตรงกัน git push ธรรมดาจะไม่ยอม ต้อง push ทับ
git push --force-with-lease
--force เขียนทับทุกอย่างบน remote ถ้าระหว่างนั้นเพื่อน push งานเข้ามา งานนั้นหายไปเงียบ ๆ ส่วน --force-with-lease เช็กก่อนว่า branch บน remote ยังอยู่ตรงที่เราเห็นตอน fetch ครั้งล่าสุด ถ้ามีคน push เพิ่มเข้ามา git จะปฏิเสธ
ถ้าใช้ IDE ที่ fetch ให้อัตโนมัติ ตัวเลขที่ lease ใช้เทียบอาจขยับตามไปแล้วโดยที่เรายังไม่เคยเห็นงานใหม่นั้น เพิ่ม --force-if-includes อีกตัว git จะเช็กด้วยว่างานบน remote อยู่ในประวัติของเราแล้ว
ตาม develop ให้ทัน ใช้ได้ทั้ง merge และ rebase
เรื่องที่เจอบ่อยที่สุด เราแตก feat/export-pdf ออกจาก develop เมื่อสามวันก่อน ระหว่างนั้นมี PR อื่น merge เข้า develop ไปหลายตัว ก่อนเปิด PR เราอยากให้ branch ของเรามีงานล่าสุดของ develop ด้วย จะได้ทดสอบกับโค้ดชุดเดียวกับที่จะขึ้นจริง และแก้ conflict ให้จบในฝั่งเรา
git fetch
git merge origin/develop
git fetch
git rebase origin/develop
- merge เอางานจาก develop มารวม ได้ merge commit เพิ่มหนึ่งตัว (
Merge remote-tracking branch 'origin/develop' into feat/export-pdf) commit เดิมของเราไม่เปลี่ยน push ต่อได้ตามปกติ ใช้กับ branch ที่มีคนอื่นทำด้วยได้ - rebase ย้าย commit ของเราไปต่อท้าย develop ตัวล่าสุด ประวัติเป็นเส้นตรงอ่านง่าย แต่ commit ทุกตัวของเราได้ hash ใหม่ ถ้าเคย push ไปแล้ว ต้องตามด้วย
git push --force-with-lease
ทั้งสองแบบใช้ origin/develop ไม่ใช่ develop เพราะ develop ในเครื่องอาจยังเก่าอยู่ถ้าไม่ได้ pull ไว้ ส่วนจะเลือกแบบไหน ยึดง่าย ๆ ว่า rebase ได้เฉพาะ branch ที่ทำคนเดียว ถ้ามีคนอื่นเอา branch นี้ไปทำต่อแล้ว ใช้ merge
ปุ่ม Checkout and Rebase onto develop ใน PHPStorm ตรงกับคำสั่งนี้ git จะสลับไป feat/export-pdf แล้ว rebase ลงบน develop ในคำสั่งเดียว
git rebase develop feat/export-pdf
ทางกลับกันก็ใช้วิธีเดียวกัน บางครั้งมีงานแก้บน uat ที่ develop ยังไม่มี ก็ merge uat กลับเข้า develop
git switch develop
git pull --ff-only
git merge origin/uat
git push
conflict แก้ให้จบ หรือ abort ถอยกลับก็ได้
ถ้าสองฝั่งแก้บรรทัดเดียวกัน git จะหยุดกลางทาง
CONFLICT (content): Merge conflict in app/Models/Order.php
git status บอกว่าไฟล์ไหนชน (both modified) ในไฟล์จะมีเครื่องหมายแบบนี้
<<<<<<< HEAD
protected $fillable = ['number', 'total', 'pdf_path'];
=======
protected $fillable = ['number', 'total', 'status'];
>>>>>>> origin/develop
ตอน merge ฝั่ง HEAD คืองานของเรา แต่ตอน rebase จะสลับกัน ฝั่ง HEAD คืองานบน develop ส่วนงานของเราอยู่ด้านล่าง เพราะ rebase เริ่มจาก develop แล้วค่อยเอา commit ของเราไปวางทีละตัว
แก้ไฟล์ให้เป็นอย่างที่ควรเป็น ลบเครื่องหมายออก แล้วบอก git ให้ไปต่อ
git add app/Models/Order.php
git merge --continue
git add app/Models/Order.php
git rebase --continue
ถ้าดูแล้วยังไม่พร้อมแก้ ถอยกลับไปเหมือนไม่เคยสั่งได้
git merge --abort
git rebase --abort
conflict ใหญ่ ๆ จะเปิด PHPStorm แก้ก็ได้ ไปที่ Git → Resolve Conflicts… หน้าต่างสามช่องเดิมจะขึ้นมา แม้ merge นั้นจะสั่งจาก terminal ก็ตาม
เก็บงานค้างไว้ก่อนด้วย git stash
กำลังแก้อยู่ครึ่ง ๆ แล้วมีงานด่วนต้องสลับ branch
git stash push -u -m "export pdf ครึ่งทาง"
git switch develop
# ทำงานด่วนให้เสร็จ
git switch feat/export-pdf
git stash pop
-uเก็บไฟล์ใหม่ที่ยังไม่ได้ add ไปด้วย ถ้าไม่ใส่ ไฟล์พวกนั้นจะค้างอยู่ในโฟลเดอร์แล้วตามเราไปอีก branchgit stash listดูของที่เก็บไว้ทั้งหมดgit stash popเอาตัวล่าสุดกลับมาแล้วลบออกจาก list ถ้าเอากลับมาแล้วชน git จะเก็บตัวนั้นไว้ใน list ให้
stash เหมาะกับงานแทรกสั้น ๆ ถ้างานด่วนใช้เวลาครึ่งวัน เปิด worktree แยกสะดวกกว่า
ดูประวัติด้วย git log --oneline --graph
git log --oneline --graph -10
* 9c1e2d4 (HEAD -> develop, origin/develop) Merge pull request #212 from example/fix/login-redirect
|\
| * 3f1c2aa Redirect to the intended URL after login
|/
* 67f570a Merge pull request #211 from example/feat/export-pdf
|\
| * 21de16e Export orders as PDF
|/
* 5dd3c7e Bump dependencies
--oneline ย่อเหลือบรรทัดละ commit --graph วาดเส้นให้เห็นว่า branch แยกออกไปและ merge กลับมาตรงไหน
# commit ใน branch เราที่ develop ยังไม่มี คือสิ่งที่ PR จะเอาเข้าไป
git log --oneline origin/develop..HEAD
# commit ใหม่บน develop ที่เรายังไม่มี
git log --oneline HEAD..origin/develop
# ประวัติของไฟล์เดียว
git log --oneline -- app/Models/Order.php
ถ้าพิมพ์บ่อย ตั้งเป็นคำสั่งย่อ (alias) ได้ด้วย git config --global alias.lg "log --oneline --graph" แล้วสั่ง git lg
ลบ branch ที่ merge แล้ว ทั้งในเครื่องและบน remote
# ดูว่า branch ไหน merge เข้า develop แล้ว
git branch --merged origin/develop
# ลบ branch ในเครื่อง
git branch -d fix/login-redirect
# ล้าง origin/... ของ branch ที่บน GitHub ลบไปแล้ว
git fetch --prune
-dลบให้เฉพาะ branch ที่ merge แล้ว ถ้ายังไม่ merge git จะไม่ยอม ส่วน-Dลบทันทีไม่ถาม ใช้เมื่อแน่ใจ- ถ้า PR merge ด้วย Squash and merge งานของเราบน develop จะกลายเป็น commit ใหม่ git จึงมองว่า branch ยังไม่ merge และ
-dไม่ยอมลบ ให้เช็กบน GitHub ว่า PR merge แล้วจริง ค่อยใช้-D - branch ที่เปิดอยู่ใน worktree ไหนสักที่ลบไม่ได้ ต้องเอา worktree นั้นออกก่อน
- ตั้ง
git config --global fetch.prune trueไว้ fetch ทุกครั้งจะล้างให้เอง
ฝั่ง GitHub ลบ branch ด้วย git push origin --delete fix/login-redirect หรือเปิดให้ลบ branch อัตโนมัติหลัง merge PR ในหน้า settings ของ repository ไว้เลยก็ได้
เปิดหลาย branch พร้อมกันด้วย git worktree
ปกติ repository หนึ่งมีโฟลเดอร์ทำงาน (working tree) โฟลเดอร์เดียว อยู่ได้ทีละ branch จะไปทำงานอื่นต้อง commit หรือ stash ก่อนแล้วค่อยสลับ git worktree เพิ่มโฟลเดอร์ทำงานได้อีกหลายโฟลเดอร์ ทุกโฟลเดอร์ใช้ .git ชุดเดียวกัน commit ที่ทำในโฟลเดอร์หนึ่ง อีกโฟลเดอร์เห็นทันทีโดยไม่ต้อง clone ใหม่หรือ fetch

แต่ละโฟลเดอร์อยู่คนละ branch แต่ใช้ประวัติชุดเดียวกัน
ช่วงนี้ผมให้ AI agent หลายตัวทำงานคู่กัน ตัวหนึ่งทำ feature อีกตัวแก้บั๊ก แต่ละตัวทำงานใน worktree ของตัวเอง ไฟล์ไม่ปนกัน และไม่ต้องรอกันสลับ branch
# สร้าง branch ใหม่จาก develop ล่าสุด ในโฟลเดอร์ใหม่
git fetch
git worktree add --no-track -b fix/login-redirect ../app-login origin/develop
# เปิด branch ที่มีอยู่แล้วในโฟลเดอร์ใหม่
git worktree add ../app-export-pdf feat/export-pdf
# ดูว่ามี worktree ไหนบ้าง อยู่ branch อะไร
git worktree list
# เลิกใช้ ลบโฟลเดอร์และเอาออกจากรายการ
git worktree remove ../app-login
git worktree list บอกทุกโฟลเดอร์พร้อม branch ของมัน และใน git branch ก็จะเห็น branch พวกนี้มีเครื่องหมาย + นำหน้า ถ้าลบโฟลเดอร์ทิ้งเองโดยไม่ผ่าน remove ให้สั่ง git worktree prune ล้างรายการที่ค้าง
branch เดียวเปิดได้ที่เดียว
ถ้าพยายามสลับไป branch ที่เปิดอยู่ในอีก worktree git จะไม่ยอม
fatal: 'fix/login-redirect' is already used by worktree at '/Users/me/www/app-login'
branch เป็นแค่ป้ายที่ชี้ไปที่ commit ล่าสุด ถ้าสองโฟลเดอร์อยู่ branch เดียวกัน พอ commit ในโฟลเดอร์หนึ่ง ป้ายก็เลื่อนไป แต่อีกโฟลเดอร์ยังมีไฟล์ชุดเก่า git status ในโฟลเดอร์นั้นจะแสดงเหมือนเราแก้งานใหม่ย้อนกลับทุกไฟล์ git เลยกันไว้ตั้งแต่ต้น ทางแก้คือไปทำงานในโฟลเดอร์ที่เปิด branch นั้นอยู่แล้ว หรือถ้าแค่อยากเปิดดูโค้ด ใช้ git worktree add --detach ../app-peek fix/login-redirect ซึ่งเปิด commit นั้นโดยไม่ผูกกับ branch
worktree ใหม่มีเฉพาะไฟล์ที่อยู่ใน git สำหรับโปรเจกต์ Laravel ต้อง composer install, npm install และสร้าง .env ในโฟลเดอร์ใหม่เอง ถ้า .env ชี้ไปฐานข้อมูลเดียวกัน migration ของ branch หนึ่งก็มีผลกับอีก branch ด้วย
เปิด PR จาก terminal ด้วย gh
GitHub CLI หรือ gh จัดการ PR ได้จาก terminal ติดตั้งแล้วสั่ง gh auth login ครั้งเดียว (gh ยังเก็บ token ให้ git ใช้ตอน push ได้ด้วย อ่านเพิ่มที่ให้ git จำรหัสผ่านยังไง)
# push แล้วเปิด PR จาก branch นี้เข้า develop
git push -u origin HEAD
gh pr create --base develop --fill
# ดู PR ของ branch นี้ หรือเปิดในเบราว์เซอร์
gh pr view
gh pr view --web
# ดึง PR ของเพื่อนมารีวิวในเครื่อง
gh pr checkout 212
# PR ที่เราเปิดไว้ และที่รอเรารีวิว
gh pr status
--fillเอาข้อความ commit มาเป็นชื่อและรายละเอียดของ PR ถ้าไม่ใส่ gh จะถามทีละช่อง--base developไม่ต้องใส่ก็ได้ถ้า develop เป็น default branch ของ repository อยู่แล้วgh pr checkoutสลับ branch ในโฟลเดอร์ที่อยู่ตอนนี้ ถ้าไม่อยากทิ้งงานที่ทำค้าง เปิด worktree ใหม่แล้วสั่งในโฟลเดอร์นั้นแทน
ปุ่มใน PHPStorm ตรงกับคำสั่งไหน
| ใน PHPStorm | คำสั่ง git |
|---|---|
| Cmd+G Cmd+B พิมพ์ค้นชื่อ branch | git branch -a --list '*login*' |
| Checkout | git switch fix/login-redirect |
| New Branch from develop | git switch -c feat/export-pdf develop |
| Checkout and Rebase onto develop | git rebase develop feat/export-pdf |
| Checkout and Update | git switch develop แล้ว git pull --ff-only |
| Update (branch ที่ไม่ได้อยู่) | git fetch origin develop:develop |
| Update Project | git pull --rebase หรือ git pull --no-rebase ตามที่เลือกไว้ในหน้าต่าง Update |
| Merge develop into current | git merge origin/develop |
| Commit | git add -p แล้ว git commit |
| Push | git push (ครั้งแรก git push -u origin HEAD) |
| Force Push | git push --force-with-lease |
| Rollback | git restore app/Models/Order.php |
| Shelve / Stash | git stash push -u |
| Delete (branch) | git branch -d fix/login-redirect |
| Git → Log | git log --oneline --graph |
โพสต์หน้าจะเล่าถึงเครื่องมือเล็ก ๆ ใน terminal ที่ผมทำไว้ช่วยงาน git ชุดนี้ครับ






