git lesson with GitHub.com

อยากแก้ไข source code ของเราในเครื่องเราที่อยู่ใน Github.com เริ่มจาก pull แล้วค่อย push

ทบทวนกันนิดนึง ก่อนไป clone vscode ของ microsoft
มีบัญชีใน Github.com แล้วอยากแก้ไข code ทั้งของเรา และของเขา
บนเครื่องคอมพิวเตอร์ของเรา ถ้าเป็นของเราก็ push กลับไปได้
เริ่มจาก pull มาในเครื่องเรา พอแก้ไข code เสร็จ ก็ push กลับเข้าไป
มีขั้นตอนดังนี้

1. ติดตั้ง git หา Download  
ได้ที่ https://git-scm.com/download

2. เข้า cmd หรือไม่ก็ใช้ Atom editor เป็นอีกทางเลือกนึง
สร้างห้องเตรียมรับ repository ที่จะดึงมาแก้ไข
อาทิ d:\git\mygitfriends
แล้ว cd d:\git\mygitfriends

3. พบห้อง DOS> หลัง run cmd 
เคยเล่าขั้นตอน 9 ข้อใน http://www.thaiall.com/blog/burin/8875/
หรืออ่านเพิ่มเติมที่ https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes
วันนี้สั้นหน่อย แบบรวบรัด
DOS> git init
DOS> git config --global user.email "test@test.com"
DOS> git config --global user.name "test"
DOS> git remote -v  เพื่อดูว่าเชื่อมต่อทิ้งไว้แล้วหรือไม่ จะได้ไม่ซ้ำ เช่น burin
DOS> git remote remove burin แค่นี้ก็ล้างข้อมูลที่เคยเชื่อมต่อไว้ แต่ folder ไม่หายนะครับ
DOS> git remote add mytest https://github.com/thaiall/mygitfriends.git
DOS> git pull mytest master ก็ดึง branch:master ตามลิงค์ข้างต้นมาในเครื่อง ต่อไปก็เรียก mytest 
ข้อมูลมาเยอะเลย ไม่ถาม user & password เพราะเป็น public และมีรูปนึกศึกษาเพียบเลย
DOS> notepad README.md
แล้วเพิ่ม This is my test on 16 september 2017. ต่อท้ายไปอีก 1 บรรทัด
เอาละ Mission complete แล้วนะ ต่อจากนี้ก็ push ล่ะ
DOS> git add README.md 
เพื่อให้ git รู้ว่ามีรายการเปลี่ยนแปลง คือ "แฟ้มนี้นะ ที่ส่งเข้าประกวด"
DOS> git commit -m "i want to write lesson at http://www.thaiall.com/blog"
DOS> git push -u mytest master
ผมเลิกใช้คำว่า origin จะได้ไม่สับสน เพราะเราใช้อะไรก็ได้ ไม่ต้อง origin
จากนี้ก็จะลบข้อมูลการทดสอบทิ้งหละครับ เพราะ Mission complete
เนื่องจาก login github.com ไว้แล้ว เมื่อ push ก็ไม่ถาม user & password อีก

4. ถ้าต้องการ project ใน github.com ไม่ต้อง pull ก็ได้
ใช้ clone เพื่อ download ลงมาเลย แบบนี้แก้แล้ว push กลับไม่ได้นะครับ
เริ่มต้นก็ลบทุกอย่างใน current directory ก่อน clone อะไรมาได้ ก็จะได้รู้

4.1 แบบ pull ก็ต้องกำหนดชื่อ branch อาทิ mytest ในเครื่องเรา ที่จะเชื่อมกับ branch master 
แบบนี้คล้ายกับ clone แต่หวังจะ push ถึงได้ใช้ pull
DOS> git init
DOS> git remote add mytest https://github.com/thaiall/mygitfriends.git
DOS> git pull mytest master 

4.2 แบบ clone ไม่ต้องอะไร สั่ง git clone ตามด้วย url ก็มาเลย
ไม่ต้องสั่ง git init ก็ได้ download มาเลย แล้วสร้าง Folder แยกให้
DOS> git clone https://github.com/schacon/ticgit
DOS> git clone https://github.com/thaiall/mygitfriends
DOS> git clone https://github.com/toyoshim/SyobonAction
DOS> git clone https://github.com/Microsoft/vscode
ถ้ารอ download นาน แล้วอยากยกเลิก ก็กด Ctrl+C หรือ close window




บทเรียนที่ 3 ชวนลูกทีมมือสมัครเล่นมารายงานตัวเป็น collaborators ผ่านแฟ้ม html ใช้ git สั่ง pull + push เข้า github.com

ตามหัวข้อเลย ผมมีลูกทีมเป็นมือสมัครเล่นกันหลายคน
จะให้เค้าไปสมัครใช้บริการ github.com 
แล้วส่ง email ให้ผม เพื่อ invite พวกเค้ามาเป็น collaborators
จากนั้นก็ให้ทุกคนไป download git for windows แบบ portable
เพราะแต่ละคนอาจใช้ git กันในหลายรูปแบบ แต่แบบ portable คือ ใช้ชั่วคราว
มี interface ทั้งแบบ bash และ cmd จาก https://git-scm.com/download/win
คือ git-cmd.exe (cd d:/git/mygitfriends1) 
และ  git-bash.exe (cd /d/git/mygitfriends1)
แต่ถ้าใครอยากใช้ git กันนาน ๆ ก็เลือกแบบ install ได้
จากนั้นก็สร้างห้อง เช่น d:\git\mygitfriends1
แล้วให้ pull ดึง repository ของผมลงมา
แล้วแก้ไข tag LI ใส่ url ที่เป็น repository ของตนเอง เพื่อแชร์ให้ผมทราบ
ติ้งต่างว่าผมเป็นหัวหน้าทีมของลูกทีมมือสมัครเล่น

มีขั้นตอน 9 ข้อ ดังนี้
1. DOS>git init
จะสร้างห้อง .git แบบ hidden สำหรับการเริ่มต้นงาน repository 
ในห้องนี้มีแฟ้มสำคัญคือ config ที่เปิดมาการตั้งค่าได้
2. DOS>git config --global user.email "you@example.com"
อย่าลืมเปลี่ยนเป็น e-mail ของตนเองนะครับ

3. DOS>git config --global user.name "Your Name"
อย่าลืมเปลี่ยนเป็น ชื่อของตนเองนะครับ

4. DOS>git remote add origin https://github.com/thaiall/mygitfriends.git
ต้องกำหนด email กับ name ให้เรียบร้อยก่อน
แล้วสั่งกำหนดว่า remote คือที่ไหน ที่ origin เชื่อมโยงด้วย

5. DOS>git pull origin master
ดึงข้อมูลจาก repository ใน master บน github.com 
ลงมาเป็น origin ใน localhost หลังแก้ไขจะได้ push ขึ้นไป

6. DOS>notepad collaborators.htm หรือจะใช้ vi ก็ได้ ถ้าถนัดนะครับ
เปิดแฟ้ม html มาแก้ไขเพิ่มเติมข้อมูลตาม TAG LI 
ให้เพิ่ม link ของ repository ที่ตนเองเป็นเจ้าของ
หลังสมัคร github.com ด้วย email ของตน และสร้าง repository ไว้

<html><head>collaborators</head>
<body>
<h1>collaborators</h1>
<ol>
<li>
	<a href=""></a><br/>
</li>
</ol>
</body>
</html>

7. DOS>git add collaborators.htm
หลังแก้ไขก็สั่ง add เพื่อบอกว่าแฟ้มนี้ คือ แฟ้มที่ปรับปรุง 

8. DOS>git commit -m "i am gthaiall"
การสั่ง commit คือ การตรวจสอบว่ามีแฟ้มอะไรบ้างที่ต้องดำเนินการ และตีทะเบียนรุ่นให้ใหม่

9. DOS>git push -u origin master
ทำส่งรายละเอียด และการแก้ไขผ่าน push เปรียบเทียบระหว่าง master กับ origin 
ขึ้นไปยังเครื่องบริการ github.com ที่เป็นสื่อกลางระหว่างนักพัฒนาทุกคน

สรุปว่าผมนั่งดูใน github.com พบว่านักพัฒนาคนไหน 
ทำอะไรกับแฟ้ม collaborators.htm เมื่อใด
ที่พบมี รหัส commit [7864d75] ใหม่ พบว่า เพิ่ม 3 บรรทัด และลบ 2 บรรทัด
https://github.com/thaiall/mygitfriends/commit/7864d75fa7c983bb5a6b58c7d675e74fa39f1594

หลังจบการ push ผมเข้าไปลบทุกอย่างในห้อง d:\git\mygitfriends1
รวมทั้ง .git ด้วย แล้วใช้ git-bash.exe ทำตามขั้นตอน 9 ข้อใหม่
หลังแก้ไขได้ รหัส commit [50d1311] ใหม่ พบว่า เพิ่ม 1 บรรทัด
https://github.com/thaiall/mygitfriends/commit/50d1311d91c10624a41ff605a9d22dc34a7a6c2c

หากมีคำถามเรื่อง git อยากชวนไปดูคลิ๊ปสั้น ๆ ของ SIPA เรื่อง แนะนำ และติดตั้ง Git
https://www.youtube.com/watch?v=8PI7WuYBKo0&index=84&list=PLtM3znnbMbVXD0fygCTsblC2sLZvSPY8g
ที่ Minato Namikazerak ร่วมแบ่งปัน
ตอนเข้าไปแชร์ในกลุ่ม ไทย PHP เรื่องที่ผม push เข้า github.com
==========================================
บทเรียนที่ 2 : การใช้ Git ตามคำแนะนำของ Github.com บน Bash on Ubuntu on Windows

เริ่มต้นกันเลย กับการสมัครใช้บริการพื้นที่ฟรี สำหรับเก็บ code ของ Github.com 
แล้วพบว่าหน้าแรกของ code ตอนที่ยังไม่มีแฟ้มใดเลย เค้าแนะนำคำสั่งมา 6 บรรทัดว่าจะสร้าง README.md อย่างไร 
ก็ลองพิมพ์ตามนั้นดูสักหน่อย เพราะ Nimit Suwannagate แนะนำคำสั่ง git ไว้ใน กลุ่ม ไทย PHP 
ที่เป็นการทำ backup_master เข้ามาเกี่ยวข้อง  มีคำสั่งน่าสนใจหลายคำสั่ง แต่ถ้าเริ่มต้นต้องคำสั่งบน Github.com นี่หละ 
สำหรับผมใช้ระบบปฏิบัติการ Windows 10 และมี Bash on Ubuntu on Windows 
ก็ถือโอกาสใช้ git บน Linux ที่อยู่ใน Windows

มีขั้นตอนการใช้ git ตามที่ github.com แนะนำ ดังนี้

1. สร้าง folder ชื่อ git ที่ drive d 
และสร้าง folder ชื่อ mygitfriends ใน git
จะได้ folder d:/git/mygitfriends เตรียมพื้นที่ไว้ทำงาน และอ้างอิงง่าย ๆ หน่อย
ที่ตั้งชื่อว่า mygitfriends จะลองชวนเพื่อนที่สนใจ
มาเข้ากลุ่ม collaborators ของ repository จึงตั้ง folder เป็นชื่อนี้

2. เข้า bash on ubuntu on windows
แล้วติดตั้ง git เพื่อทำงานใน ubuntu on windows
$sudo apt-get install git

3. นั่งมองคำสั่งที่ github.com แนะนำแป๊ปนึง มีความหมายทุกบรรทัด
echo "# mygitfriends" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/thaiall/mygitfriends.git
git push -u origin master

4. ใน bash on ubuntu on windows
ทำตามขั้นตอนดังนี้
4.1 $cd /mnt/d/git/mygitfriends
4.2 $echo "# Hello world! v.1" >> README.md
4.3 $git init จะสร้าง folder .git แล้วแฟ้มอีกเพียบขึ้นมาให้
4.4 $git add README.md
4.5 $git commit -m "first commit" ได้รับแจ้งว่าต้อง config email กับ name
ก่อนสั่งงาน ก็ต้องสั่ง 2 บรรทัดนี้ก่อน
- git config --global user.email "you@example.com"
- git config --global user.name "Your Name"
หลัง config ก็สั่งใหม่ ก็เรียบร้อยด้วยดี
[master (root-commit) 2ff254f] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
4.6 $git remote add origin https://github.com/thaiall/mygitfriends.git
หลังจากสั่ง $git remote ทำให้แฟ้ม config เพิ่มมา 3 บรรทัด
[remote "origin"]
	url = https://github.com/thaiall/mygitfriends.git
	fetch = +refs/heads/*:refs/remotes/origin/*
4.7 $git push -u origin master
เค้าแนะนำว่าให้  git pull ก่อน แล้วค่อย pushing again
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/thaiall/mygitfriends.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
4.8 $git pull origin master
warning: no common commits
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
From https://github.com/thaiall/mygitfriends
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
Merge made by the 'recursive' strategy.
 _config.yml       |  1 +
 collaborators.htm | 14 ++++++++++++++
 index.md          | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+)
 create mode 100644 _config.yml
 create mode 100644 collaborators.htm
 create mode 100644 index.md
จากนั้นก็เปิดแฟ้ม .git/MERGE_MSG มาให้แก้ไข ก็ไม่ได้แก้ไขครับกด Ctrl+X ออกไป
4.9 $git push -u origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 503 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/thaiall/mygitfriends.git
   5f749af..353f84d  master -> master
   
5. ตรวจสอบผลงานตามขั้นตอนข้างต้น   
หลังจากสั่ง $git push .. พบแฟ้ม README.md เข้าไปอยู่ใน github.com
มีเพียงแฟ้มเดียวที่วันที่เปลี่ยนอย่างถูกต้อง แฟ้มที่เหลือยังอยู่กันตามปกติ
5.1 ถ้า pull ใหม่ เค้าบอกว่า up-to-date แล้ว
From https://github.com/thaiall/mygitfriends
 * branch            master     -> FETCH_HEAD
Already up-to-date.
5.2 ถ้า push ใหม่ เค้าบอกว่า    up-to-date แล้วเช่นกัน
Username for 'https://github.com': [yourusername]
Password for 'https://[yourusername]@github.com':
Everything up-to-date
5.3 สรุปว่า ถ้า push หรือ pull โดยไม่เปลี่ยนแปลงแฟ้มใน origin 
ก็จะไม่ส่งผลถืง master ที่อยู่ใน github.com เช่นกัน เพราะ git จะตรวจสอบก่อน

===========================
blank_repository.png
collaborator_home.png
git_init.png
git_init.png
invite_confirm.png
invite_friend.png
invite_link.png
===========================
บทเรียนที่ 1 : สร้าง repository เตรียมรับจาก local เข้า github.com ชื่อ myGitFriends

สร้าง repository ไว้ทำงานร่วมกับ coleage
ใช้บริการของ github.com
1. มุมบนของ github.com เลือก create new
new repository
Repository name = mygitfriends
* Public
แล้วกดปุ่ม Create repository

2. สำรวจหน้า code พบสิ่งต่อไปนี้
2.1 ข้อมูลของ repository ในการเชื่อมต่อ
https = https://github.com/thaiall/mygitfriends.git
ssh = git@github.com:thaiall/mygitfriends.git

2.2 …or create a new repository on the command line
echo "# mygitfriends" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:thaiall/mygitfriends.git
git push -u origin master

2.3 …or push an existing repository from the command line
git remote add origin git@github.com:thaiall/mygitfriends.git
git push -u origin master

2.4 …or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.
ถ้าคลิ๊ก import code ก็จะถาม url ที่ต้องการนำเข้า

3. เข้า Settings จาก Tabs
ด้านซ้ายพบ Collaborators (ผู้ประสานงาน) ที่ผมเรียกว่า Coleage (เพื่อนร่วมงาน) นั่นหละ
เข้าไปพบคำว่า
Collaborators : Push access to the repository

สมัครใหม่
1. ทำตามขั้นตอน
step 1 เลือกว่าจะใช้งานฟรี
setp 2 เลือกแผน คำถามน่ารักครับ 
How would you describe your level of programming experience?
Very experienced 
Somewhat experienced 
Totally new to programming

What do you plan to use GitHub for? (check all that apply)
Design 
School projects 
Development 
Project Management 
Research 
Other (please specify)

Which is closest to how you would describe yourself?
I'm a student 
I'm a professional 
I'm a hobbyist 
Other (please specify)

แล้วก็เข้าหน้าหลัก main page
เข้าไป ในอีเมล แล้ว Verify email address
This lets you access all of GitHub's features.
ใส่รูป profile ให้เรียบร้อย
มองมุมบนขวา แล้วเข้า Settings ก็จะ Upload new picture ได้
แล้วก็กรอก name เพราะยังไม่ได้กรอกเลย

4. เข้า Collaborators
สามารถเพิ่ม Add collaborator ได้แล้ว
หลังภาพสมาชิก collaborator มี Invite link ด้วย
https://github.com/thaiall/mygitfriends/invitations
เมื่อได้รับ link ก็ต้องกดปุ่ม Accept invitation
จะเข้าไปใน repository ที่ชื่อ mygitfriends ได้
เข้าไปจะแก้ไขแฟ้ม หรือสร้างแฟ้มได้ แต่เข้า Setting ไม่ได้

5. เริ่มต้น
https://help.github.com/articles/create-a-repo/
ตอนสร้าง repository ให้เลือก
Select Initialize this repository with a README.
ก็ไม่ได้สร้างไว้ จึงต้องไปสร้าง GitHub Pages ใน Settings
Theme Chooser = Slate Theme
เค้าสร้าง index.md มาให้ กด Commit Change
เพียงเท่านี้ก็มี Branch = master
และแฟ้ม 2 แฟ้ม คือ index.md และ _config.yml

<html><head>collaborators</head>
<body>
<h1>collaborators</h1>
<ol>
<li>
	<a href="https://github.com/thaiall">https://github.com/thaiall</a><br/>
	<a href="https://thaiall.github.io/mygitfriends/">https://thaiall.github.io/mygitfriends/
</li>
<li>
	<a href="https://github.com/gthaiall">https://github.com/gthaiall</a><br/>
</li>
</ol>
</body>
</html>

เกี่ยวกับ SSH หัวข้อ 6 กับ 7
ใน blog ที่ http://www.thaiall.com/blog/burin/8857/
1. $ssh-keygen -t rsa -b 4096 -C "your_email@example.com" สร้าง key
2. $eval $(ssh-agent -s) ตรวจว่าทำงานหรือไม่
3. $ls -al พบแฟ้มชื่อ github ที่ gen ไว้
4. $ssh-add ~/github สั่งเพิ่มแฟ้ม
5. $ssh-add -l แสดงข้อมูลที่ add เข้าไป
6. $ssh-add -D ลบที่เคย add
7. $ssh-add github เพิ่มใหม่ เพราะเพิ่มเมื่อวานหายไปแล้ว

http://goo.gl/72BPC