30分鐘吃掉Git和GitHub常用操作
一,GitHub是什么
GitHub是一個非常流行的全球代碼托管平臺,基于Git版本控制技術(shù)實現(xiàn),同時GitHub也是一個活躍的開發(fā)者交流社區(qū)。許多的開源項目都在GitHub上發(fā)布。例如著名的Linux操作系統(tǒng)內(nèi)核的源代碼。
公眾號后臺回復(fù)關(guān)鍵字:"Git",獲取本文markdown源碼和Git免費(fèi)視頻教程。

二,Git是什么
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)。
它由Linux系統(tǒng)之父Linus Torvalds在2005年用C語言開發(fā)。
Git是一個分布式版本控制系統(tǒng),沒有中央服務(wù)器,不同于svn等需要中央服務(wù)器的集中式版本控制系統(tǒng)。
Git的功能:版本控制(版本管理,遠(yuǎn)程倉庫,分支協(xié)作)
人工版本管理:

Git版本管理:

三,Git功能原理
git版本控制系統(tǒng)由工作區(qū),緩存區(qū),版本庫組成。 git跟蹤的是文件的修改而不是全部文件。 git擅長管理代碼等文本文件,不擅長管理圖片等二進(jìn)制文件。

四,快速上手
1,安裝Git
下載位置: Git下載鏈接—— https://git-scm.com/downloads
可以在bash中執(zhí)行g(shù)it命令,也可以在Jupyter Notebook中執(zhí)行.
2,配置用戶信息
git config --global user.name "XX"
git config --global user.email "XX@XX"
3,新建文件夾并切入
mkdir git-learn
cd git-learn
4,創(chuàng)建倉庫
git init
5,新建readme.txt
echo "hello world" >>readme.txt
6,查看當(dāng)前狀態(tài):
git status
7,添加全部修改到暫存區(qū)并提交
git add -A
git commit -m"comment"
8,添加github遠(yuǎn)程庫并推送倉庫
git remote add origin https://github.com/XX/XX
git push -u origin master
9,在github上的項目clone到本地文件
git clone https://github.com/XX/XX ../XX
五,安裝配置
命令列表:
config(配置信息) init(創(chuàng)建倉庫) help(幫助信息) status(當(dāng)前狀態(tài))
特殊文件:
.gitignore過濾文件(配置git無需管理的目錄和文件)
示范1:基本配置
#設(shè)置用戶名:
git config --global user.name "XXX"
#設(shè)置用戶郵箱:
git config --global user.email "XXX@XX"
#初始化倉庫
git init
示范2:獲取幫助
#獲取常用git命令列表:
git help
#查看當(dāng)前狀態(tài),獲取提示:
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 reset HEAD^ #可以回退到上一個版本。
git reset HEAD^^ #可以回退到上上個版本。
git reset a234b3 #可以回退到版本號為 a234b3的版本。
git reset --hard head^ #修改版本庫,保留暫存區(qū),保留工作區(qū)
git reset --mixed head^ #修改版本庫,修改暫存區(qū),保留工作區(qū)
git reset --soft head^ #修改版本庫,保留暫存區(qū),保留工作區(qū)
示范1:版本提交
echo "hello world" >>readme.txt
git add readme.txt
git add -A
git 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
#圖形顯示倉庫版本及分支狀態(tài):
git log --oneline --graph --all
#查看head指向過的版本歷史:
git reflog
示范3:日志壓縮
git reset --soft a23b5 #版本庫回退到某個版本,工作區(qū)保留修改
git commit -m 'add feature' #將工作區(qū)的修改寫到版本庫中,a23b5到當(dāng)前的日志被刪除
示范4:撤銷修改
echo "hello Haidian">>readme.txt
git checkout -- readme.txt #使用暫存區(qū)內(nèi)容覆蓋文件
示范5:版本對比
#查看工作區(qū)文件與暫存區(qū)文件區(qū)別:
git diff readme.txt
#查看工作區(qū)文件和head文件區(qū)別:
git diff --head readme.txt
#查看暫存區(qū)文件與head文件區(qū)別:
git diff --cached readme.txt
#查看兩個版本某一文件的區(qū)別:
git diff a458b d23e5 -- readme.txt

七,遠(yuǎn)程倉庫
命令列表:
remote(設(shè)置遠(yuǎn)程) push(推送遠(yuǎn)程) clone(克隆遠(yuǎn)程) pull(合并遠(yuǎn)程) fetch(拉取遠(yuǎn)程)
遠(yuǎn)程倉庫說明:
#通??梢杂肧SH協(xié)議和遠(yuǎn)程庫通信或使用http協(xié)議和遠(yuǎn)程庫通信。
#http協(xié)議較為方便,但SSH協(xié)議方式速度較快。
#運(yùn)行下面命令,并一路回車,在用戶主目錄里找到.ssh目錄。
ssh-keygen -t rsa -C "[email protected]"
#目錄下的id_rsa有私鑰,不能泄露出去。里面的id_rsa.pub是公鑰,可分享給別人。
#在GitHub——> settings ——> SSH Keys 頁面添加SSH公鑰。
#將公鑰綁定github后嘗試建立SSH連接:
ssh -T [email protected]
示范1:添加遠(yuǎn)程
#使用ssh地址添加github遠(yuǎn)程庫連接并命名為github,ssh方式更穩(wěn)定快速,但稍麻煩:
git remote add github [email protected]:lyhue1991/ai.git:
#使用url地址添加遠(yuǎn)程庫,url方式更簡單:
git remote add origin https://github.com/lyhue1991/GitHub.git
示范2:推送到遠(yuǎn)程
#推送本地至遠(yuǎn)程庫origin的master分支:
git push -u origin master
#查看遠(yuǎn)程庫信息:
git remote -v
#移除和遠(yuǎn)程庫的連接:
git remote remove orgin
示范3:拉取遠(yuǎn)程
#建立當(dāng)前master分支與遠(yuǎn)程庫develop分支的追蹤關(guān)系:
git branch --set-upstream master origin/develop
#將遠(yuǎn)程倉庫克隆到本地父目錄的ML文件夾:
git clone https://github.com/lyhue1991/machine-learning.git ../ML
#取回origin的develop分支與當(dāng)前master分支合并(或會沖突):
git pull orgin/develop:master
#獲取origin的develop分支到本地并用merge合并(pull≈fetch+merge):
git fetch origin develop
git merge origin/develop 八,分支協(xié)作
命令列表:
branch(設(shè)置分支) checkout(切換分支) merge(合并分支) cherry-pick(采集提交) rebase(重演分支) stash(儲藏管理) tag(標(biāo)簽管理)
示范1:切換分支
#查看分支信息:
git branch
#當(dāng)前head位置新建develop分支:
git branch develop
#創(chuàng)建并切換到名稱為feature的新分支:
git checkout -b feature
#切換至master分支:
git checkout master
示范2:分支整合
#head處于develop分支,合并feature分支(或會沖突):
git merge --no-ff -m"merge feature" feature
#采集其它分支中版本號為a458b的commit提交至當(dāng)前分支(或會沖突):
git cherry-pick a458b
#使用當(dāng)前所在分支作為base重演develop分支(或會沖突):
git rebase develop
示范3:儲藏和標(biāo)簽
git stash;
git stash pop;
git stash list;
git stash save "message"
git stash apply @2
git tag;
git tag v1.0;
git tag v0.9 a2543d;
#推送標(biāo)簽到遠(yuǎn)程(標(biāo)簽不會自動推送)
git push origin v1.0
#刪除遠(yuǎn)程標(biāo)簽(先刪本地,再push):
git tag -d v0.9
git push origin :refs/tags/v0.9
git分支管理最佳實踐:
master: 主分支,主要用來版本發(fā)布。 develop:日常開發(fā)分支,該分支正常保存了開發(fā)的最新代碼。 feature:具體的功能開發(fā)分支,只與 develop 分支交互。 release:release 分支可以認(rèn)為是 master 分支的未測試版。比如說某一期的功能全部開發(fā)完成,那么就將 develop 分支合并到 release 分支,測試沒有問題并且到了發(fā)布日期就合并到 master 分支,進(jìn)行發(fā)布。 hotfix:線上 bug 修復(fù)分支。

