ผลต่างระหว่างรุ่นของ "01204223/github-pr"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 10 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 27: แถว 27:
  
 
== fork ==
 
== fork ==
 +
 +
Repository หลักที่เราจะทดลองกันจะอยู่ที่ [https://github.com/jittat/01204223-git-practice-68 https://github.com/jittat/01204223-git-practice-68]
 +
 +
ในการทำงานกับ repository กลางที่เราไม่ได้เป็นเจ้าของนั้น เราจะสร้าง copy ของเราขึ้นมาก่อน บน github  โดยขั้นตอนนี้เรียกว่าการ '''fork'''
 +
 +
ให้กดปุ่ม fork (ปุ่มด้านขวาบน ถัดจากชื่อ repo) จากนั้น github จะสร้าง repository ใน user ของเราขึ้นมา (เช่นอาจจะชื่อ userxyz / 01204223-git-practice-68)
 +
 +
เราจะมีสิทธิ์ในการจัดการ reposition ที่ fork มานี้อย่างเด็มที่ เพราะว่าเป็นของเราเอง  เมื่อเราแก้และต้องการจะส่ง changes กลับไป repository ต้นทาง เราจะทำโดยการส่ง pull request (PR) ซึ่งจะได้ทดลองต่อไป
 +
 +
=== repository ที่เกี่ยวข้องทั้งหมด ===
 +
 +
เพื่อกันความสับสน เราจะมี repository ที่เกี่ยวข้อ 3 อัน คือ
 +
 +
* remote repository ต้นทางบน github (jittat/01204223-git-practice-68)
 +
* remote repository ของเราบน github (userxyz/01204223-git-practice-68) ที่เรา fork มา, และ
 +
* local repository ที่ clone มา บน local
 +
 +
เราจะทำงานดังนี้
 +
* ในการแก้ไขหลัก ๆ เราจะแก้ไขใน local ก่อนจะ push/pull กับ remote repository ของเรา
 +
* ส่วน remote repository ของเราบน github กับ repository ต้นทางบน github เราจะส่ง pull request (PR) เพื่อให้ต้นทางรับการแก้ไข
  
 
== clone ==
 
== clone ==
  
== pull / push ==
+
เราสามารถแก้ไข repository ได้โดยตรงใน web interface ของ github เลย แต่เราจะไม่ทำ 55555
 +
 
 +
เราจะสร้าง local repository ขึ้นมาในเครื่องเราก่อน เพื่อที่จะได้ฝึกกระบวนการ pull / push กับ remote repository สักเล็กน้อย  ขั้นตอนดังกล่าวเรียกว่าการ '''clone'''
 +
 
 +
ในการ clone เราจะต้องอ้าง repository ผ่านทาง ssh หรือ https  ให้ลองกดปุ่ม Code (สีเขียว) ดูนะครับ จะมีที่อยู่ repository ในทีนี้ เนื่องจากเรายังไม่ได้ทำอะไรกับ ssh key เลย เราจะ clone ด้วย https
 +
 
 +
ให้หาไดเร็กทอรีที่ทำงาน แล้วสั่ง
 +
 
 +
git clone [URL]
 +
 
 +
โดย URL นั้น copy มาจากลิงก์ที่แสดงในปุ่ม Code เช่น https://github.com/userxyz/01204223-git-practice-68.git
 +
 
 +
เราจะได้ไดเร็กทอรี <tt>01204223-git-practice-68</tt> ขึ้น ให้ cd ไปในนั้น
 +
 
 +
ในนั้นจะมีโครงสร้างดังนี้
 +
 
 +
- group1-files/
 +
    - empty
 +
- group2-files/
 +
    - empty
 +
- group3-files/
 +
    - empty
 +
- group4-files/
 +
    - empty
 +
- test1.txt
 +
- test2.txt
 +
- test3.txt
 +
- test4.txt
 +
 
 +
ก่อนจะทำงานต่อ ผมจะแก้ไข repo หลักสักนิดก่อน เพื่อที่เราจะได้ทดลอง pull changes มาที่ repo ใน github ของเรา และ pull changes มาที่ local repository
 +
 
 +
== pull ==
 +
 
 +
 
 +
== push ==
 +
 
 +
ในขั้นแรก ให้เพิ่มไฟล์ชื่อตัวเอง นามสกุล txt เช่น somchai.txt ลงในไดเร็กทอรี groupX-files (ดูเลขกลุ่มจาก google sheet)  ในไฟล์นั้นจะมีข้อมูลอะไรก็ได้ สัก 1 บรรทัด
 +
 
 +
จากนั้นให้ commit ลง local repository
 +
 
 +
เราจะ push changes กลับไปที่ remote repository ของเรา โดยสั่ง
 +
 
 +
git push
 +
 
 +
หมายเหตุ: ปกติการ push จะต้องระบุรายละเอียดอื่น ๆ เช่นเลือก branch แต่เนื่องจาก repo เรา clone มาจาก github อยู่แล้ว จึงมีการตั้งค่า default ที่ทำให้ push กลับไปได้ง่าย (ดูค่าพวกนี้ได้ที่ <tt>.git/config</tt>)
 +
 
 +
แต่การจะ push ได้เราจะต้องสามารถยืนยันตัวตนได้ด้วย token (github เลิกให้ใช้รหัสผ่านไปแล้ว)
  
 
=== Personal Access Token (PAT) ===
 
=== Personal Access Token (PAT) ===
  
 
เพื่อความปลอดภัย github จะไม่ยอมให้เราดำเนินการ git ต่าง ๆ ด้วยรหัสผ่าน เราต้องไปสร้าง token เพื่อใช้แทน password โดยดำเนินการดังนี้
 
เพื่อความปลอดภัย github จะไม่ยอมให้เราดำเนินการ git ต่าง ๆ ด้วยรหัสผ่าน เราต้องไปสร้าง token เพื่อใช้แทน password โดยดำเนินการดังนี้
 +
* เข้าสู่ระบบ GitHub แล้วคลิกที่รูปโปรไฟล์มุมขวาบน
 +
* เลือก '''Settings'''
 +
* เลื่อนลงไปด้านล่างสุดของเมนูซ้าย เลือก '''Developer settings'''
 +
* เลือก '''Personal access tokens''' > '''Tokens (classic)''' หรือ '''Fine-grained tokens'''
 +
* คลิก '''Generate new token''' (เลือก classic)
 +
* ตั้งชื่อ token และเลือกระยะเวลาหมดอายุ
 +
* เลือก '''scopes''' หรือสิทธิ์ที่ต้องการ ในที่นี้ให้เลือก repo
 +
* คลิก '''Generate token''' ด้านล่าง
 +
* '''คัดลอก token ทันที''' - จะไม่สามารถดูอีกครั้งได้
 +
 +
==== หมายเหตุ ====
 +
 +
* เก็บ token ไว้ในที่ปลอดภัย
 +
* Fine-grained tokens ให้การควบคุมสิทธิ์ที่ละเอียดกว่า
 +
* Classic tokens ใช้งานง่ายกว่าแต่ให้สิทธิ์กว้างกว่า
  
 
== pull requests (PR) ==
 
== pull requests (PR) ==
  
 
== accepting pull requests ==
 
== accepting pull requests ==
 +
 +
 +
== ทำอีกรอบ แก้ไฟล์ textX.txt พร้อม ๆ กัน ==

รุ่นแก้ไขปัจจุบันเมื่อ 03:04, 19 ธันวาคม 2568

เป็นส่วนหนึ่งของวิชา 01204223

สำหรับคนที่เรียนในคาบ ให้รอทำกิจกรรมนี้พร้อม ๆ กัน ผู้สอนจะประกาศเพิ่มเติมในคาบ

รายละเอียดกระบวนการคร่าวๆ

ทบทวนแนวคิดพื้นฐานก่อน

  • merge เวลาที่เรามี history สองสาย (สอง head) แล้วต้องการนำมารวมเรา เราจะ merge, ในกระบวนการ merge อาจเกิด conflict ขึ้นได้ ซึ่งเราต้อง resolve ก่อน ถึงจะจัดเก็บได้ (commit)
  • git เป็น distributed version control แต่ละ repository จะเป็นหน่วยย่อยที่สมบูรณ์ในตัวเอง การจะแลกเปลี่ยน history กันจะดำเนินโดยการส่ง changes ไปมา มีขั้นตอนสองขั้นตอนหลัก ๆ เรียกว่า pull (นำการเปลี่ยนแปลงมา) กับ push (ส่งการเปลี่ยนแปลงไปให้)
  • หมายเหตุ: ขั้นตอนย่อยของ pull คือการ fetch แล้วตามด้วย merge หลายคนไม่ชอบใช้ pull
  • ของใน git โดยมากจะไม่มีทางหาย ถ้าทำพลาดไป โดยมากจะสามารถกู้ทุกอย่างกลับมาได้ ยกเว้นถ้ามีการสั่ง --force ดังนั้น อย่า force ถ้าไม่จำเป็น

กิจกรรมที่เราจะทำเป็นดังนี้

  • เราจะ fork repository กลางของแลบมาเป็น repository ของตนเอง
  • จากนั้นจะ clone repository ของเราเอง มาที่เครื่อง local
  • รอบที่ 1:
    • ผมจะแก้ไฟล์ที่ repository กลาง และให้แต่ละคน sync (pull) มาที่ repository ของตนเองใน github
    • เราจะ pull changes มาที่ local
    • จะเพิ่มไฟล์ และ push กลับไปที่ github ของแต่ละคน
    • แล้วจะให้แต่ละคนทำ pull request (PR) จาก repo github กลับมาที่ repository กลาง (รอบนี้จะ accept PR ได้แบบไม่มี conflict)
  • รอบที่ 2:
    • pull changes ทั้งหมดมาที่ local
    • ให้แก้ไฟล์ของแต่ละกลุ่ม
    • push กลับไป repo ตนเอง
    • ทำ pull request (PR) อีกรอบ และแก้ conflict (หัวแตก)

fork

Repository หลักที่เราจะทดลองกันจะอยู่ที่ https://github.com/jittat/01204223-git-practice-68

ในการทำงานกับ repository กลางที่เราไม่ได้เป็นเจ้าของนั้น เราจะสร้าง copy ของเราขึ้นมาก่อน บน github โดยขั้นตอนนี้เรียกว่าการ fork

ให้กดปุ่ม fork (ปุ่มด้านขวาบน ถัดจากชื่อ repo) จากนั้น github จะสร้าง repository ใน user ของเราขึ้นมา (เช่นอาจจะชื่อ userxyz / 01204223-git-practice-68)

เราจะมีสิทธิ์ในการจัดการ reposition ที่ fork มานี้อย่างเด็มที่ เพราะว่าเป็นของเราเอง เมื่อเราแก้และต้องการจะส่ง changes กลับไป repository ต้นทาง เราจะทำโดยการส่ง pull request (PR) ซึ่งจะได้ทดลองต่อไป

repository ที่เกี่ยวข้องทั้งหมด

เพื่อกันความสับสน เราจะมี repository ที่เกี่ยวข้อ 3 อัน คือ

  • remote repository ต้นทางบน github (jittat/01204223-git-practice-68)
  • remote repository ของเราบน github (userxyz/01204223-git-practice-68) ที่เรา fork มา, และ
  • local repository ที่ clone มา บน local

เราจะทำงานดังนี้

  • ในการแก้ไขหลัก ๆ เราจะแก้ไขใน local ก่อนจะ push/pull กับ remote repository ของเรา
  • ส่วน remote repository ของเราบน github กับ repository ต้นทางบน github เราจะส่ง pull request (PR) เพื่อให้ต้นทางรับการแก้ไข

clone

เราสามารถแก้ไข repository ได้โดยตรงใน web interface ของ github เลย แต่เราจะไม่ทำ 55555

เราจะสร้าง local repository ขึ้นมาในเครื่องเราก่อน เพื่อที่จะได้ฝึกกระบวนการ pull / push กับ remote repository สักเล็กน้อย ขั้นตอนดังกล่าวเรียกว่าการ clone

ในการ clone เราจะต้องอ้าง repository ผ่านทาง ssh หรือ https ให้ลองกดปุ่ม Code (สีเขียว) ดูนะครับ จะมีที่อยู่ repository ในทีนี้ เนื่องจากเรายังไม่ได้ทำอะไรกับ ssh key เลย เราจะ clone ด้วย https

ให้หาไดเร็กทอรีที่ทำงาน แล้วสั่ง

git clone [URL]

โดย URL นั้น copy มาจากลิงก์ที่แสดงในปุ่ม Code เช่น https://github.com/userxyz/01204223-git-practice-68.git

เราจะได้ไดเร็กทอรี 01204223-git-practice-68 ขึ้น ให้ cd ไปในนั้น

ในนั้นจะมีโครงสร้างดังนี้

- group1-files/
    - empty
- group2-files/
    - empty
- group3-files/
    - empty
- group4-files/
    - empty
- test1.txt
- test2.txt
- test3.txt
- test4.txt

ก่อนจะทำงานต่อ ผมจะแก้ไข repo หลักสักนิดก่อน เพื่อที่เราจะได้ทดลอง pull changes มาที่ repo ใน github ของเรา และ pull changes มาที่ local repository

pull

push

ในขั้นแรก ให้เพิ่มไฟล์ชื่อตัวเอง นามสกุล txt เช่น somchai.txt ลงในไดเร็กทอรี groupX-files (ดูเลขกลุ่มจาก google sheet) ในไฟล์นั้นจะมีข้อมูลอะไรก็ได้ สัก 1 บรรทัด

จากนั้นให้ commit ลง local repository

เราจะ push changes กลับไปที่ remote repository ของเรา โดยสั่ง

git push

หมายเหตุ: ปกติการ push จะต้องระบุรายละเอียดอื่น ๆ เช่นเลือก branch แต่เนื่องจาก repo เรา clone มาจาก github อยู่แล้ว จึงมีการตั้งค่า default ที่ทำให้ push กลับไปได้ง่าย (ดูค่าพวกนี้ได้ที่ .git/config)

แต่การจะ push ได้เราจะต้องสามารถยืนยันตัวตนได้ด้วย token (github เลิกให้ใช้รหัสผ่านไปแล้ว)

Personal Access Token (PAT)

เพื่อความปลอดภัย github จะไม่ยอมให้เราดำเนินการ git ต่าง ๆ ด้วยรหัสผ่าน เราต้องไปสร้าง token เพื่อใช้แทน password โดยดำเนินการดังนี้

  • เข้าสู่ระบบ GitHub แล้วคลิกที่รูปโปรไฟล์มุมขวาบน
  • เลือก Settings
  • เลื่อนลงไปด้านล่างสุดของเมนูซ้าย เลือก Developer settings
  • เลือก Personal access tokens > Tokens (classic) หรือ Fine-grained tokens
  • คลิก Generate new token (เลือก classic)
  • ตั้งชื่อ token และเลือกระยะเวลาหมดอายุ
  • เลือก scopes หรือสิทธิ์ที่ต้องการ ในที่นี้ให้เลือก repo
  • คลิก Generate token ด้านล่าง
  • คัดลอก token ทันที - จะไม่สามารถดูอีกครั้งได้

หมายเหตุ

  • เก็บ token ไว้ในที่ปลอดภัย
  • Fine-grained tokens ให้การควบคุมสิทธิ์ที่ละเอียดกว่า
  • Classic tokens ใช้งานง่ายกว่าแต่ให้สิทธิ์กว้างกว่า

pull requests (PR)

accepting pull requests

ทำอีกรอบ แก้ไฟล์ textX.txt พร้อม ๆ กัน