1、Linux基礎(chǔ)指令
cd .. //返回上級(jí)目錄
cd d: //進(jìn)入d盤
ls -al //查看文件列表
cat dome.txt //查看文件
touch dome.txt //創(chuàng)建文件
rm dome.txt //刪除文件
vim 文件名 //編輯文件
2晌该、git的基本概念
Workspace:工作區(qū)
Index / Stage:暫存區(qū)(緩存區(qū))
Repository:倉庫區(qū)(或本地倉庫)
Remote:遠(yuǎn)程倉庫
2.1 git 初始化
git的初始化有兩種,一種是還沒有倉庫自己新建骇两,使用git init 初始化倉庫;
一種是已經(jīng)有倉庫了姜盈,通過git clone 拉取倉庫到本地低千。
git init //當(dāng)前目錄下初始一個(gè)倉庫,多一個(gè).git的隱藏文件夾
git config --global user.name 'lisan' //配置本地倉庫用戶名
git config --global user.email 'lisan@email.com' //配置本地倉庫用戶郵件
或者
git clone <path> //克隆gitcode
git remote add [shortname] [url] //添加遠(yuǎn)程庫
例子:
克隆遠(yuǎn)程倉庫
$ git clone git://github.com/schacon/grit.git
關(guān)聯(lián)遠(yuǎn)程倉庫
$ git remote add origin https://github.com/user/repo.git
補(bǔ)充:config的幾種作用域
global 用戶權(quán)限
system 系統(tǒng)權(quán)限
local 當(dāng)前目錄權(quán)限
2.2贩据、git基礎(chǔ)指令-添加栋操、提交闸餐、查看、刪除矾芙、回退
a舍沙、添加
基本操作略...
git add read.md //添加文件到緩存區(qū)
git add . //該目錄下所有文件添加到緩存區(qū)
git add -a //項(xiàng)目內(nèi)全部文件添加到緩存區(qū)
b、提交
基本操作略...
git commit -m "mrak" //提交本地倉庫
git commit -am "mark" //提交本地倉庫剔宪、與上面不同的是我們可以少了git add操作(只限于已經(jīng)存在于緩存區(qū)的文件拂铡,也就是說如果你新建了個(gè)test文件,如果沒git add葱绒,這里不會(huì)提交到倉庫感帅,還是老老實(shí)實(shí)add后commit。)
git commit --amend //修改最后一次提交commit的msg
c地淀、查看
基本操作略...
git log -n 查看最近n次改動(dòng)(常用)
git log --oneline //簡潔記錄
git log --graph //圖形化顯示commit
git log --reverse --oneline //反向查看記錄
git log --oneline --graph //歷史中出現(xiàn)了分支失球、合并
git status //查看文件狀態(tài)(常用)
git status -s //查看狀態(tài) 簡潔模式
d、刪除
基本操作略...
git checkout read.md //回復(fù)工作區(qū)文件內(nèi)容到倉庫最新版本的文件內(nèi)容
git rm <file> //刪除工作區(qū)內(nèi)容
git rm <file> --cached //刪除緩存區(qū)內(nèi)容帮毁,工作區(qū)不受影響(比如.gitignore配置是我們可能會(huì)用到這個(gè)功能)
e实苞、退回版本
開發(fā)中難免會(huì)提交錯(cuò)commit、因此git為我們提供了撤銷commit的方法烈疚。
這里有個(gè)重點(diǎn)黔牵,沒錯(cuò)就是HEAD,在使用git中我們常常會(huì)看到HEAD爷肝,那么HEAD到底是什么呢猾浦?我們知道在git中可能會(huì)有很多branch和commit,為了知道我們當(dāng)前工作區(qū)提交到那個(gè)branch灯抛,所以需要個(gè)指針指向當(dāng)前指向的branch的commit金赦。HEAD可以簡單理解成這個(gè)指針。(實(shí)際牧愁,HEAD指向的是當(dāng)前分支素邪,在每個(gè)分支上都有一個(gè)指針指向最新的commit,而HEAD始終是指向當(dāng)前分支的指針猪半,所以可以簡單理解HEAD就是指針)
git reset HEAD read.md //撤銷添加到緩存區(qū)的內(nèi)容
git reset HEAD^ //回退一個(gè)commit
git reset HEAD~3 //向上回退3個(gè)commit
git reset commit_id //回退指定版本
git reset 841125 //回到commit_id=841125的提交
git reset 841125 和 git HEAD~3得到的結(jié)果是一樣的
第一個(gè)方法讓git回退到841125的commit 也就是倒數(shù)第三個(gè)commit;
第二個(gè)方法讓指針(HEAD)回退3個(gè)節(jié)點(diǎn)(commit)偷线;
需要注意的是reset后面還可以跟 --hard磨确、--mixed、--soft等參數(shù)
--mixed 影響倉庫和暫存區(qū) (reset HEAD and index)(默認(rèn)值)
--soft 影響倉庫 (reset only HEAD)
--hard 影響倉庫声邦、暫存區(qū)和工作區(qū) (reset HEAD, index and working tree)
當(dāng)我們git reset后不跟參數(shù)乏奥、默認(rèn)是--mixed,也就是只對(duì)暫存區(qū)和倉庫進(jìn)行回退亥曹。
下面是最近三次的commit
commit 676249486735497db288f6654c7295d13125ec56 (HEAD -> master, origin/master, origin/HEAD)
最新commit
commit 2d751a62100e2f5af58d35923c84d6f8bc98cd0b
倒數(shù)第二commit
commit 841125dc92f4929fa0fe5622cff1f93af4bebf02
倒數(shù)第三commit
git revert
生成一個(gè)新的提交來撤銷某次提交邓了,此次提交之前的所有提交都會(huì)被保留恨诱。
$ git revert <commit ID>
f、撤銷工作區(qū)中文件
撤銷單個(gè)文件修改骗炉,使用下面命令:
$ git checkout -- 文件名
撤銷所以文件修改照宝,使用下面命令:
$ git checkout .
2.4 本地分支
a、 查看分支
略略略...
git branch //查看分支
git remote -vv //查看遠(yuǎn)程分支
git branch -a //查看本地和遠(yuǎn)程分支(所有分支)
git branch -vv //查看本地分支關(guān)聯(lián)遠(yuǎn)程分支句葵,及最近的一次提交
b厕鹃、 創(chuàng)建、刪除乍丈、切換
略略略...
git branch <分支name> //創(chuàng)建分支
git branch -d <分支name> //刪除分支
git fetch -p //清理已經(jīng)被刪除的遠(yuǎn)程分支
git checkout <分支name> //切換分支
git checkout -b [分支名] [遠(yuǎn)程名]/[分支名] //切換并創(chuàng)建
3剂碴、 合并
每個(gè)需求新建一個(gè)分支開發(fā),能很好的解決多個(gè)需求在一個(gè)分支里造成的混亂轻专。
多人合作開發(fā)忆矛,創(chuàng)建分支開發(fā)真的是用了都說好。所以不可避免的我們需要合并自己的分支和同事的分支请垛。
合并分支如果沒有沖突催训,git里只是把指針指向了最新的commit。我們稱之為fast-forward叼屠。
如果有沖突瞳腌,這需要解決沖突,然后提交分支镜雨。
git merge <branch> //branch被合并到當(dāng)前分支
git rebase master <branch> # 將master rebase到branch
merge和rebase都是合并分支嫂侍,那么有什么區(qū)別呢?
主要區(qū)別在于荚坞,merge會(huì)保留分支的真實(shí)信息挑宠,而rebase會(huì)把分支上的commit融合到當(dāng)前分支上。
直接放鏈接颓影,解釋的很清楚
開發(fā)一般都用merge各淀,當(dāng)然你非要用rebase合并分支也可以。
2.5诡挂、 遠(yuǎn)程分支
終于到最最重要的部分了碎浇,沒有遠(yuǎn)程的git是么有靈魂的。
git pull # 抓取遠(yuǎn)程倉庫所有分支更新并合并到本地
git pull --no-ff # 抓取遠(yuǎn)程倉庫所有分支更新并合并到本地璃俗,不要快進(jìn)合并
git fetch origin # 抓取遠(yuǎn)程倉庫更新
git merge origin/master # 將遠(yuǎn)程主分支合并到本地當(dāng)前分支
git push # 推送所有分支 (這個(gè)后面默認(rèn)是 當(dāng)前的分支對(duì)應(yīng)的origin master)
git push origin master # 將本地主分支推到遠(yuǎn)程主分支
git push -u origin master # 將本地主分支推到遠(yuǎn)程(如無遠(yuǎn)程主分支則創(chuàng)建奴璃,用于初始化遠(yuǎn)程倉庫)
git push origin <local_branch> # 創(chuàng)建遠(yuǎn)程分支, origin是遠(yuǎn)程倉庫名
git push origin <local_branch>:<remote_branch> # 創(chuàng)建遠(yuǎn)程分支
git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>)城豁,然后再push刪除遠(yuǎn)程分支
git pull實(shí)際上有兩個(gè)步驟苟穆,拉取遠(yuǎn)程倉庫和合并拉取的內(nèi)容,等同于,git fetch origin(拉撒谩) + git merge brName(合并)
如果遠(yuǎn)程倉庫創(chuàng)建了分支a跟磨,但是我們本地還沒有分支a,所以我們先本地創(chuàng)建分支a攒盈,但是git push時(shí)你會(huì)發(fā)現(xiàn)抵拘,我們沒有關(guān)聯(lián)到遠(yuǎn)程分支無法推送,只是我么要用到git branch -u origin a這個(gè)方法本地分支a關(guān)聯(lián)到遠(yuǎn)程分支a沦童,之后我們就可以推送了仑濒。關(guān)聯(lián)遠(yuǎn)程分支前別忘了先git pull,為啥偷遗?遠(yuǎn)程雖然新建了分支a墩瞳,但是我們本地還不知道,所以需要git pull 獲取遠(yuǎn)程的狀態(tài)氏豌『碜茫可能有些亂,下面分解下1.git pull 獲取遠(yuǎn)程信息 2. git checkout -b a 本地創(chuàng)建分支b 3. git branch -u origin a 關(guān)聯(lián)遠(yuǎn)程分支a 4.git push 推送成功
一般情況下泵喘,我們提交到遠(yuǎn)程倉庫泪电,只需要git push即可,但是有時(shí)可能出現(xiàn)下面這種情況本地分支a關(guān)聯(lián)的是遠(yuǎn)程分支b纪铺,雖然很很少見相速。這時(shí)如果在使用git push會(huì)推送失敗,我需要完整的寫出git push origin b進(jìn)行推送鲜锚。
4突诬、 標(biāo)簽tag
用于對(duì)發(fā)布版本進(jìn)行標(biāo)記,這是最常見的應(yīng)用場景芜繁。
git tag -a v1.0 添加標(biāo)簽
git checkout tagname 切換到 tag code
git log --oneline --decorate --graph 可以查看標(biāo)簽
5旺隙、查看文件diff
實(shí)際開發(fā)中,我基本沒有用這個(gè)命令骏令,還是在AS對(duì)比文件蔬捷、解決沖突舒服。榔袋。周拐。
git diff 比較工作區(qū)和暫存區(qū)的文件差異
git diff HEAD 比較工作區(qū)和倉庫的文件差異
git diff --cached 比較倉庫和暫存區(qū)之間的差異git diff <file> # 比較當(dāng)前文件和暫存區(qū)文件差異
git diff --stat # 僅僅比較統(tǒng)計(jì)信息
git diff <branch1>..<branch2> # 在兩個(gè)分支之間比較
git diff <id1><id2> # 比較兩次提交之間的差異
5、保存到隱藏區(qū)(常用)
應(yīng)用場景凰兑,假如在develop分支上我們正在開發(fā)分支速妖,這是突然有個(gè)bug需要我們修復(fù),但是我們又不能在develop分支上直接修改聪黎,這時(shí)需要我們切換到需要修復(fù)bug的那個(gè)分支上修復(fù)bug,假設(shè)這個(gè)分支是a。
git stash 保存當(dāng)前修改到stash中
git stash save “message” 保存帶msg的當(dāng)前修改到stash中
git stash list 查看stash中存儲(chǔ)的列表
git stash pop 從stash中提取出最新的保存到當(dāng)前分支
git stash pop stash@{1} 從stash中提取標(biāo)記為@{1}的修改到本地
git stash apply 回復(fù)工作區(qū)不刪除stash內(nèi)容稿饰,與pop不同的是不會(huì)刪除stash區(qū)的內(nèi)容
git stash drop stash@{0} 刪除stash內(nèi)容(通常和apply配合使用)
6锦秒、 其他
應(yīng)用場景:分支b中的一個(gè)commit_id=5689k的commit,分支a中沒有這個(gè)id為5689k的commit喉镰,如果分支a需要這個(gè)commit的內(nèi)容旅择,如果一個(gè)一個(gè)復(fù)制也不失是一種辦法,但是這樣實(shí)在是有些低效率侣姆,所以git為我們提供了快捷的方法生真。
git cherry-pick commit_id
在分支a上 git cherry-pick 5689k 即可把5689k的commit內(nèi)容合并到a分支上路了。
git使用小技巧
$ git checkout - 快速切換到上一個(gè)分支
$ git config --global alias.co checkout //設(shè)置別名
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
開發(fā)中用的命令基本總結(jié)完了捺宗,可能會(huì)有遺漏想起里會(huì)補(bǔ)充的柱蟀,有什么錯(cuò)誤歡迎大家指出。(* ̄︶ ̄)