---
# System prepended metadata

title: GitHub 教學
tags: [todo]

---

---
tags: todo, github
---
# GitHub 教學

每週一主題
--------
每週1個主題, 一步步學 GitHub 指令

- 第0階段(準備): 建GitHub帳號, 建GitHub repo專案, 安裝 Git for Windows, git clone https://github.com/帳號/專案名
  - 在這一階段, 還不會使用 git, 不過已經把相關工具/前置作業做好了
  - 建 GitHub 帳號
  - 建 GitHub repo 專案, 會在網頁按 new 來新增 repository, 也了解 `.gitignore` 及 `README.md`
  - 安裝 Git for Windows, 有了 git 工具, 可以開始在 cmd.exe 小黑裡打字操作
  - git clone https://github.com/帳號/專案名 將前面新增的專案下載, 也能下載別人的專案
- 第1階段(上傳雲端): 
  - 在這一階段, 熟悉 git 最常用的 1+3 指令, 在小黑視窗cmd.exe 裡下指令
  - 也會順便熟悉 cmd.exe 裡的 DOS 指令 cd 切換目錄
  - `git status` 查目前狀況
  - `git add .` 將現在目錄加入
  - `git commit -m "訊息"` 設定還原點
  - `git push` 推/送上雲端
  - 重點: 可以讓自己的 github 內容越來越豐富
- 第2階段(努力寫程式):
  - 看看 GitHub contribution graph (會想塗鴉)
  - 有自己的 public 及 private 的許多專案
  - 隨時可在電腦中寫程式/編輯 `README.md` , 熟悉 Notepad++ 及其他程式開發工具
  - 每個目錄都建 `README.md` 說明
  - 可做自己網頁 `帳號.github.io`
  - 每台電腦都裝 Git for Windows
- 第3階段(做錯可還原):
  - `git log` vs. `git log --oneline` (一次一行) 熟悉 HEAD 及
  - `git reflog` (倉庫中的 ref log)
  - `git reset HEAD^` vs. `git reset HEAD^^` (回一步)
    - More? 的[笑話](https://stackoverflow.com/questions/14203952/git-reset-asks-more)
    - http://jdev.tw/blog/4239/git-rest-hard-head-in-windows-cmd-exe
  - 可改用 `git reset "HEAD^"`
  - `git reset --hard "HEAD^"` 或 `git reset --hard`
  - `git push`
- 第4階段(更多的指令)
  - git 的常見指令: status, add, diff, commit, push, pull, clone, log, reflog, reset,
  - cmd.exe 配上 Git for Windows 其實簡單很夠用
  - cmd.exe 的常見指令: `cd 目錄`, `cd ..` , `dir` 秀出目錄, `start` . 在這裡開啟檔案總管, `notepad filename` 開記事本編輯, `more filename` 慢慢看檔案
  - cmd.exe 裡, 可用 `doskey /history` 看自己下過的指令
  - cmd.exe 在 Windows 10 裡, 可用 mouse圈起來, 使用 Ctrl-C, Ctrl-V
- 第5階段(累積放網頁)
  - yourname.github.com
  - 你的專案, 從 main branch 改設好 gh-pages branch, 就可在 yourname.github.com/your_project 看到
  - 在 Setting 設定 Jekyll theme

整理中的筆記
==========

GitHub Gist
---------------
有時需要分享程式碼教學時, 可以使用 GitHub Gist功能。
gist.github.com
有幾個設定的地方
- 檔名: Filename including extension 檔名+副檔名, 決定使用的語言
- 介紹: Description 
- Space vs. TAB 的戰爭
- Public vs. Private
- Add File

git.io 短網址
------------
因為 Gist 的網址太長了, 可利用 git.io 來縮短網址
- 可直接用 git.io 來設定
- 但如果想要自己的短網址名,可利用 curl 來設定參數
- 下載 [curl for Windows](https://curl.se/windows/)
- 指令 curl -i https://git.io -F "url=https://gist.github.com/jsyeh/很長的網址" -F "code=jsyeh-caesar.c"
- 參考資料: https://titangene.github.io/article/github-url-shortener.html
- 參考資料: https://github.blog/2011-11-10-git-io-github-url-shortener/


```

C:\Users\USER\Downloads\curl-7.75.0-win64-mingw\bin>curl -i https://git.io -F "url=https://gist.github.com/jsyeh/1db893bbdf7dc0fa7a5e117b4757067e" -F "code=jsyeh-caesar.c"
HTTP/1.1 201 Created
Server: Cowboy
Connection: keep-alive
Date: Fri, 05 Feb 2021 18:03:41 GMT
Status: 201 Created
Content-Type: text/html;charset=utf-8
Location: https://git.io/jsyeh-caesar.c
Content-Length: 62
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.009971
X-Node: 799434ea-9da1-4674-9d8e-34420f9b2ff2
X-Revision: 392798d237fc1aa5cd55cada10d2945773e741a8
Strict-Transport-Security: max-age=31536000; includeSubDomains
Via: 1.1 vegur
```

學習 Git-it
-----------

- 使用 electron 開發的跨平台教學軟, 使用 javascript 做到。
- 

買網址
-----
- 先用 whois 去查有沒有被買走
- 再用 godaddy 確認可以買
- 再查 gmail.com 還能不能使用
- 

規劃
---
- Idea: GitHub 教學, 應該放在 GitHub 上。
- 可以先在 HackMD 寫好, 因為寫起來比較快
- 這樣也能整合成 book 方便慢慢翻閱
- 每週的小任務, 就是一個小文件, 這樣書讀起來比較輕鬆

修改日期
-------
https://mail.google.com/mail/u/0/#search/github/KtbxLzGDXqBfVflmZZJXkzkvtkfCbGrgbq
todo: 關於 github commit 日期設定 用 --date="2021-01-25 13:00:00" 即可
git commit -m "add step04_WaveFunc" --date="2021-01-24 13:00:00"


在Windows 簡單操作
----------------
https://mail.google.com/mail/u/0/#search/github/QgrcJHsbdJHZVTmfdDcQbMwZZVgTWDwtVXV

1. 安裝 Git for Windows
2. 利用 `git clone https://github.com/帳號/repo名` 下載複製
2.1. 如果是 private repo, 需要用 browser 登入 github
3. 修改之後, `git add .` 把你目錄裡修改的檔案加進去
4. 使用 `git commit -m "訊息"` 記下你的還原點訊息
4.1. 如果第1次使用, 需要設定 email 及 名字
4.2. `git config --global user.email "jsyeh@mail.mcu.edu.tw"`
4.3. `git config --global user.name "jsyeh"`
4.4. 如果想要偽造日期, 可以使用 `git commit -m "訊息" --date="2021-01-21 13:00:00"` 來改日期
5. `git push` 推回 github 上面

如何用上癮
--------
https://mail.google.com/mail/u/0/#inbox/KtbxLvHPwtsGBxCthkjhKgfCSCBnkLKdhg
todo 這些使用的方法，列入github的教學主題 2021/1/13
- 邊學邊用: 不用全部學完才用。邊學邊用，能學得更好。用之後，才有動機學更多更深入、學更好。
- 打卡: 那個daily usage graph 像打卡機制一樣，讓人有成就想去持續做。(我們學程式，也可用一樣的作法)
- 手機 APP + Browser
  - Q: App為何沒有 contributions graph? A: 可在Chrome用手機看到
  - Q: App要如何改README. md A: 可在Chrome裡用手機修改
- Q: 那GitHub App能做什麼? 只能 create issue嗎？
  - A: 其實只適合view，如果想改code可在手機chrome裡修改
  - (GitHub App可看完後，將 repo share時複製網址，再於chrome裡貼網址修改)


如何 reset
----------
`git add .` 之後如果後悔, 只要在 `git commit` 之前, 都可以 `git reset`
比如說, Unity 的專案會產生大量不需備份的檔案, 可以使用 .gitignore 來排除。但是如果不小心忘了把 .gitignore 放在正確的 Unity 專案目錄中, 就會在 `git add .` 時, 看到大量的檔案被加入。這時候, 可以使用 `git reset` 來放棄剛剛的 `git add .` 動作。

Reference: https://www.freecodecamp.org/news/how-to-undo-a-git-add/

commit還原
---------
回憶一下, 我如何在 git 中將錯誤的 commit 還原。 2021/1/29

事由: 我想要在特定時間 commit , 結果忘記了。想要時間還原, 可以嗎?

基礎: 已經會

關於 commit 後悔
https://xken831.pixnet.net/blog/post/478332482
1. Git Bash, 到專案目錄中,
2. `git reset --hard commitID`
3. `git push -f`

關於 commit 後悔
https://gitbook.tw/chapters/using-git/reset-commit.html
1. `git log --oneline` 可以秀出 commitID
2. `git reset HEAD^` 或 `git reset master^` 或 `git reset` 查出想要的commitID
3. reset 有幾種模式: Mixed - keep working copy but reset index
3.1. --mixed 工作目錄不變, Stage丟掉
3.2. --soft 只移 HEAD, 不丟檔(工作目錄不變,Stage不變)
3.3. --hard 將工作區、暫存區(Stage)的檔案都丟掉
3.4. 名詞中文翻譯: 工作目錄(working directory) --git add--> 暫存區(staging rea) --git commit--> 儲存庫(repository)

關於 `git reset HEAD^` 的 ^符號出問題
https://stackoverflow.com/questions/14203952/git-reset-asks-more
Windows cmd.exe 裡,  ^ 是特殊符號, 所以
`git reset HEAD^` 要改成
`git reset HEAD^^`
或是 `git log Head~1`
或是 `git reset "Head^"`
或是改用 Git Bash

關於 --hard
`git reset --hard "HEAD^"`


關於 reflog
https://gitbook.tw/chapters/using-git/restore-hard-reset-commit.html
1. `git reflog` 可看到之前 `git reset --hard` 刪掉的 commitID 及檔案
2. 這時再 `git reset --hard commitID` 到你要的那個 commitID即可

什麼是 commitID

操作歷史記錄
----------
```
>doskey /history
dir
cd code
dir
cd ad
dir
cd unityPBD
dir
more .gitignore
dir
copy ..\README.md .
start .
git status
git diff
cd ..
cd glutPBD
dir
notpad glutPBD.layout
notepad glutPBD.layout
git diff
git status
more README.md
start .
git status
git commit -m "finish unityPBD - one spring version
git add .
git commit -m "finish unityPBD - one spring version
git add .
git status
cd ..
git add .
git status
git commit -m "finish unityPBD - one spring version
git push
git status
git diff
dir
cd glutPBD
dir
notepad glutPBD.layout
git status
cd ..
git status
git diff
git status
git diff
doskey /history

C:\Users\User\code\ad>


C:\Users\User\code\marbling>doskey /history
git clone https://github.com/jsyeh/marbling
cd marbling
git log
git log --online
git log --oneline
git reset 0f692ea
git status
git pupsh
git push
git status
git reflog
cd ..
cd code
cd marbling
dir
git reflog
git status
git reset 0f692ea
git reset 0f692ea --hard
git help push
git
git push
git push -f
git status
git diff
git status
git diff
git status
git add .
git status
git diff
git add .
git status
git log
git log --oneline
git diff
git add .
doskey /history

C:\Users\User\code\marbling>



C:\Users\User\code\marbling>git log --oneline
6180db2 (HEAD -> main, origin/main, origin/HEAD) Update README.md
19104b5 update README.md - MOST list
3271516 update README.md - MOST list
5a4f6e0 update README.md - recover
20ba054 add step05_CircularTineLineFunction
e7fc940 add step05_CircularTineLineFunction
0f692ea add step04_WaveFunc
3037c5a modify step03_TineLineFunc with undo
6c4fcb1 add step03_TineLineFunc
37bb434 toggle bSimpleInkDrop for simple/deformation
83734d1  MathMarbling/README.md - Step02, TODO
0573c47 add step02_DropInkFunction
9375e9e Update README.md - More Details
f9e8e59 Update README.md ( angle in for loop)
b9cfe66 Update README.md with More Detail
63694c5 update step01_ArrayList_PVector README.md and comments
64251f1 add step01_ArrayList_PVector
3be8f99 add step01_ArrayList_PVector
751b662 add step00_ManyEllipse
017117a add step00_ManyEllipse
82e88f2 Introduction to Mathematical Marbling
1b87bc7 download Jaffer's Mathematical Marbling paper
02c533d Update README.md
5b4671e Initial commit

C:\Users\User\code\marbling>g

C:\Users\User\code\marbling>doskey /history
git diff
git commit -m "add step05_CircularTineLineFunction" --date="2021-01-25 13:00:00"
git add .
git status
git commit -m "add step05_CircularTineLineFunction" --date="2021-01-25 13:00:00"
git push
git pull
git reflog
git status
git log
git status
git add .
git status
dir
more README.md
notpad README.md
notepad README.md
git status
git diff
git commit -m "add step05_CircularTineLineFunction" --date="2021-01-25 13:00:00"
gi status
git status
git add .
git commit -m "add step05_CircularTineLineFunction" --date="2021-01-25 13:00:00"
git status
git log
git push
git commit -m "update README.md - recover
git status
git push
dir
cd ..
notepad README.md
git commit -m "update README.md - MOST list" --date="2021-01-26 13:00:00"
git push
git commit -m "update README.md - MOST list" --date="2021-01-26 13:00:00"
git push
git status
git add .
git diff
git status
git diff
git status
git diff
git commit -m "Update README.md" --date="2021-01-27 13:00:00"
git status
git push
git log
git log --oneline
doskey /history

C:\Users\User\code\marbling>




C:\Users\User\marbling\MathMarbling>doskey /history
cd marbling
dir
git pull
git status
more README.md
dir
git status
git diff
git log
git reflog
git log
git status
git diff
notepad README.md
cd MathMarbling
notepad README.md
doskey /history

C:\Users\User\marbling\MathMarbling>
```