系計中
, Git
, 簡報
, 教學
現在 Git 儼然已成為必備技能,你真的懂 Git 嗎?
Git 的發明原本是用來管理 Linux Kernel 的,這樣子的分散式版本控管程式是如何滿足存在於世界各地廣大的 Linux 開發者的,它的優勢在哪,為何逐漸熱門起來了呢?
20% 的 git 指令就足以應付平日 80% 的工作了
- 高見龍
※ 本次教學使用的圖片或內容都是從 掌握 Git & Github 程式時光機 教學中取出的。
※ 所以本簡報單純僅供本次 WorkShop 使用,如需轉載請自行研究相關授權問題。
WorkShop 須知:
起手式:
git init
git config --list
git config --global user.email "你的mail"
git config --global user.name "君の名は"
git add . // 加入所有檔案索引
git status // 檢查狀態
git commit -m '修改紀錄' //提交更新
git log // 查詢紀錄
git add 檔案
新增進索引。git status
來觀察索引的狀態。git commit -m '修改紀錄'
來加進 Local Respository 內。git log
來做紀錄的查詢。使用 .gitignore 來忽略不想 commit 的檔案
test.html #
*.html # 忽略全部的 HTML 檔案
css/ # 忽略 css 資料夾
gitignore大全 - 這邊有官方提供的各種例子
# 取消索引
git reset HEAD // 全部檔案取消索引
git reset HEAD 檔案名稱 // 單一檔案取消索引
# 還原檔案
git checkout 檔案名稱 // 恢復單一檔案到最新的 commit
git reset --hard
Github 就是遠端的 Respository
Github 免費的帳號只能開 public 的 Respository,如果需要 private 的 Respository,則需要收錢,這邊介紹了一個免費可以開私人數據庫的網站 Bitbucket,但依然有其限制,
git clone URL
將遠端 Respository 複製到本地端git add
和 git commit
將此版本加入本地的 Respositorygit push
這指令,這樣 github 上的 Respository 就會出現你剛剛新增檔案的那個版本了使用 github 來找函示庫跟插件的好處在於,可以清楚知道他是否還有在維護,也可以從星星數來看該專案的熱門程度
GitHub 可以直接顯示靜態網頁,在 Settings > GitHub Pages 選擇 Source 為網頁所在的分支,這樣就 OK 了
範例:我的個人頁面
- 範例分支圖網址
先給先觀念:
衍生提醒:
1.變數命名的重要性 2.Coding Style 的重要性 …
HEAD:目前所在位置的指標
git branch // 瀏覽目前分支
git checkout // commit前4碼
// ex: 要查看的 commit 紀錄 id 為 ca6c374ac6d4b4afd19ec885a07b3f75a44b0ec6
// 只要下 git checkout ca6c 就好
git checkout master // 切換回 master
git branch 分支名 // 建新的分支
git checkout 分支名 // 切換到該分支
git checkout -b 分支名 // 建立新的分支後直接切換到該分支
git merge 別的bramch // 將別的 branch 合併到當前分支
講一個環境比較單純的,在 master 未做任何 commit 時將 branch 合併回來,使用一些 git GUI 來看會是一條線。
如果你是 Mac 或 Linux 開發者,在下一篇會需要使用到編輯器來寫 merge 的更新訊息,
在未指定編輯器的情況下,會出現 vim 的編輯器 此時已會預設帶好 commit 的內容,只要依序輸入以下文字:
:wq!
就可離開
當分支切出去後 master 有 commit,這時如果要 merge 分支時,在沒衝突的情況下會自動合併,使用 command line 執行的情況下,會跳出 merge 時的 commit 資訊,此時如上面提到的使用 :wq
離開後就 OK 了,如果需要更改 commit 資訊也可以直接在這邊修改。
在合併時如果修改到一樣的行數,就會跳出 conflicts
,這時點開衝突的檔案會看到
<<<<<<< HEAD
衝突程式(目前所在分支)
=======
衝突程式(分支上的)
>>>>>>> YourBranch
修改完後儲存,新增索引後在 commit 就完成合併了(最好 commit 時註明這是 merge)
標籤的功能可以讓你在眾多的 commit 當中知道重要的 commit,也能夠直接 checkout 過去。
git tag // 查詢標籤(只看到有哪些標籤)
git tag -n // 查詢詳細標籤(還能看到標籤備註)
git tag -d 標籤名稱 // 刪除標籤
git tag 標籤名稱 // 新增輕量標籤
git tag -am "備註內容" 標籤名稱 // 新增標示標籤
git checkout 標籤名稱 // 切換到標籤的 commit
開發過程中如果突然需要先做其他事情,但還沒 commit 不能切換分支,所以可以先把暫存暫存下來,等到其他事情做完後,切回來此分支後就可以再拿出來繼續做。
git stash // 暫時儲存當前目錄
git stash list // 瀏覽 git stash 列表
git stash pop // 還原暫存
git shash drop // 清除最新暫存
git stash clear // 清除全部暫存
遠端數據庫預設名稱是 origin,可以使用 git remote
來查看,所以當你直接使用 git push
時他會不知道你要推到哪一個,所以平常在 push 時我都會使用,git push origin master
。
前面教學之所以使用 git push
能夠成功,是因為預設會追蹤 master,所以 git push
時他會使用預設的 master,但當你在分支時就無法直接這樣推。
# 如何推送分支到遠端數據庫
git remote // 查詢遠端數據庫
git remote rename 原名稱 修改名稱 // 修改遠端數據庫名稱
git push origin master
[預設遠端主機名稱] [分支名稱]
git pull
。git fetch
。※ 兩者的差異會在後續最進一步說明
實作上會在 feature 做完你負責的部分後再 merge 回 develop 後,當這部分進度都完成後,才會將 develop merge 回 master。
※ 溝通很重要!!
當練習完 pull 時,可以知道他就是將遠端的分支將你的本地分支進行合併 merge 的動作,但有時候你不希望 pull 下來導致自己的數據庫太亂又擔心有衝突時,可以先使用下面這個指令。
git fetch origin(遠端數據庫) branch1(遠端分支)
此時你的分支會多一個 FETCH_HEAD 的分支,這個就是遠端數據庫的分支,可以等到你看過沒問題後,再合併 FETCH_HEAD 也 ok。
如果你想要參與一個你沒有推送權限的專案,你可以「fork」一份。這代表說 GitHub 會複製一份這個專案的副本給你,並且你對這副本有全部的權限。這副本會存在於你的帳號下,你可以對它進行推送。
(來源:GitHub - 參與一個專案)
一般情況下就是照著下面的程序運作的:
從 master 建立一個主題分支。
加入一些變更來改善這個專案。
把這個分支推送到你的 GitHub 專案。
在 GitHub 上建立一個 Pull Request
。
討論,並在需要的時候加入新的變更。
專案擁有者視情況決定要把這個 Pull Request 合併進原始專案,或是關閉它。
你可能會遇到的問題:
我 Fork 後,如果那個專案更新了,那我該如何更新我自己的專案。
A:設定 upstream
git remote add upstream https://github.com/otheruser/repo.git
再看一次 remote
git remote -v
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
upstream https://github.com/otheruser/repo.git (fetch)
upstream https://github.com/otheruser/repo.git (push)
更新 upstream
git fetch upstream
git fetch upstream feature/test // 更新特定分支
當你改完 code 後,就可以 push 回 "你的" 遠端數據庫。
這時點選在 GitHub 上的 Pull Request
按鈕(記得推回去的分支要選好)。
最後等作者 review 後覺得 OK 了,就可以把你的 PR Merge 回那個專案了。
本次 WorkShop 教了些基礎的 Git 指令,但 Git 還有更多的功能可以使用,這便舉個小例子
git cherry-pick commit編號