Git
是一個免費且開源的版本控制
系統,是目前最爲流行的源代碼管理
工具,本篇文章從Git
的基本指令到進階操做,包含了使用Git
的過程當中遇到的大部分大小問題
設置用戶名和郵箱
前端
$ git config --global user.name "用戶名" $ git config --global user.email "郵箱" - 其中,--global 是全局設置,若是想對特定項目使用不一樣配置,可取消該參數 - git config 還能夠設置其餘選項,由於平時不怎麼用,因此詳細能夠參考 git config --help
查看配置
node
$ git config --list # 查看 Git 的某一項配置 $ git config user.name
建立 SSH Key
git
$ ssh-keygen -t rsa -C "郵箱" # 而後會在用戶主目錄下,發現 .ssh 目錄,其中包含 id_rsa 和 id_rsa.pub 兩個文件 # id_rsa.pub 是 SSH Key 公鑰,將其添加到 github 的 SSH keys 中,就能夠將本地倉庫推送到遠程倉庫了
# 初始化倉庫 $ git init # 將源代碼提交到暫存區 $ git add . # 提交暫存區的源代碼 $ git commit -m "本次提交說明" # 查看當前狀態 $ git status $ git status -sb // 查看 branch 和 short status # 查看提交歷史 $ git log
# 克隆 $ git clone 倉庫地址 # 遠程倉庫 $ git remote # 分支 $ git branch 分支名 // 建立 $ git checkout 分支名 // 切換 # 合併 $ git merge 分支名 # 拉取更新 $ git fetch 主機名 分支名 // 不合並 $ git pull 主機名 分支名 // 合併 # 推送 $ git push 主機名 分支名 # 打標籤 $ git tag -a 版本號 -m "版本說明"
經過 HTTPS
訪問 Git
遠程倉庫時,若是服務器的 SSL
證書未通過第三方機構簽署,那麼 Git
就會阻止這一操做github
$ env GIT_SSL_NO_VERIFY=true git clone 倉庫地址 $ cd 倉庫名稱 $ git config http.sslVerify "false" - 使用 env 命令保證了忽略證書錯誤只應用於這次克隆
當有未提交的修改,執行 切換分支
或 拉取更新
須要倉庫狀態保持 clean
的一些操做時,可使用 git stash
將目前的修改臨時儲藏起來web
# 儲藏 $ git stash # 查看儲藏 $ git stash list # 應用最近儲藏並刪除 $ git stash pop # 應用指定儲藏不刪除 $ git stash apply [儲藏名] # 移除儲藏 $ git stash drop 儲藏名
對於 工做區
和 暫存區
的修改,咱們不能保證上次操做是完美的,git
就是這麼強大,提供了不少 反悔
的操做vim
# 丟棄暫存區的文件,放回工做區 $ git reset HEAD 文件 # 丟棄工做區的修改 $ git checkout -- 文件 - 修改後沒添加到暫存區,則撤銷到 git commit 時的狀態 - 修改後添加到暫存區,則撤銷到 git add 時的狀態 # 覆蓋上次提交 $ git commit --amend [-m "本次提交說明"]
# 回退到以前的某次提交 $ git reset --hard commit_id - HEAD 指向當前版本 - git log 能夠查看提交歷史,以便肯定要回退到哪一個版本 - git reflog 能夠查看命令歷史,以便肯定要回到將來的哪一個版本 # 撤銷一個已經提交 $ git revert commit_id - 並無從項目歷史中移除這個 commit, 而是生成一個新的 commit
Git
有不少優勢,其中 分支使用方便
就是很顯著的一條,建立倉庫的時候,master
是默認的分支,通常,咱們會建立其餘的分支在上面進行開發,完後再將它們合併到主分支上來服務器
# 建立開發分支 $ git branch dev # 建立並切換到開發分支 $ git checkout -b dev # 切換回主分支 $ git checkout master # 快速檢出上一個分支 $ git checkout - # 查看全部分支 $ git branch -a # 查看合併到當前分支的分支列表 $ git branch --merged # 查看還沒合併到當前分支的分支列表 $ git branch --no-merged # 刪掉臨時分支 $ git branch -d fix # 將開發分支推送到遠程倉庫 $ git push origin dev # 重命名分支 $ git branch -m dev develop # 刪除遠程分支 - $ git push origin --delete 分支名 - $ git push origin :分支名
軟件要發佈一個新的版本的時候,咱們一般給它打個 tag
app
# 打標籤 $ git tag [-a] 標籤名 [-m 附註信息 某次提交的id] # 推送標籤到遠程倉庫 $ git push origin 標籤名 $ git push origin --tags // 推送全部標籤 # 刪除本地標籤 $ git tag -d 標籤名 # 刪除遠程標籤 $ git push origin --delete 標籤名 $ git push origin :refs/tags/標籤名
# 花式查看提交 $ git log --pretty=oneline // 只顯示一行 $ git log --abbrev-commit // 只顯示 SHA-1 的前幾個字符 $ git log --graph // 顯示 ASCII 圖形表示的分支合併歷史 $ git log --relative-date // 使用較短的相對時間顯示 $ git log --name-only // 僅在提交信息後顯示已修改的文件清單 $ git log -n // 顯示最近的 n 條提交 $ git log --author=fengshangwuqi // 僅顯示指定做者相關的提交 $ git log --grep // 僅顯示含指定關鍵字的提交 # 沒有任何改動的提交 git commit -m "a no chnage commit" --allow-empty 主要用於一下情形: - 標記新的工做或一個新功能的開始 - 記錄對項目的跟代碼無關的改動 - 跟使用你倉庫的其餘人交流 - 做爲倉庫的第一次提交,由於第一次提交後不能被 rebase
$ git pull = git fetch + git merge $ git pull --rebase = git fetch + git rebase
# 相同點 整合的最終結果所指向的快照是同樣的 # 不一樣點 ## 提交歷史不一樣 - merge 會生成一個新的 commit 節點,提交歷史忠實地記錄了實際發生過什麼 - rebase 不會產生額外的 commit 節點,提交歷史反映了項目過程當中發生了什麼 ## 衝突處理策略不一樣 - merge 碰見衝突後會直接中止,等待手動解決衝突並從新提交後,才能再次 merge - rebase 碰見衝突後會暫停當前操做,開發者能夠選擇手動解決衝突,而後 git rebase --continue 繼續,或 --skip 跳過,或 --abort 中止 # 注意事項 ## 推薦 git merge 結合 --no-ff 一塊兒使用 - git merge 默認是 fast forward(快速合併),適用於分支 B 從分支 A 從 checkout 出來後,分支 A 沒有 commit - 若是分支 B 被 checkout 出來後,分支 A 也有修改,那麼就無法快速前進合併,會額外創建一個 merge commit,對分支 A 和分支 B 作一個合併操做,即 --no-ff,它的好處是保持了分支的結構
對於 操做系統自動生成
的文件,編譯生成
的中間文件,以及帶有 敏感信息
的配置文件等,咱們不想追蹤,也不想放進咱們的遠程倉庫中,這時,咱們建立一個 .gitignore
文件來忽略上述文件,下面是一個前端工程忽略的文件參考ssh
# Logs logs *.log # Runtime data pids *.pid *.seed *.DS_Store # testing coverage # Dependency directory node_modules # Bower bower_components/ dist # WebStorm文件 *.idea/ # vscode文件 .vscode/ # Emacs .tern-port .#* *# *~ # vim .agignore # 敏感信息 default.yml
好的 Commit message
能夠提供更多的歷史信息,方便 快速瀏覽和查找
,還能夠直接生成 Change log
,通常至少包含 type
和 subject
,type 是 commit 的類別,subject 是 commit 的簡短描述curl
## type - feat:添加新功能 - fix:修補缺陷 - docs:修改文檔 - style: 修改格式 - refactor:重構 - perf:優化 - test:增長測試 - chore:構建過程或輔助工具的變更 - revert:回滾到上一個版本
除此以外,有興趣的同窗還能夠添加 gitmoji 和 validate-commit-msg 等更多內容
若是某個提交修復了一個 Issue
,當提交到某個分支時,提交信息裏可使用 fix/fixes/fixed
, close/closes/closed
或者 resolve/resolves/resolved
等關鍵詞,後面再跟上 Issue
號,這樣就會關閉這個 Issue
$ git commit -m "fix: ..., fix #1, #2"
這將會關閉 Issue #1 和 #2
,而且在 Issue
討論列表裏關聯引用此次提交
若是想連接 其餘倉庫的 Issue
,則使用 {user}/{repo}#ISSUE_NUMBER
在建立一個倉庫時,Github
會爲你提供一個預置的軟件許可證列表
若是此時沒有選擇,後來能夠經過 web 界面 create new file
,輸入 LICENSE
,點擊右側的 choose a license template
來添加
Octotree
:提供項目目錄GitHub Plus
:提供每一個文件的大小和下載連接GitHub Hovercard
:懸停在用戶頭像或倉庫地址上時,經過懸浮框提供更多信息Sourcegraph for GitHub
:提供 IDE 上經常使用的功能操做Awesome Autocomplete for GitHub
:提供更強大的智能搜索Isometric Contributions
:更友好地展現提交記錄Git.io 是 Github 的 短網址
服務
你能夠經過 Curl
命令以普通 HTTP
協議使用它
$ curl -i https://git.io -F "url=https://github.com/..." HTTP/1.1 201 Created Location: https://git.io/abc123 $ curl -i https://git.io/abc123 HTTP/1.1 302 Found Location: https://github.com/...
Gists 方便咱們管理代碼片斷,沒必要使用功能齊全的倉庫
Gist
能夠很是方便地獲得便於嵌入到其餘網站的 HTML 代碼
並且,Gists
能夠像任何標準倉庫同樣被克隆,你能夠像 Github
倉庫同樣去修改和更新 Gists
,只不過,Gists
不支持目錄,全部文件都添加在倉庫的根目錄下
github 倉庫頁面
提供了一些 快捷鍵
方便你們快速導航,按 ?
能夠查看當前頁面支持的 快捷鍵列表
咱們在 Pull Requests
, Issues
, commit
, Markdown
文件中能夠加咱們喜歡的表情,使用方法以下
:name_of_emoji:
好比 :joy:
會返回一個
更多表情,可參考 emoji-cheat-sheet
其中,可能經常使用的表情有
:tada:
:sparkles:
:bug:
: :white_check_mark:
: :wrench:
:ok_hand:
:construction_worker:
:whale:
:clap:
關於 Git
,若是還有 更有意思的內容或問題
,歡迎在評論中交流