目錄
一、git的安裝及本地配置
1.1、git介紹
1.2、git本地安裝及配置
1.3、git遠(yuǎn)程倉(cāng)庫(kù)
二、git的命令及使用
2.1、基礎(chǔ)命令
三、git的分支
3.1、常用命令
3.2、執(zhí)行效果圖
3.3、合并時(shí)有沖突該怎么辦?
3.4、解決沖突
3.5、git分支圖解
四、連接遠(yuǎn)程倉(cāng)庫(kù)
4.1、在gitee新建遠(yuǎn)程倉(cāng)庫(kù)
4.2、關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
4.3、克隆代碼
五、忽略文件
六、常用指令匯總
一、git的安裝及本地配置
1.1、git介紹
這是官方給出的git介紹:
- 代碼托管與合并
- 版本控制
- 分布式(每一個(gè)終端都有一套完整代碼)
閉坑:git是分布式版本控制工具,可以進(jìn)行版本穿梭,但是有一個(gè)前提,就是你的修改再版本歷史記錄中是存在的,即 “該版本被提交到本地倉(cāng)庫(kù)或遠(yuǎn)程倉(cāng)庫(kù)” ,只有滿(mǎn)足該條件,才會(huì)被記錄位版本。
每次pull拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼時(shí),要先把本地修改提交(commit)到本地倉(cāng)庫(kù)
(不commit直接pull,遠(yuǎn)程庫(kù)代碼會(huì)覆蓋本地代碼的修改,提交到本地庫(kù)再pull,會(huì)把本地修改和遠(yuǎn)程庫(kù)代碼合并)
每次push推送代碼前,也要先把修改提交到本地庫(kù),然后pull拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼(合并遠(yuǎn)程庫(kù)和本地修改),然后再push
(不pull直接push,會(huì)覆蓋遠(yuǎn)程庫(kù)代碼,別人的修改提交就會(huì)被覆蓋)
解析:
git是代碼的一套托管工具,它分為兩個(gè)倉(cāng)庫(kù),首先將你寫(xiě)的代碼提交到本地倉(cāng)庫(kù),這個(gè)時(shí)候只有你可以看,和你一起開(kāi)發(fā)的同事看不到。將本地倉(cāng)庫(kù)的代碼推到遠(yuǎn)程倉(cāng)庫(kù)(githab、gitee、gitlab等之一),然后你的同事就可以通過(guò)一個(gè)git的命令拉下你推到遠(yuǎn)程倉(cāng)庫(kù)的代碼了。同樣,只有你同事將他寫(xiě)的代碼推送到遠(yuǎn)程倉(cāng)庫(kù)后,你執(zhí)行g(shù)it命令才能把他寫(xiě)的代碼拉下來(lái),合并到你的代碼里。
這就是代碼托管倉(cāng)庫(kù)的一部分優(yōu)勢(shì),或許你感覺(jué)不到什么,老王舉個(gè)例子,你們?nèi)齻€(gè)前端做一個(gè)項(xiàng)目,寫(xiě)一部分就得匯總合并一次代碼吧?沒(méi)有這個(gè)托管工具你怎么合并?咋用個(gè)小u盤(pán)咋copy一下,那得copy多少次,合并起來(lái)多困難,這就是代碼托管工具的優(yōu)勢(shì),通過(guò)幾行簡(jiǎn)單的命令就實(shí)現(xiàn)了代碼的托管和合并。
git還有一個(gè)優(yōu)勢(shì),就是可以回到你提交代碼的任意一個(gè)歷史版本。例如,你寫(xiě)了這三個(gè)功能,上傳,刪除,添加。每寫(xiě)完一個(gè)功能就提交一次倉(cāng)庫(kù),本地或者遠(yuǎn)程倉(cāng)庫(kù)都可以/后來(lái)又寫(xiě)了半天,發(fā)現(xiàn)寫(xiě)不對(duì)了,你想回到上傳時(shí)候的代碼,這個(gè)時(shí)候通過(guò)git命令也是可以回去的。
老王叨叨這么好多字,現(xiàn)在大家對(duì)git是不是有了一個(gè)初步的了解?
為了加深大家的記憶,便于理解,通過(guò)畫(huà)圖解析一下:
1.2、git本地安裝及配置
1、下載地址: https://git-scm.com/
2、安裝,下一步,安裝完成
3、安裝完成后,打開(kāi)終端,執(zhí)行g(shù)it? --version檢查是否成功安裝?
安裝成功后,在桌面或文件夾內(nèi)右擊會(huì)出現(xiàn)Git Bash Here 選項(xiàng),點(diǎn)擊會(huì)打開(kāi)git命令窗口
4、基本配置
在git設(shè)置用戶(hù)名和郵箱(git命令窗口里不可以使用快捷鍵復(fù)制粘貼,必須使用鼠標(biāo)右擊復(fù)制粘貼)
配置用戶(hù)名:
git config --global user.name "用戶(hù)名英文"
配置用戶(hù)郵箱:
git config --global user.email "你的郵箱"
基本配置完成。?
5、初始化項(xiàng)目
項(xiàng)目的git命令窗口執(zhí)行 git init 命令,初始化項(xiàng)目,在項(xiàng)目文件夾中出現(xiàn) .git 文件,項(xiàng)目初始化完成。
1.3、git遠(yuǎn)程倉(cāng)庫(kù)
推薦gitee,國(guó)內(nèi)代碼托管倉(cāng)庫(kù)
1、網(wǎng)址:http://gitee.com/
2、直接注冊(cè)
3、注冊(cè)后配置ssh密鑰(倉(cāng)庫(kù)權(quán)限)
為什么配置密鑰?
就是為了解決,git提交代碼的時(shí)候,不用每次都輸入用戶(hù)名和密碼。配置后,可以直接提交。
生成密鑰的指令:
ssh-keygen -t rsa -C "這里輸入你的郵箱@xxxxx.com"
?獲取密鑰:
密鑰路徑:
密鑰文件:
在遠(yuǎn)程倉(cāng)庫(kù)配置公鑰:?
?配置完成后,在git窗口輸入:
ssh -T git@gitee.com
如果返回下面內(nèi)容,就證明配置成功。
Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.
二、git的命令及使用
2.1、基礎(chǔ)命令
將代碼推送到暫存區(qū)
//注意: add 后面有一個(gè)空格
git add .
將暫存區(qū)代碼推送到本地倉(cāng)庫(kù)
//commit 后面有一個(gè)空格
git commit -m '本次提交的注釋說(shuō)明'
拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼
//在拉取遠(yuǎn)程代碼的時(shí)候,必須執(zhí)行上面兩步,將你剛寫(xiě)的代碼存到本地倉(cāng)庫(kù),如果不執(zhí)行前面兩步,那你剛寫(xiě)的的代碼就會(huì)被拉下來(lái)的代碼覆蓋
//只有你存到本地倉(cāng)庫(kù)了,才不會(huì)被覆蓋,存到本地倉(cāng)庫(kù)再拉取,就會(huì)把你的修改和遠(yuǎn)程庫(kù)的最新版本合并
git pull
將拉取的最新版本和你的本地倉(cāng)庫(kù)的最新修改合并,然后推送到遠(yuǎn)程庫(kù)
git push
?查看提交詳細(xì)信息
git log
?如圖:
?查看提交過(guò)的歷史版本號(hào):
git log --online
如圖:?
?版本穿梭,根據(jù)版本號(hào),回到歷史版本
//回到指定歷史版本
git checkout 版本號(hào)
//或者 , master 就是回到最近的一次提交的歷史版本
git checkout master
回到指定版本?
回到最近版本?
三、git的分支
使用git分支可以同時(shí)展開(kāi)多條任務(wù)線(xiàn),例如add分支寫(xiě)添加功能代碼,delete分支寫(xiě)刪除功能,edit寫(xiě)修改功能,同時(shí)寫(xiě)多個(gè)功能,且互不影響。例如在工作中,你正在寫(xiě)一個(gè)add功能,而領(lǐng)導(dǎo)要你緊急添加一個(gè)刪除功能,這時(shí)你就可以先創(chuàng)建一個(gè)刪除功能的分支,且不會(huì)影響你原來(lái)在寫(xiě)的功能代碼。
git默認(rèn)master分支,也叫主分支
3.1、常用命令
創(chuàng)建分支命令
git branch 分支名
查看所有分支命令
git branch
//前面帶星號(hào)的是當(dāng)前分支
切換分支
git checkout 分支名
?合并分支
//把指定分支 合并到 當(dāng)前分支
git marge 分支名
// 先把在dev分支寫(xiě)的代碼提交到本地倉(cāng)庫(kù)
git add .
git commit -m '我是dev分支寫(xiě)的代碼'
// 切換回要合并的master主分支
git checkout master
// 拉取遠(yuǎn)程的代碼到master主分支(將同事的代碼和你之前提交到遠(yuǎn)程的代碼拉回來(lái))
git pull
// 將dev分支寫(xiě)的代碼合并到master上
git merge dev
// 合并完之后,將合并的代碼和pull拉下來(lái)的代碼,一起推到遠(yuǎn)程倉(cāng)庫(kù)
git push
3.2、執(zhí)行效果圖
- 創(chuàng)建分支
- 將分支上的代碼提交到本地庫(kù)
- 切換回主分支,拉取遠(yuǎn)程庫(kù)代碼
- 將分支代碼合并到主分支
先創(chuàng)建分支,將分支上的代碼提交到本地庫(kù)
回到主分支,并拉取遠(yuǎn)程庫(kù)代碼 (這里因?yàn)闆](méi)有遠(yuǎn)程庫(kù),就沒(méi)有pull)
然后,將分支合并到當(dāng)前主分支
3.3、合并時(shí)有沖突該怎么辦?
- 修改代碼,解決沖突
- 重新提交到本地庫(kù)
- push到遠(yuǎn)程倉(cāng)庫(kù)
沖突就是你pull下代碼后,將分支合并到主分支時(shí),發(fā)現(xiàn)你同事和你修改了同一個(gè)地方,就會(huì)出現(xiàn)沖突。
我們模擬一下,Dev分支中,你寫(xiě)了13行
你的同事在master分支上,在該文件的第13行也進(jìn)行了編輯修改
合并Dev分支和master分支時(shí),就會(huì)出現(xiàn)沖突
報(bào)錯(cuò)翻譯?
3.4、解決沖突
決定留下誰(shuí)的代碼,或者都留下,或都不保留
?做出選擇后,需要重新add、commit,將合并的代碼推到本地倉(cāng)庫(kù),然后在push,將代碼推送到遠(yuǎn)程。
如果你還要在dev寫(xiě),那就得把master最新得代碼(包括同事的)合并到dev,然后接著在dev開(kāi)發(fā)。
3.5、git分支圖解
GIt 的分支之間 是相互不影響的,即使是提交到本地倉(cāng)庫(kù),也是互不影響的,每個(gè)分支上的本地倉(cāng)庫(kù)都是獨(dú)立互不影響的,或者說(shuō)每個(gè)本地倉(cāng)庫(kù)都是一個(gè)單獨(dú)的分支。
工作中,我們都是多分支工作,一個(gè)運(yùn)行分支,一個(gè)開(kāi)發(fā)分支,一個(gè)自己的研發(fā)分支,
自己在個(gè)人研發(fā)分支完成功能開(kāi)發(fā)后,合并到開(kāi)發(fā)分支,檢測(cè)有沒(méi)有Bug沖突,沒(méi)有問(wèn)題再合并到運(yùn)行分支(主分支)
四、連接遠(yuǎn)程倉(cāng)庫(kù)
4.1、在gitee新建遠(yuǎn)程倉(cāng)庫(kù)
點(diǎn)擊加號(hào),點(diǎn)擊新建倉(cāng)庫(kù)
填寫(xiě)項(xiàng)目信息
創(chuàng)建成功提示
添加遠(yuǎn)程倉(cāng)庫(kù),并將本地master和遠(yuǎn)程master關(guān)聯(lián)
4.2、關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
本地?zé)o倉(cāng)庫(kù)
- 創(chuàng)建初始化本地倉(cāng)庫(kù)
- 將所有文件推送到本地庫(kù)
- 關(guān)聯(lián)遠(yuǎn)程庫(kù)
- 將本地庫(kù)分支和遠(yuǎn)程庫(kù)分支關(guān)聯(lián)
本地有倉(cāng)庫(kù)
- 關(guān)聯(lián)遠(yuǎn)程庫(kù)
- 將本地庫(kù)分支和遠(yuǎn)程庫(kù)分支關(guān)聯(lián)
4.3、克隆代碼
賦值倉(cāng)庫(kù)ssh
新建文件夾,打開(kāi)該文件夾下終端輸入一下命令
git clone ssh地址
五、忽略文件
有時(shí)候,我們不想把某些文件納入版本控制之中,比如依賴(lài)包,臨時(shí)文件等
這個(gè)時(shí)候可以利用 .gitgnore 文件,設(shè)置忽略規(guī)則
- ?.gitgnore 文件的注釋文本以 # 開(kāi)頭
- 可以使用Linux通配符,例如 : *.txt? ,代表 忽略所有以.txt結(jié)尾的文件
- !感嘆號(hào)代表例外規(guī)則,將不被忽略
- 目錄后面加 / 分隔符,代表忽略該目錄下的子目錄(只忽略該目錄下的子目錄,而不忽略該目錄下的文件)
- 目錄前面加 / 分隔符,代表只忽略該路徑下的指定文件
#井號(hào)開(kāi)頭,該行為注釋內(nèi)容
*.txt #忽略所有 .txt 結(jié)尾的文件,這樣的話(huà)此類(lèi)文件不會(huì)被git上傳
!zxf.txt #zxf.txt文件例外,它不會(huì)被忽略
/temp #只忽略該路徑下的txt文件
view/ #view路徑下的所有文件會(huì)被忽略
view/*.txt #忽略view路徑下的所有txt文件,但不包括它子目錄下的txt文件
常用規(guī)則配置:
bin/: 忽略當(dāng)前路徑下的bin文件夾,該文件夾下的所有內(nèi)容都會(huì)被忽略,不忽略 bin 文件
/bin: 忽略根目錄下的bin文件
/*.c: 忽略 cat.c,不忽略 build/cat.c
debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo: 忽略/foo, a/foo, a/b/foo等
a/**/b: 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh: 不忽略 bin 目錄下的 run.sh 文件
*.log: 忽略所有 .log 文件
config.php: 忽略當(dāng)前路徑的 config.php 文件
六、常用指令匯總
window 安裝 Git
# 第一步、Git官網(wǎng)下載Git傻瓜式安裝,可以打開(kāi)git bash即為成功。
# 第二步、設(shè)置參數(shù)
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 獲取config信息
$ git config --list
# 去掉git add 命令后 出現(xiàn)的一堆CR LF提示信息,其中CR是回車(chē)的意思 LF是換行
$ git config --global core.safecrlf false
# 存儲(chǔ)憑證 (可用于輸入一次用戶(hù)密碼后,不再輸入 有時(shí)我們已經(jīng)用SSH key 綁定關(guān)聯(lián)好了 但是每次git提交的時(shí)候 還是需要你輸入用戶(hù)名密碼 在這個(gè)時(shí)候 敲入這個(gè)命令 將憑證存儲(chǔ)起來(lái) 用戶(hù)名密碼就不需要再次輸入了)
$ git config --global credential.helper wincred
# 將commit命令設(shè)置別名ci git commit命令將由git ci來(lái)代替
$ git config --global alias.ci commit
創(chuàng)建倉(cāng)庫(kù)
# 進(jìn)入目錄,將它變成Git可以管理的倉(cāng)庫(kù)
$ git init
文件提交至倉(cāng)庫(kù)
# 文件添加至?xí)捍鎱^(qū)
$ git add <file>
# 暫存區(qū)內(nèi)容提交至?xí)r間線(xiàn)
$ git commit -m <message>
# 直接使用該指令,相當(dāng)于執(zhí)行了以上兩條指令
$ git commit -am "備注信息"
查看當(dāng)前倉(cāng)庫(kù)狀態(tài)
# 時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)
$ git status
# 具體指定文件修改(工作區(qū) 對(duì)比 暫存區(qū))
$ git diff <file>
# 工作區(qū) 對(duì)比 暫存區(qū) 之間的差異
$ git diff
# 查看暫存區(qū)和倉(cāng)庫(kù)差異
$ git diff --cached
# 查看工作區(qū)文件狀態(tài)
$ ls
# 查看暫存區(qū)的狀態(tài)
$ git ls-files
版本回退
# 查看日志
$ git log
# 日志簡(jiǎn)潔輸出
$ git log --pretty=oneline
# 日志時(shí)間線(xiàn)視圖形式輸出
$ git log --graph
# Git中,用HEAD表示當(dāng)前版本,上一個(gè)版本是HEAD^,上上一個(gè)版本是HEAD^^
# 往上100個(gè)版本是HEAD~100
$ git reset --hard HEAD^
# 若又想找回怎么辦
# 先查找commit id
$ git reflog
# 使用id切換版本
$ git reset --hard commit_id
撤銷(xiāo)修改
# 丟棄工作區(qū)的修改
$ git checkout -- file
# 已經(jīng)進(jìn)入暫存區(qū)的修改撤銷(xiāo),重新放入工作區(qū)
$ git reset HEAD <file>
# 已經(jīng)提交至版本庫(kù),版本回退
$ git reset --hard commit_id
刪除文件
# 一般情況下,在文件管理器或使用rm刪除文件。這個(gè)時(shí)候需要將操作提交至?xí)捍鎱^(qū)
$ git rm <file>
# 接著commit
# 還有一種情況是誤刪,但是版本庫(kù)中還是保存了舊版本可以恢復(fù)
$ git checkout -- file
# git checkout實(shí)際上是使用時(shí)間線(xiàn)上一個(gè)版本中的內(nèi)容將現(xiàn)工作區(qū)替換(用上個(gè)版本中的該文件替換該版本中的該文件)
創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)
# 第一步創(chuàng)建SSH Key。
$ ssh-keygen -t rsa -C "youremail@example.com"
#然后可以在用戶(hù)主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)文件就是SSH Key的密鑰對(duì),一個(gè)是私鑰,一個(gè)是公鑰。
# 第二步,登錄網(wǎng)站,添加上自己的公鑰密鑰
添加遠(yuǎn)程倉(cāng)庫(kù)(本地已有倉(cāng)庫(kù))
# 首先在Github建立空的遠(yuǎn)程倉(cāng)庫(kù),接著將本地倉(cāng)庫(kù)與之關(guān)聯(lián)
# origin的名稱(chēng)可以更改,是本地倉(cāng)庫(kù)終端操作時(shí),保存的遠(yuǎn)程倉(cāng)庫(kù)的本地命名
$ git remote add origin git@github.com:michaelliao/example.git
# 本地倉(cāng)庫(kù)所有內(nèi)容推送
# 實(shí)際上是將當(dāng)前分支master推送,第一次需加-u參數(shù),將本地的master與遠(yuǎn)程的新的master相關(guān)聯(lián)
# 以后不需要再添加-u參數(shù),直接git push 推送即可
$ git push -u origin master
# 本地修改提交
$ git push origin master
# 查看遠(yuǎn)程庫(kù)信息
$ git remote -v
# 根據(jù)遠(yuǎn)程庫(kù)名字刪除遠(yuǎn)程庫(kù)
$ git remote rm name
# 更新倉(cāng)庫(kù)(比如檢測(cè)不到新建分支時(shí))
$ git remote update origin
從遠(yuǎn)程庫(kù)克隆(本地?zé)o倉(cāng)庫(kù))
# 現(xiàn)有遠(yuǎn)程庫(kù),我們本地從零開(kāi)發(fā)
# 沒(méi)有本地庫(kù),直接從遠(yuǎn)程庫(kù)克隆本地庫(kù)
$ git clone git@github.com:michaelliao/gitskills.git
# 克隆指定分支
$ git clone -b 分支名 git@github.com:michaelliao/gitskills.git
創(chuàng)建與合并分支文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-713179.html
# 創(chuàng)建并切換到一個(gè)叫dev的新分支
# 加上-b,表示創(chuàng)建并切換。相當(dāng)于以下兩部
$ git checkout -b dev
# 創(chuàng)建dev分支
$ git branch dev
# 切換到dev分支
$ git checkout dev
# 查看分支情況
$ git branch
# 若dev上做了很多工作,現(xiàn)在dev合并到master
$ git checkout master
$ git merge dev
# 合并后dev的工作就全部保存至master,可以放心刪除
$ git branch -d dev
# swich,新的分支操作命令。
# 創(chuàng)建并切換
$ git switch -c dev
# 切換至master
$ git switch master
# 普通模式下合并分支,不加參數(shù),Git會(huì)自動(dòng)使用Fast forward模式合并,刪除分支后,不會(huì)保留此處合并分支的信息。普通模式則會(huì)生成一個(gè)commit
$ git merge --no-ff -m "merge with no-ff" <branch>
# 刪除分支
$ git branch -d 分支名
# 查看遠(yuǎn)程所有分支
$ git branch -r
# 合并某個(gè)或某些提交到指定分支
# 拉取最新代碼
$ git pull
# 查看提交信息,復(fù)制要合并的commit id
$ git log
# 切換要合并到的分支
$ git checkout branch
# 將A提交合并到當(dāng)前分支
$ git cherry-pick A
# 將A和B提交合并到當(dāng)前分支
$ git cherry-pick A B
# 將A至B的所有提交合并到當(dāng)前分支,不包含A
$ git cherry-pick A..B
# 將A至B的所有提交合并到當(dāng)前分支,包含A
$ git cherry-pick A^..B
Bug分支文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-713179.html
# 遇到bug,先保存當(dāng)前工作現(xiàn)場(chǎng) (因?yàn)楫?dāng)前工作未完成,不能提交,但是不提交又不能切換分支)
$ git stash
# 現(xiàn)在工作區(qū)將是最開(kāi)始那樣,干凈的。
# 可以去改bug了。
# 確定在哪個(gè)分支上面修復(fù)Bug,假設(shè)在master上面修復(fù)
$ git checkout master
$ git checkout -b issue-101
......
# 修復(fù)完成,合并分支
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101
# bug修改結(jié)束了
# 回到之前的分支
$ git switch dev
# 查詢(xún)之前儲(chǔ)存的現(xiàn)場(chǎng)
$ git stash list
# 第一種恢復(fù),stash需刪除命令
$ git stash apply
$ git stash drop
# 第二種,恢復(fù)并刪除
$ git stash pop
# 可以多次stash,然后恢復(fù)指定的
$ git stash apply stash@{0}
# 現(xiàn)在的bug是在master上面修復(fù)的,別的分支
$ git cherry-pick <commit>
#復(fù)制一個(gè)特定的提交至當(dāng)前分支
到了這里,關(guān)于程序員必備之——代碼托管工具 git的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!