作者 | 梁雲1991
來源 | Python與算法之美
頭圖 | CSDN付費下載自視覺中國
GitHub是什麼
GitHub是一個非常流行的全球代碼託管平台,基於Git版本控制技術實現,同時GitHub也是一個活躍的開發者交流社區。許多的開源項目都在GitHub上發布。例如著名的Linux作業系統內核的原始碼。
Git是什麼
Git是目前世界上最先進的分布式版本控制系統(沒有之一)。
它由Linux系統之父Linus Torvalds在2005年用C語言開發。
Git是一個分布式版本控制系統,沒有中央伺服器,不同於svn等需要中央伺服器的集中式版本控制系統。
Git的功能:版本控制(版本管理,遠程倉庫,分支協作)
人工版本管理:
Git版本管理:
Git功能原理
git版本控制系統由工作區,緩存區,版本庫組成。
git跟蹤的是文件的修改而不是全部文件。
git擅長管理代碼等文本文件,不擅長管理圖片等二進位文件。
快速上手
安裝Git
下載位置: Git下載連結—— https://git-scm.com/downloads
可以在bash中執行git命令,也可以在Jupyter Notebook中執行.
配置用戶信息
git config --global user.name "XX"git config --global user.email "XX@XX"
新建文件夾並切入
mkdir git-learncd git-learn
創建倉庫
git init
新建readme.txt
echo "hello world" >>readme.txt
查看當前狀態:
git status
添加全部修改到暫存區並提交
git add -Agit commit -m"comment"
添加github遠程庫並推送倉庫
git remote add origin https://github.com/XX/XXgit push -u origin master
在github上的項目clone到本地文件
git clone https://github.com/XX/XX ../XX
安裝配置
命令列表:
config(配置信息)
init(創建倉庫)
help(幫助信息)
status(當前狀態)
特殊文件:
gitignore過濾文件(配置git無需管理的目錄和文件)
示範1:基本配置
#設置用戶名:
git config --global user.name "XXX"
#設置用戶郵箱:
git config --global user.email "XXX@XX"
#初始化倉庫
git init
示範2:獲取幫助
#獲取常用git命令列表:
git help
#查看當前狀態,獲取提示:
git status
示範3:建立.gitignore過濾配置文件
#過濾掉.DS_store文件
echo ".DS_store" >.gitignore
#過濾掉.ipynb_checkpoints目錄
echo ".ipynb_checkpoints/" >> .gitignore
#過濾掉所有zip文件
echo "*.zip" >>.gitignore
版本管理
命令列表:
add(修改暫存)
commit(提交修改)
reset(版本回退)
checkout(撤銷修改)
rm(刪除文件)
diff(比較文件)
log(版本列表)
reflog(版本歷史)
git reset的說明:
git resetHEAD^ #可以回退到上一個版本。git reset HEAD^^ #可以回退到上上個版本。git reset a234b3 #可以回退到版本號為 a234b3的版本。git reset --hard head^ #修改版本庫,保留暫存區,保留工作區git reset --mixed head^ #修改版本庫,修改暫存區,保留工作區git reset --soft head^ #修改版本庫,保留暫存區,保留工作區
示範1:版本提交
echo"hello world" >>readme.txtgit add readme.txtgit add -Agit commit -m"add readme.txt"#修改覆蓋上一次commit:git commit --amend#先暫存再提交:git commit -a -m"modify readme.txt"
示範2:版本回退
git reset--hard head^git reset head a23b5#撤銷修改:git checkout -- readme.txt#圖形顯示倉庫版本及分支狀態:git log --oneline --graph --all#查看head指向過的版本歷史:git reflog
示範3:日誌壓縮
git reset--soft a23b5 #版本庫回退到某個版本,工作區保留修改git commit -m 'add feature' #將工作區的修改寫到版本庫中,a23b5到當前的日誌被刪除
示範4:撤銷修改
echo "hello Haidian">>readme.txtgit checkout -- readme.txt #使用暫存區內容覆蓋文件
示範5:版本對比
#查看工作區文件與暫存區文件區別:git diff readme.txt#查看工作區文件和head文件區別:git diff --head readme.txt#查看暫存區文件與head文件區別:git diff --cached readme.txt#查看兩個版本某一文件的區別:git diff a458b d23e5 -- readme.txt
遠程倉庫
命令列表:
remote(設置遠程)
push(推送遠程)
clone(克隆遠程)
pull(合併遠程)
fetch(拉取遠程)
遠程倉庫說明:
#通常可以用SSH協議和遠程庫通信或使用http協議和遠程庫通信。#http協議較為方便,但SSH協議方式速度較快。#運行下面命令,並一路回車,在用戶主目錄里找到.ssh目錄。ssh-keygen -t rsa -C "your_emial@xxx.com"#目錄下的id_rsa有私鑰,不能泄露出去。裡面的id_rsa.pub是公鑰,可分享給別人。#在GitHub——> settings ——> SSH Keys 頁面添加SSH公鑰。#將公鑰綁定github後嘗試建立SSH連接:ssh -T git@github.com
示範1:添加遠程
#使用ssh地址添加github遠程庫連接並命名為github,ssh方式更穩定快速,但稍麻煩:git remote add github git@github.com:lyhue1991/ai.git:#使用url地址添加遠程庫,url方式更簡單:git remote add origin https://github.com/lyhue1991/GitHub.git
示範2:推送到遠程
#推送本地至遠程庫origin的master分支:git push -u origin master#查看遠程庫信息:git remote -v#移除和遠程庫的連接:git remote remove orgin
示範3:拉取遠程
#建立當前master分支與遠程庫develop分支的追蹤關係:git branch --set-upstream master origin/develop#將遠程倉庫克隆到本地父目錄的ML文件夾:git clone https://github.com/lyhue1991/machine-learning.git ../ML
#取回origin的develop分支與當前master分支合併(或會衝突):git pull orgin/develop:master
#獲取origin的develop分支到本地並用merge合併(pull≈fetch+merge):git fetch origin developgit merge origin/develop
分支協作
命令列表:
branch(設置分支)
checkout(切換分支)
merge(合併分支)
cherry-pick(採集提交)
rebase(重演分支)
stash(儲藏管理)
tag(標籤管理)
示範1:切換分支
#查看分支信息:git branch#當前head位置新建develop分支:git branch develop#創建並切換到名稱為feature的新分支:git checkout -b feature#切換至master分支:git checkout master
示範2:分支整合
#head處於develop分支,合併feature分支(或會衝突):git merge --no-ff -m"merge feature" feature#採集其它分支中版本號為a458b的commit提交至當前分支(或會衝突):git cherry-pick a458b#使用當前所在分支作為base重演develop分支(或會衝突):git rebase develop
示範3:儲藏和標籤
gitstash;git stash pop;git stash list;git stash save "message"git stash apply @2git tag;git tag v1.0;git tag v0.9 a2543d;#推送標籤到遠程(標籤不會自動推送)git push origin v1.0#刪除遠程標籤(先刪本地,再push):git tag -d v0.9git push origin :refs/tags/v0.9
git分支管理最佳實踐:
master: 主分支,主要用來版本發布。
develop:日常開發分支,該分支正常保存了開發的最新代碼。
feature:具體的功能開發分支,只與 develop 分支交互。
release:release 分支可以認為是 master 分支的未測試版。比如說某一期的功能全部開發完成,那麼就將 develop 分支合併到 release 分支,測試沒有問題並且到了發布日期就合併到 master 分支,進行發布。
hotfix:線上 bug 修復分支。