一、使用git前需要做的最小配置
1、設(shè)置user.name和user.email
git config --global user.name 'your_name'
git config --global user.email 'you_email@domain.com'
2、config的三個(gè)作用域
git config --local # 只對(duì)某個(gè)倉(cāng)庫(kù)有效;缺省時(shí),等于```local```
git config --global # 對(duì)當(dāng)前用戶所有倉(cāng)庫(kù)有效
git config --system # 對(duì)系統(tǒng)所有登錄的用戶有效
顯示config的配置,加--list即可
git config --list --local
git config --list --global
git config --list --system
q鍵退出查看頁(yè)面
二、創(chuàng)建git倉(cāng)庫(kù)
有兩種場(chǎng)景
1、把已有的項(xiàng)目加入到git管理
將本地已有項(xiàng)目上傳到新建git倉(cāng)庫(kù)
2、新建的項(xiàng)目加入到git管理
cd 某個(gè)文件夾
git init you_project # 會(huì)在當(dāng)前路徑下創(chuàng)建和項(xiàng)目名稱同名的文件夾
cd you_project # 該文件夾下會(huì)有個(gè).git的隱藏文件夾,是git的核心文件,不能刪
三、通過commit來(lái)認(rèn)識(shí)工作區(qū)和暫存區(qū)

# 工作區(qū)就是本地有.git文件的目錄
git add index.html git-logo # 從工作區(qū)添加到暫存區(qū)
git commit -m "正常提交1" # 正式提交和說(shuō)明;從暫存區(qū)提交到版本歷史
三、提交過的文件改名
場(chǎng)景:readme改名成readme.md
方式一:
mv readme readme.md # 刪除readme ,新增readme.md
git add readme.md # 把readme.md 添加到暫存區(qū)
git rm readme # 刪除暫存區(qū)的readme
git status # 查看狀態(tài),此時(shí)git的打印區(qū)會(huì)顯示readme改名成了eadme.md
- 清空暫存區(qū)的所有文件(很危險(xiǎn),建議不要用)
git reset --hard
方式二:
git mv readme readme.md # 直接暫存區(qū)改名
git status # 查看狀態(tài),此時(shí)git的打印區(qū)會(huì)顯示readme改名成了eadme.md
git commit -m "readme 改名為 readme.md" # 從暫存區(qū)提交到版本歷史
四、查看版本演變歷史日志
git log
- 查看列表
git log --oneline - 指定最近的4次commit
git log -n4 --oneline - 查看所有分支的日志
git log -all - 圖形化查看日志
git log --all --graph - 也可以用圖形化界面來(lái)查看歷史日志
gitk # 打開圖形化界面
五、分支相關(guān)的命令
- 創(chuàng)建分支
$ git branch test - 切換分支
git checkout iss53 - 創(chuàng)建并切換分支
git checkout -b test - 查看現(xiàn)有分支以及關(guān)系
git branch -av
或
gitk -all - 刪除分支
git branch -d test
或:
git branch -D test
六、commit相關(guān)的命令
- 正式提交和說(shuō)明;從暫存區(qū)提交到版本歷史
git commit -m "說(shuō)明" - 查看commit歷史日志
git log -x,x可指定次數(shù) - 修改最近一次commit的message
git commit --amend,會(huì)進(jìn)入一個(gè)vi界面,可在里面對(duì)commit的message內(nèi)容進(jìn)行修改,操作方式和vi一樣 - 修改歷史commit的message
1.首先輸入命令:git rebase -i 要修改的commit的父commit的hash id號(hào)
2.然后在reabse界面中,進(jìn)行內(nèi)容修改。由于現(xiàn)在要對(duì)4292430開頭的commit版本的message進(jìn)行修改,所以相對(duì)的行中的pick改成reword,然后:wq!保存退出
3.在步驟2后,會(huì)自動(dòng)跳轉(zhuǎn)到4292430開頭的commit版本的vi內(nèi)容頁(yè)面,此時(shí)修改界面的message內(nèi)容,并:wq!保存退出即可




-
把連續(xù)的多個(gè)commit整理成1個(gè)commit
1.首先查看歷史commit:git log -條數(shù)
2.假設(shè)想要合并最近的4次的commit,那么則填寫最舊一次的父級(jí)commit的id(也就是倒數(shù)第5次的):git rebase -i 倒數(shù)第5次的id
3.在界面中,把需要合并的版本前面的pick改成s````;注意,要被合并到的版本內(nèi)容無(wú)需改動(dòng)。然后:wq保存退出 4.步驟3后,會(huì)跳出個(gè)說(shuō)明界面;在界面中,填寫本次合并的原因,并:wq```保存退出
多個(gè)commit合并
說(shuō)明界面
合并結(jié)果 -
把間隔不連續(xù)的多個(gè)commit整理成1個(gè)commit
示例:合并圖中的2個(gè)commit
目的
1.因?yàn)橐喜⒌钠渲幸粋€(gè)commit,屬于最初的父級(jí),所以id寫它的即可:git rebase -i xxx
2.打開的文件內(nèi)容中,只會(huì)有父級(jí)以外的內(nèi)容(這里只有2條),所以需要手動(dòng)加入最初父級(jí)的操作內(nèi)容信息
3.把要合并的commit版本的內(nèi)容復(fù)制,寫到要被合并的commit版本的下面,然后把pick改成s,接著刪除原本的內(nèi)容(如果有多條也是如此操作),然后:wq保存退出
4.步驟3后,會(huì)跳出個(gè)說(shuō)明界面;在界面中,填寫本次合并的原因,并:wq保存退出




-
清除最近的幾次commit提交(把HEAD、暫存區(qū)和工作區(qū)都恢復(fù)到指定commit版本的文件情況)
1.首先查看最近的幾次提交git log
2.恢復(fù)內(nèi)容到指定的commit版本(謹(jǐn)慎使用):git reset --hard commit版本的hash id
結(jié)果 查看不同分支最新的commit的差異
1.所有文件差異:git diff 分支名1 分支名2
2.指定文件差異:git diff 分支名1 分支名2 -- 文件名1 文件名2 ...
PS.其實(shí)分支名就是個(gè)指針,會(huì)指向該分支的最新一次的commit提交查看不同commit提交的差異
1.所有文件差異:git diff commitId1 commitId2
2.指定文件差異:git diff commitId1 commitId2 -- 文件名1 文件名2 ...
七、暫存區(qū)相關(guān)的命令
-
比較暫存區(qū)和head所含文件的差異(head意思是最近一次commit版本提交;也就是當(dāng)前分支的文件和最近的一次commit的文件作比較)
git diff - -cached
1.假設(shè)當(dāng)前版本歷史有個(gè)test.md文件
2.此時(shí)在本地對(duì)test.md文件進(jìn)行了修改,并git add test.md到暫存區(qū)
3.此時(shí)可以使用git diff - -cached來(lái)查看存區(qū)和head所含文件的差異
結(jié)果 -
比較工作區(qū)和暫存區(qū)所含文件的差異
git diff默認(rèn)就是工作區(qū)和暫存區(qū)所含文件的差異
1.現(xiàn)在在本地修改test.md文件和創(chuàng)建一個(gè)空白test2.md文件
2.然后git diff查看工作區(qū)和暫存區(qū)所含文件的差異
3.結(jié)果是test2.md文件并沒有出現(xiàn)在差異結(jié)果中,因?yàn)樗€沒歸git管理,并且還沒添加內(nèi)容(注意:git是按照文件內(nèi)容來(lái)進(jìn)行管理的,如果2個(gè)不同文件,內(nèi)容一樣,在git管理中,是一個(gè)blob文件)
結(jié)果 git diff
1.默認(rèn)情況,是查看工作區(qū)和暫存區(qū)所有包含文件的差異
2.指定查看某些文件在工作區(qū)和暫存區(qū)的差異:git diff -- 文件名1 文件名2 ...
3.如果需要查看head和暫存區(qū)的:git diff - -cached
八、文件恢復(fù)相關(guān)的命令reset
-
讓暫存區(qū)恢復(fù)成和HEAD的一樣
有時(shí)候會(huì)出現(xiàn)想要把git add到暫存區(qū)的文件,恢復(fù)成和當(dāng)前分支最新的commit版本(也就是HEAD)的一樣:git reset HEAD -- 文件名1 文件名2 ...(不寫文件名則是全部文件)
結(jié)果 -
讓工作區(qū)恢復(fù)成和暫存區(qū)的一樣
checkout
有時(shí)候會(huì)出現(xiàn)在本地進(jìn)行文件修改后,不想要了,想要恢復(fù)成和git add到暫存區(qū)的文件內(nèi)容一樣:git checkout -- 文件名1 文件名2 ...(不寫文件名則是全部w)
結(jié)果
九、正確刪除文件
- 方式1
1.首先工作去刪除文件
2.然后暫存區(qū)刪除文件:git rm 文件名 - 方式2(推薦)
git rm 文件名
十、
一部分文件在暫存區(qū)了,一部分還在工作區(qū)修改,此時(shí)有bug需要臨時(shí)進(jìn)行修復(fù)。此時(shí)可以把手頭的工作放到一個(gè)區(qū)域,等bug修復(fù)完畢后,再把工作去回復(fù)到以前的狀態(tài)。
1.先把手頭的工作放到一個(gè)區(qū)域:git stash
2.查看stash:git stash list
3.查看status:git status

4-1.當(dāng)修改完bug后,再回復(fù)回去:
git stash apply(把stash的文件回復(fù)到工作區(qū),但是stash中的東西不會(huì)進(jìn)行刪除)
4-2.第二種方式,就是使用
git stash pop(把stash中的內(nèi)容刪除,并回復(fù)到工作區(qū))
11、指定不需要git管理的文件
在.git同級(jí)目錄下,創(chuàng)建.gitingore文件,不同語(yǔ)言的不一樣,可參考:https://gitee.com/BattleCall/gitignore
git fetch和git pull 的區(qū)別
git fetch是將遠(yuǎn)程主機(jī)的最新內(nèi)容拉到本地,用戶在檢查了以后決定是否合并到工作本機(jī)分支中。
而git pull 則是將遠(yuǎn)程主機(jī)的最新內(nèi)容拉下來(lái)后直接合并,即:git pull = git fetch + git merge,這樣可能會(huì)產(chǎn)生沖突,需要手動(dòng)解決。
12、同個(gè)分支中,不同人修改了不同的文件
1.克隆項(xiàng)目到本地:git fetch xxx
2.查看當(dāng)前項(xiàng)目本地分支和遠(yuǎn)端分支:git branch -av
3.讓本地分支和遠(yuǎn)端分支相關(guān)聯(lián)(feature分支):git checkout -b 遠(yuǎn)端分支 本地分支
4.添加修改的文件:git add xxx
5.提交文件:git commit -m "aabbcc"
ps. 如果出現(xiàn)遠(yuǎn)端項(xiàng)目的文件或內(nèi)容,比本地的多或者不一樣(沖突),那么則需要合并:git merge 遠(yuǎn)端分支

13、同個(gè)分支中,不同人修改了同個(gè)文件的不同區(qū)域內(nèi)容
后來(lái)者進(jìn)行push時(shí),會(huì)報(bào)錯(cuò)

- 解決方法
1.先f(wàn)etch:git fetch
2.查看分支情況:git branch -av
3.merge合并分支(共同管理的是feature分支):git merge(如果彈出個(gè)merge頁(yè)面,則代表成功了)
4.可以cat查看下那個(gè)文件內(nèi)容,確定是否合并成功
5.再進(jìn)行push:git push
步驟3
14、同個(gè)分支中,不同人修改了同個(gè)文件的同個(gè)區(qū)域的內(nèi)容
1.pull本地項(xiàng)目和push遠(yuǎn)程項(xiàng)目時(shí),都會(huì)報(bào)這個(gè)文件的沖突錯(cuò)誤

- 解決方法1:手動(dòng)解決沖突
1.vim 進(jìn)入沖突的文件,進(jìn)行內(nèi)容修改
2.查看當(dāng)前狀態(tài):git status
3.如果我們做的變更ok的,那就直接:git commit -m "解決沖突"
4.push到遠(yuǎn)端:git push
沖突文件內(nèi)容
修改后的沖突文件
status后的提示內(nèi)容
15、A變更了文件名和B變更了文件的內(nèi)容,同時(shí)commit,變更文件名的先push(成功),變更內(nèi)容的后push(報(bào)錯(cuò))

- 解決方法
1.git能夠主動(dòng)幫助我們解決這個(gè)問題:git pull
2.然后查看當(dāng)前文件情況:ls -al,此時(shí)文件名和里面的內(nèi)容都已經(jīng)同步到最新的(新的文件名和新的內(nèi)容)
16、多人把同個(gè)文件的文件名修改成了不同的文件名
這種情況無(wú)法直接使用get pull解決,它會(huì)把文件都拉下來(lái),讓我們手動(dòng)解決這個(gè)情況

- 解決方法
1.查看下狀態(tài):git status
2.經(jīng)過協(xié)商,最終名字是index1.htm
3.刪除最初名字的文件:git rm index.htm
4.添加想要的文件名到暫存區(qū):git add index1.htm1
5.刪除不想要的名字的文件:git rm index2.htm
6.查看下狀態(tài):git status
7.提交:git commit -m "解決沖突,文件名使用index1.html"
8.同步到遠(yuǎn)端:git push
status1
status2














