<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>git &amp;mdash; tnpl.me</title>
    <link>https://tnpl.me/tag:git</link>
    <description></description>
    <pubDate>Wed, 22 Apr 2026 10:43:47 +0000</pubDate>
    <item>
      <title>Managing Pull Request</title>
      <link>https://tnpl.me/managing-pull-request</link>
      <description>&lt;![CDATA[ผมพบว่ามีหลายวิธีที่จะ manage source code และ manage pull request (หรือ merge request) แต่ผมยังไม่เจอว่ามีใครเขียนรวบรวมไว้&#xA;&#xA;ผมจะ focus ในเรื่องที่เกี่ยวกับ การ Approve code การ Run CI และการ Merge code&#xA;&#xA;การ Approve code&#xA;&#xA;การ review สามารถทำได้ทั้ง offline และ online เช่น&#xA;&#xA;review offline แบบ pair programming&#xA;review offline แบบ mob programming&#xA;review online ผ่านระบบ เช่น GitHub, GitLab&#xA;&#xA;กฎเกณฑ์ในการ approve code มีหลายแบบที่สามารถเลือกใช้ได้ ไม่ว่าจะ review แบบ offline หรือ online เท่าที่ผมรู้จักมีประมาณนี้&#xA;&#xA;!--more--&#xA;&#xA;1. No approval&#xA;&#xA;ใครก็ได้สามารถ merge code ได้ทันที ไม่ต้องมีการ approve&#xA;&#xA;ปกติจะใช้กับการขึ้น project ใหม่ในช่วงเริ่มต้น หรือทีมที่ยังไม่มี process ชัดเจน&#xA;&#xA;บางครั้งถ้าคนทำ project มีประสบการณ์สูงอยู่แล้วก็ไม่จำเป็นต้องรีวิวได้เช่นกัน&#xA;&#xA;process นี้จะเน้นความรวดเร็วในการ contribute&#xA;&#xA;2. Anyone can approve&#xA;&#xA;ในแบบนี้คือใครก็สามารถ approve code ได้ โดยปกติทีมจะตกลงกันว่าต้องมี approve กี่คนขั้นต่ำ เช่น 2 คน&#xA;&#xA;เหมาะกับทีมที่มี engineer ระดับ senior ขึ้นไปจำนวนไม่เยอะ สามารถลดงานของ senior ได้&#xA;&#xA;ปัญหาคือ engineer ระดับ junior รีวิวด้วยกัน อาจจะไม่เห็นปัญหายากๆ ที่ซ่อนอยู่&#xA;&#xA;3. Senior can approve&#xA;&#xA;ให้ engineer ระดับ senior ขึ้นไป approve เท่านั้น สามารถตกลงจำนวนคน approve ขั้นต่ำได้ด้วย เช่น 2 คน แต่ส่วนมากแล้วสามารถใช้ senior 1 คน approve ได้ทันที&#xA;&#xA;เหมาะกับกรณี senior approve code ของ junior ตัว code จะมีมาตรฐานดีขึ้น ปัญหาน้อยลง และเกิดการ coaching junior ผ่าน code review&#xA;&#xA;ข้อเสียคือ senior แต่ละคนอาจมี code style หรือมี vision เรื่อง code ไม่เหมือนกัน ทำให้ดูแล project ในระยะยาวได้ยากกว่า&#xA;&#xA;4. Code owner can approve&#xA;&#xA;assign owner ให้ในแต่ละ repo หรือละเอียดกว่านั้น เช่น ระดับ directory และกำหนดให้ code owner approve ได้เท่านั้น สามารถกำหนดจำนวนคน approve ขั้นต่ำได้ด้วย เช่น 2 คน แต่ส่วนมากแล้วสามารถใช้ code owner 1 คน approve ได้ทันที ทั้งนี้อาจจะให้ code owner เป็น engineer level senior ขึ้นไปก็ได้ หรือจะให้ junior เป็นก็ได้&#xA;&#xA;เหมาะกับการดูแล code ในระยะยาวให้มี code style ที่ consistent สามารถดูแล technical debt ได้สะดวกกว่า&#xA;&#xA;ข้อเสียคือต้อง manage code owner อยู่ตลอด และต้องทำ knowledge sharing ระหว่าง owner หาก repo นั้นมี owner หลายคน&#xA;&#xA;การ run CI&#xA;&#xA;เมื่อมีการ submit code เข้ามา ไม่ว่าจะเป็นแบบ offline (เรียกไป review) หรือ online (ผ่าน pull request/merge request) โดยปกติจะมีการ run automated test เกิดขึ้นด้วย จังหวะในการ run automated test มีหลายแบบ&#xA;&#xA;โดยปกติ engineer จะต้อง run unit test ในเครื่องตัวเองให้ผ่านก่อนถึงจะ push code ขึ้นไปได้ บางครั้งอาจใช้ git hook เพื่อบังคับ run unit test ก่อน push code ได้อีกด้วย ป้องกันการลืม&#xA;&#xA;1. full test@CI pipeline&#xA;&#xA;เมื่อ engineer push code ขึ้นไปใน feature branch หรือ branch ชั่วคราวแล้ว ตัว CI จะ run full test เมื่อ run จบจะบันทึกผลลัพธ์เอาไว้&#xA;&#xA;ระบบ CI จะต้องมี dependency ครบถ้วนก่อน run เช่น database, message queue เป็นต้น&#xA;&#xA;2. quick test@CI pipeline&#xA;&#xA;เมื่อ engineer push code ขึ้นไปใน feature branch หรือ branch ชั่วคราวแล้ว ตัว CI จะ run test เฉพาะ test ที่ทำงานเร็ว เช่น unit test เมื่อ run จบจะบันทึกผลลัพธ์เอาไว้&#xA;&#xA;ระบบ CI ไม่จำเป็นต้องมี dependency ครบถ้วน ทำให้ง่ายต่อการจัดการและไม่เปลือง cost server&#xA;&#xA;3. full test after merge&#xA;&#xA;หลังจาก merge code เข้า branch หลักแล้ว CI จะ build และ deploy code เข้า environment สักตัวหนึ่ง อาจจะเป็น env ที่สร้างใหม่ หรือเป็น env หลักที่ engineer ใช้ทดสอบก็ได้ โดย CI จะ run full test และบันทึกผลลัพธ์เอาไว้ โดยปกติจะใช้งานคู่กับข้อ 2.&#xA;&#xA;ข้อดีคือ dependency ต่างๆ จะเป็นชุดเดียวกัน (หรือใกล้เคียงกับ) env ที่ engineer ใช้ เมื่อเกิดปัญหาสามารถไป investigate ใน env ได้&#xA;&#xA;การ merge code&#xA;&#xA;หลังจาก code ได้รับการ approve แล้ว มีหลายวิธีที่จะ merge code เข้าไป branch หลักได้ดังนี้&#xA;&#xA;1. feature owner merge ด้วยตัวเอง&#xA;&#xA;หลังจาก code approve แล้ว ผู้ที่เป็นเจ้าของ code ใหม่จะเป็นคนกด merge ด้วยตัวเอง&#xA;&#xA;ข้อดีคือ feature owner กำหนดเวลาในการ merge ได้ เช่นพร้อมทดสอบหรือ release ตอนไหนก็ merge ได้เลย&#xA;&#xA;2. approver merge ด้วยตัวเอง&#xA;&#xA;เมื่อ code approve แล้ว ผู้ที่ approve จะเป็นคนรับผิดชอบในการ merge ให้&#xA;&#xA;ข้อดีคือ approver มักจะเป็น senior หรือผู้ที่รู้ code เป็นอย่างดี สามารถ manage sequence ในการ merge หรือ sequence ในการ release ได้ ลดการ coordinate และป้องกันปัญหาต่างๆ เช่น compatibility&#xA;&#xA;3. code owner merge ให้&#xA;&#xA;เมื่อ code approve แล้ว owner ของ repo หรือ folder จะเป็นผู้ merge ให้&#xA;&#xA;มีข้อดีแบบเดียวกับข้อ 2 และยังได้ความปลอดภัยเพิ่มขึ้น เพราะไม่จำเป็นต้อง grant สิทธิการ merge ให้กับผู้อื่น&#xA;&#xA;สรุป&#xA;&#xA;เราสามารถเลือกใช้วิธีต่างๆ ประยุกต์ หรือผสมเข้าด้วยกันได้ เพื่อให้เหมาะกับ process ขนาดทีม และ policy ขององค์กรได้&#xA;&#xA;#git #team]]&gt;</description>
      <content:encoded><![CDATA[<p>ผมพบว่ามีหลายวิธีที่จะ manage source code และ manage pull request (หรือ merge request) แต่ผมยังไม่เจอว่ามีใครเขียนรวบรวมไว้</p>

<p>ผมจะ focus ในเรื่องที่เกี่ยวกับ การ Approve code การ Run CI และการ Merge code</p>

<h2 id="การ-approve-code">การ Approve code</h2>

<p>การ review สามารถทำได้ทั้ง offline และ online เช่น</p>
<ul><li>review offline แบบ pair programming</li>
<li>review offline แบบ mob programming</li>
<li>review online ผ่านระบบ เช่น GitHub, GitLab</li></ul>

<p>กฎเกณฑ์ในการ approve code มีหลายแบบที่สามารถเลือกใช้ได้ ไม่ว่าจะ review แบบ offline หรือ online เท่าที่ผมรู้จักมีประมาณนี้</p>



<h3 id="1-no-approval">1. No approval</h3>

<p>ใครก็ได้สามารถ merge code ได้ทันที ไม่ต้องมีการ approve</p>

<p>ปกติจะใช้กับการขึ้น project ใหม่ในช่วงเริ่มต้น หรือทีมที่ยังไม่มี process ชัดเจน</p>

<p>บางครั้งถ้าคนทำ project มีประสบการณ์สูงอยู่แล้วก็ไม่จำเป็นต้องรีวิวได้เช่นกัน</p>

<p>process นี้จะเน้นความรวดเร็วในการ contribute</p>

<h3 id="2-anyone-can-approve">2. Anyone can approve</h3>

<p>ในแบบนี้คือใครก็สามารถ approve code ได้ โดยปกติทีมจะตกลงกันว่าต้องมี approve กี่คนขั้นต่ำ เช่น 2 คน</p>

<p>เหมาะกับทีมที่มี engineer ระดับ senior ขึ้นไปจำนวนไม่เยอะ สามารถลดงานของ senior ได้</p>

<p>ปัญหาคือ engineer ระดับ junior รีวิวด้วยกัน อาจจะไม่เห็นปัญหายากๆ ที่ซ่อนอยู่</p>

<h3 id="3-senior-can-approve">3. Senior can approve</h3>

<p>ให้ engineer ระดับ senior ขึ้นไป approve เท่านั้น สามารถตกลงจำนวนคน approve ขั้นต่ำได้ด้วย เช่น 2 คน แต่ส่วนมากแล้วสามารถใช้ senior 1 คน approve ได้ทันที</p>

<p>เหมาะกับกรณี senior approve code ของ junior ตัว code จะมีมาตรฐานดีขึ้น ปัญหาน้อยลง และเกิดการ coaching junior ผ่าน code review</p>

<p>ข้อเสียคือ senior แต่ละคนอาจมี code style หรือมี vision เรื่อง code ไม่เหมือนกัน ทำให้ดูแล project ในระยะยาวได้ยากกว่า</p>

<h3 id="4-code-owner-can-approve">4. Code owner can approve</h3>

<p>assign owner ให้ในแต่ละ repo หรือละเอียดกว่านั้น เช่น ระดับ directory และกำหนดให้ code owner approve ได้เท่านั้น สามารถกำหนดจำนวนคน approve ขั้นต่ำได้ด้วย เช่น 2 คน แต่ส่วนมากแล้วสามารถใช้ code owner 1 คน approve ได้ทันที ทั้งนี้อาจจะให้ code owner เป็น engineer level senior ขึ้นไปก็ได้ หรือจะให้ junior เป็นก็ได้</p>

<p>เหมาะกับการดูแล code ในระยะยาวให้มี code style ที่ consistent สามารถดูแล technical debt ได้สะดวกกว่า</p>

<p>ข้อเสียคือต้อง manage code owner อยู่ตลอด และต้องทำ knowledge sharing ระหว่าง owner หาก repo นั้นมี owner หลายคน</p>

<h2 id="การ-run-ci">การ run CI</h2>

<p>เมื่อมีการ submit code เข้ามา ไม่ว่าจะเป็นแบบ offline (เรียกไป review) หรือ online (ผ่าน pull request/merge request) โดยปกติจะมีการ run automated test เกิดขึ้นด้วย จังหวะในการ run automated test มีหลายแบบ</p>

<p>โดยปกติ engineer จะต้อง run unit test ในเครื่องตัวเองให้ผ่านก่อนถึงจะ push code ขึ้นไปได้ บางครั้งอาจใช้ git hook เพื่อบังคับ run unit test ก่อน push code ได้อีกด้วย ป้องกันการลืม</p>

<h3 id="1-full-test-ci-pipeline">1. full test@CI pipeline</h3>

<p>เมื่อ engineer push code ขึ้นไปใน feature branch หรือ branch ชั่วคราวแล้ว ตัว CI จะ run full test เมื่อ run จบจะบันทึกผลลัพธ์เอาไว้</p>

<p>ระบบ CI จะต้องมี dependency ครบถ้วนก่อน run เช่น database, message queue เป็นต้น</p>

<h3 id="2-quick-test-ci-pipeline">2. quick test@CI pipeline</h3>

<p>เมื่อ engineer push code ขึ้นไปใน feature branch หรือ branch ชั่วคราวแล้ว ตัว CI จะ run test เฉพาะ test ที่ทำงานเร็ว เช่น unit test เมื่อ run จบจะบันทึกผลลัพธ์เอาไว้</p>

<p>ระบบ CI ไม่จำเป็นต้องมี dependency ครบถ้วน ทำให้ง่ายต่อการจัดการและไม่เปลือง cost server</p>

<h3 id="3-full-test-after-merge">3. full test after merge</h3>

<p>หลังจาก merge code เข้า branch หลักแล้ว CI จะ build และ deploy code เข้า environment สักตัวหนึ่ง อาจจะเป็น env ที่สร้างใหม่ หรือเป็น env หลักที่ engineer ใช้ทดสอบก็ได้ โดย CI จะ run full test และบันทึกผลลัพธ์เอาไว้ โดยปกติจะใช้งานคู่กับข้อ 2.</p>

<p>ข้อดีคือ dependency ต่างๆ จะเป็นชุดเดียวกัน (หรือใกล้เคียงกับ) env ที่ engineer ใช้ เมื่อเกิดปัญหาสามารถไป investigate ใน env ได้</p>

<h2 id="การ-merge-code">การ merge code</h2>

<p>หลังจาก code ได้รับการ approve แล้ว มีหลายวิธีที่จะ merge code เข้าไป branch หลักได้ดังนี้</p>

<h3 id="1-feature-owner-merge-ด-วยต-วเอง">1. feature owner merge ด้วยตัวเอง</h3>

<p>หลังจาก code approve แล้ว ผู้ที่เป็นเจ้าของ code ใหม่จะเป็นคนกด merge ด้วยตัวเอง</p>

<p>ข้อดีคือ feature owner กำหนดเวลาในการ merge ได้ เช่นพร้อมทดสอบหรือ release ตอนไหนก็ merge ได้เลย</p>

<h3 id="2-approver-merge-ด-วยต-วเอง">2. approver merge ด้วยตัวเอง</h3>

<p>เมื่อ code approve แล้ว ผู้ที่ approve จะเป็นคนรับผิดชอบในการ merge ให้</p>

<p>ข้อดีคือ approver มักจะเป็น senior หรือผู้ที่รู้ code เป็นอย่างดี สามารถ manage sequence ในการ merge หรือ sequence ในการ release ได้ ลดการ coordinate และป้องกันปัญหาต่างๆ เช่น compatibility</p>

<h3 id="3-code-owner-merge-ให">3. code owner merge ให้</h3>

<p>เมื่อ code approve แล้ว owner ของ repo หรือ folder จะเป็นผู้ merge ให้</p>

<p>มีข้อดีแบบเดียวกับข้อ 2 และยังได้ความปลอดภัยเพิ่มขึ้น เพราะไม่จำเป็นต้อง grant สิทธิการ merge ให้กับผู้อื่น</p>

<h3 id="สร-ป">สรุป</h3>

<p>เราสามารถเลือกใช้วิธีต่างๆ ประยุกต์ หรือผสมเข้าด้วยกันได้ เพื่อให้เหมาะกับ process ขนาดทีม และ policy ขององค์กรได้</p>

<p><a href="https://tnpl.me/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> <a href="https://tnpl.me/tag:team" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">team</span></a></p>
]]></content:encoded>
      <guid>https://tnpl.me/managing-pull-request</guid>
      <pubDate>Thu, 10 Jun 2021 04:14:08 +0000</pubDate>
    </item>
  </channel>
</rss>