GIT速查手册
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
一、GIT
1.1 簡(jiǎn)單配置
git是版本控制系統(tǒng),與svn不同的是git是分布式,svn是集中式
配置文件位置
# 配置文件 .git/config 當(dāng)前倉(cāng)庫(kù)的配置文件 ~/.gitconfig 全局配置文件# 查看所有配置項(xiàng) git config --list友好的查看日志
# 設(shè)置別名 # 友好的查看日志 git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all"git log --decorate --oneline --graph --all git lg設(shè)置用戶名和郵箱
# 設(shè)置用戶名和郵箱 git config --global user.name "xxx" git config --blobal user.email "xxx@xxx.com"1.2 工作區(qū)和暫存區(qū)
工作區(qū)(Working Directory)是當(dāng)前文件夾,當(dāng)前文件夾下的.git文件夾是版本庫(kù)(Repository)。版本庫(kù)里有很多東西,其中有
工作區(qū)--暫存區(qū)(stage/index)--當(dāng)前分支(master)--遠(yuǎn)程庫(kù)
關(guān)系圖
版本說(shuō)明
HEAD 當(dāng)前版本 HEAD^ 上一版本 HEAD^^ 上上版本 HEAD~100 往上100個(gè)版本1.3 add/commit/diff/reset
add命令
commit命令
diff命令
reset
二、常用命令
2.1 init/add/commit/status/log
init
cd learngit git init# 在某目錄下執(zhí)行命令后,該目錄會(huì)生成一個(gè).git的隱藏文件夾,這個(gè)目錄就是一個(gè)版本庫(kù)了 # 所有版本控制系統(tǒng)只能跟蹤文本文件的發(fā)動(dòng) # 如TXT文件中刪除了第4行,圖片等二進(jìn)制文件作為一個(gè)整體 # 統(tǒng)一用UTF-8編碼add
# 添加一個(gè)文件到暫存區(qū)(Stage) vi readme.txt git add readme.txtcommit
# 將文件提交給HEAD git commit -m 'wrote a readme file'# 不產(chǎn)生新快照的提交 git commit --amend查看狀態(tài)
git status # 通過(guò)該命令可以清楚的了解當(dāng)前版本庫(kù)中的文件處于什么狀態(tài)查看歷史
git log git log --pretty=oneline git lg # 自定義的一個(gè)別名,參照 簡(jiǎn)單設(shè)置git reflog # 查看執(zhí)行的每一條命令2.2 文件對(duì)比
準(zhǔn)備
# 工作區(qū)的readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files. # 暫存區(qū)的readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files by stage. # master的readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes.比較工作區(qū)與暫存區(qū)中的文件
git diff -- readme.txt比較工作區(qū)與版本庫(kù)中的文件
git diff HEAD -- readme.txt比較暫存區(qū)與版本庫(kù)
git diff --cached HEAD比較兩個(gè)歷史快照
git diff id1 id22.3 版本回退
有如下幾個(gè)版本:
查看歷史記錄是這樣的:
回退到指定版本:
git reset HEAD^/comment_id # comment_id,ID號(hào),前7位,可以通過(guò)git reflog和git log命令進(jìn)行查看版本庫(kù)覆蓋xxx
# 工作區(qū)----暫存區(qū)(stage)----版本庫(kù)(HEAD)----服務(wù)器 # 三種模式soft/mixed/hard,默認(rèn)是mixed# 版本庫(kù)里上一版本覆蓋最新版本 git reset --soft HEAD^ # 1.移動(dòng)HEAD的指向,將其指向上一個(gè)快照# 版本庫(kù)上一版本覆蓋最新版本和暫存區(qū) git reset --mixed HEAD^ # 1.移動(dòng)HEAD的指向,將其指向上一個(gè)快照 # 2.將HEAD移動(dòng)后指向的快照回滾到暫存區(qū)域# 版本庫(kù)上一版本覆蓋最新版本和暫存區(qū)和工作區(qū) git reset --hard HEAD^ # 1.移動(dòng)HEAD的指向,將其指向上一個(gè)快照 # 2.將HEAD移動(dòng)后指向的快照回滾到暫存區(qū)域 # 3.將暫存區(qū)域的文件還原到工作目錄暫存區(qū)覆蓋工作區(qū)
# 暫存區(qū)的內(nèi)容覆蓋工作區(qū)(丟棄工作區(qū)的修改) # 撤銷工作區(qū)的修改 # 沒(méi)有--,該命令就是切換分支的命令了 git checkout -- readme.txt版本庫(kù)覆蓋暫存區(qū)
# 版本庫(kù)的內(nèi)容覆蓋暫存區(qū)(丟棄暫存區(qū)的修改) # 撤銷暫存區(qū)的修改 git reset HEAD readme.txt2.4 暫存區(qū)修改
這樣一種場(chǎng)景:工作區(qū),暫存區(qū),版本庫(kù)里內(nèi)容一樣,類似.project類似這種eclipse的項(xiàng)目配置文件也存在于版本控制中,現(xiàn)在把.project這類文件加入到忽略名單后
# 這個(gè)命令是把.project從暫存區(qū)中刪除 git rm --cached .project # 提交暫存區(qū) git commit -m "delete .project"2.5 刪除/重命名
# 只能刪除工作區(qū)和暫存區(qū)中的文件 git rm filename# git rm readme.txt與如下兩個(gè)命令等價(jià) rm readme.txt git add readme.txt# 如果工作區(qū)和暫存區(qū)中的文件內(nèi)容不同時(shí),下面兩個(gè)命令可把兩個(gè)都刪除 git rm -f filename git rm --cached filename# 重命名 git mv filename1 filename2三、遠(yuǎn)程倉(cāng)庫(kù)
3.1 免登錄設(shè)置
Windows下生成ssh-keygen
1.安裝Git 2.打開(kāi)Git Bash 3.輸入 ssh-keygen -t rsa -C "your email"Linux下生成ssh-key
ssh-keygen -t rsa -C "your email" cat ~/.ssh/id_rsa.pub # ~/.ssh/id_rsa 這是私鑰 # ~/.ssh/id_rea.pub 這是公鑰# 驗(yàn)證 ssh -T git@git.oschina.net3.2 遠(yuǎn)程庫(kù)命令
關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
# 把本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)相關(guān)聯(lián) git remote add origin git@github.com:yysue/learngit.git # yysue:github賬戶名或gitee賬戶名 # origin:遠(yuǎn)程庫(kù)的名字,這是Git默認(rèn)的叫法# 關(guān)聯(lián)分支 git branch --set-upstream-to=origin/master master # 將本地的master分支與遠(yuǎn)程origin庫(kù)的master分支關(guān)聯(lián)# pull,第一次pull加--allow-unrelated-histories # https://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories-on-rebase git pull --allow-unrelated-histories直接修改配置
# 當(dāng)前版本庫(kù)目錄下 $ cat .git/config [core]repositoryformatversion = 0filemode = falsebare = falselogallrefupdates = truesymlinks = falseignorecase = true [remote "origin"]url = git@git.oschina.net:yysue/mysqldba.gitfetch = +refs/heads/*:refs/remotes/origin/* [branch "master"]remote = originmerge = refs/heads/master查看遠(yuǎn)程庫(kù)
git remote -v推送到遠(yuǎn)程庫(kù)
git push -u origin master # 把本地所有內(nèi)容推送到遠(yuǎn)程庫(kù)上 # -u參數(shù),不但會(huì)把本地master分支推送到遠(yuǎn)程master分支,還會(huì)把本地master分支與遠(yuǎn)程master分支相關(guān)聯(lián) # 第一次推送用-u,以后用就可以不用了 git push origin master從遠(yuǎn)程庫(kù)抓取
git pull origin master從遠(yuǎn)程庫(kù)克隆
git clone git@github.com:h2o1k/gitskills.git ssh協(xié)議,速度快 git clone https://github.com/h2o1k/gitskills.git https協(xié)議遠(yuǎn)程倉(cāng)庫(kù)強(qiáng)制覆蓋本地文件
git fetch --all git reset --hard origin/master git pull四、分支管理
4.1 branch/checkout/merge
查看master分支
master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn)
創(chuàng)建并切換到dev分支
# 查看當(dāng)前分支的命令 git branchgit checkout -b dev # -b 表示創(chuàng)建并切換,與下面兩條命令等價(jià) git branch dev git checkout dev# 再查看一下分支 git branch在dev分支提交
vi dev.txt Creating a new branch is quick.git add dev.txt git commit -m "add dev.txt"切換到master分支
git checkout masterdev合并到master
git merge dev -m "merge dev" # merge合并指定分支到當(dāng)前分支, # so,必須在master分支下執(zhí)行上述命令保留分支信息的合并
git merge --no-ff -m "merge" dev # --no-ff會(huì)保留分支信息通常,分支合并時(shí),Git會(huì)用Fast forward模式,這種模式下,刪除分支后,會(huì)丟失分支信息,禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息
刪除dev分支
git branch -d dev產(chǎn)生沖突
master分支和feature1都有新的提交
解決沖突
編輯沖突文件,然后再添加、提交、合并,最后刪除分支feature1
查看日志
分支管理策略
4.2 stash
我們有時(shí)會(huì)遇到這樣的情況,正在分支a上開(kāi)發(fā)一半,然后分支b上發(fā)現(xiàn)Bug,需要馬上處理。
這時(shí)候分支a上的修改怎么辦呢,git add 是不行的,有的git客戶端版本會(huì)提示還有add過(guò)的文件沒(méi)提交不能切換分支,有的git客戶端版本會(huì)把修改帶到b分支。
git stash 就是解決這個(gè)問(wèn)題,它把當(dāng)前工作區(qū)的修改和git add的內(nèi)容都保存到一個(gè)地方,然后git reset HEAD,使工作區(qū)回到上一次提交,處于干凈狀態(tài)。然后就可以很放心的切到另外的分支b干活了。
git stash save “先給我保存一下,我要去別的分支修bug” git stash list # 切換到其他分支去修改bug # ... # 再切換到打stash的分支 git stash pop # git stash pop相當(dāng)于執(zhí)行g(shù)it stash apply和git stash drop git stash apply stash@{num}4.3 rebase
有的時(shí)候我們?cè)谝粋€(gè)分支a開(kāi)發(fā)的時(shí)候,master已經(jīng)進(jìn)入了很多修改,這時(shí)候如果把a(bǔ)的修改提交上去,可能就會(huì)跟主干有沖突,需要在主干解決沖突才能提交,這樣比較難看。
這時(shí)候git rebase就有用了,git rebase BRANCH_NAME可以把BRANCH_NAME分支的修改帶到當(dāng)前分支來(lái),這樣當(dāng)前分支就有了BRANCH_NAME分支的所有內(nèi)容,這樣在當(dāng)前分支開(kāi)發(fā)的內(nèi)容提交以后不會(huì)跟BRANCH_NAME有沖突,沖突在當(dāng)前分支就可以解決。
4.4 小技巧
可以取消已經(jīng)提交的commit,一般我們只用git reset HEAD^。因?yàn)槊總€(gè)分支可能開(kāi)發(fā)過(guò)程中為了保存過(guò)程以便回溯會(huì)有很多commit,但是我們要求進(jìn)入主干時(shí),每個(gè)功能和bugfix只能有一個(gè)提交,因此可以先用git reset退回到最早的commit,然后把自己的修改最后打包成一個(gè)commit,再去跟主干合并。
利用這兩個(gè)命令,我們可以很好的管理我們的MySQL開(kāi)發(fā)。我們只有一個(gè)master分支作為主干,不允許在主干上直接開(kāi)發(fā)。每個(gè)同學(xué)根據(jù)feature和bug的issue建立分支,然后在分支上開(kāi)發(fā),不管開(kāi)發(fā)過(guò)程中有多少個(gè)commit,我們要求最終提交每個(gè)bugfix或feature只能有一個(gè)提交。因此每個(gè)同學(xué)完成開(kāi)發(fā)后,都需要git reset 退到最早的commit,git stash save寶存一下自己的修改,然后git checkout master; git pull拖一下最新的主干,然后返回自己的分支,再做git rebase master,把當(dāng)前分支推進(jìn)到主干,最后git stash pop彈出修改,有沖突則在當(dāng)前分支解決,再git push。
# 此時(shí)commit id為a37b9ff,切換到開(kāi)發(fā)版本dev git checkout -b dev # 實(shí)現(xiàn)了一個(gè)功能xxx,期間多次commit ... # xxx開(kāi)發(fā)完畢后,合并到主分支要求只有一個(gè)commit git reset a37b9ff git stash save "保存開(kāi)發(fā)功能xxx的修改" git checkout master git pull git checkout dev git rebase master git stash pop # 處理沖突 git add . git commit -m "功能xxx" git checkout master git merge --no-ff -m "merge 功能xxx" dev4.5 常用分支命令
# 查看當(dāng)前分支 git branch # 創(chuàng)建分支dev git branch dev # 切換到分支dev git checkout dev # 創(chuàng)建并切換到分支dev git checkout -b dev # 合并指定分支(dev)到當(dāng)前分支 git merge dev # 刪除分支dev, 如果分支有未提交的這樣刪除不了 git branch -d dev # 強(qiáng)制刪除 git branch -D dev # 查看分支合并情況 git log --pretty=oneline --graph --abbrev-commit # master轉(zhuǎn)gh-pages # 創(chuàng)建一個(gè)沒(méi)有父節(jié)點(diǎn)的分支gh-pages git checkout --orphan gh-pages五、標(biāo)簽管理
5.1 常用標(biāo)簽命令
# 切換到要打標(biāo)簽的分支上 git branch git checkout master# 打標(biāo)簽 git tag v1.0# 默認(rèn)標(biāo)簽是打在最新提交的commit上,也可以指定commit id # git log --pretty=oneline --abbrev-commit git tag v0.9 <commit id># 查看標(biāo)簽列表 git tag# 查看某標(biāo)簽信息 git show v0.9# 標(biāo)簽加注釋 git tag -a v0.1 -m "version 0.1 released" 2428164# 可以用PGP簽名標(biāo)簽 git tag -s v0.2 -m "signed version 0.2 released" fac145a# 刪除標(biāo)簽 git tag -d v0.1# 把標(biāo)簽推送到服務(wù)器 git push origin v1.0# 一次性推送全部尚未推送的本地標(biāo)簽 git push origin --tags# 刪除遠(yuǎn)程庫(kù)標(biāo)簽 # 先刪除本地標(biāo)簽 git tag -d v0.9 # 再刪除遠(yuǎn)程庫(kù)標(biāo)簽 git push origin :refs/tags/v0.9六、使用GitHub
6.1 Fork/克隆
七、自定義Git
# 如果一個(gè)jar文件已經(jīng)加到忽略文件里邊了 # 想把一個(gè)jar文件添加到版本庫(kù) git add -f aaa.jar八、問(wèn)題
8.1 注釋輸入不了中文了
# Git安裝目錄 D:\Program Files\Git # 編輯如下文件D:\Program Files\Git\etc\inputrc # 確保如下行的配置如下,就可以保證輸入中文注釋了 set output-meta on set convert-meta off九、參考
- Git教程-廖雪峰
- 一些Git操作的技巧
轉(zhuǎn)載于:https://my.oschina.net/yysue/blog/1635600
總結(jié)
- 上一篇: Taro+react开发(73):Tar
- 下一篇: JAVA 调用NetDraw((*^__