Workspace:工作區(qū)
Index / Stage:暫存區(qū)/緩沖區(qū)
Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))
Remote:遠(yuǎn)程倉(cāng)庫(kù)
1.配置:
$ git config --global user.name "rui"
$ git config --global user.email "guangruiw@163.com"
2. git 基本命令
$ git clone <repo> //從git 倉(cāng)庫(kù)拉取代碼
$ git status //查看當(dāng)前目錄布朦,提交之后是否有新的修改
$ git add <filename> //添加到緩沖區(qū)统翩, -u將tarck到的全部添加到緩沖區(qū)
$ git diff // 查看執(zhí)行給git status 的結(jié)果的詳細(xì)信息,尚未緩存的改動(dòng), --cached 查看已緩存的改動(dòng)停巷,-- stat :顯示摘要
$ git diff <filename> //產(chǎn)看文件的具體 改動(dòng)
$ git diff HEAD //查看本地工作區(qū)和版本庫(kù)之間的差異
$ git diff HEAD^ //查看本地工作區(qū)和上一個(gè)版本之間的差異
$ git commit -m "message" //將緩沖區(qū)添加到本地倉(cāng)庫(kù)中抢肛,并添加注釋
$ git commit -a // 提交所有改變的內(nèi)容,直接到倉(cāng)庫(kù)區(qū)
$ git commit -v //提交時(shí)顯示所有diff信息
$ git commit --amend -m [message] //使用一次新的commit僵闯,替代上一次提交翔横,如果代碼沒(méi)有任何新變化缅刽,則用來(lái)改寫(xiě)上一次commit的提交信息
$ git commit --amend [file1] [file2] ... //重做上一次commit啊掏,并包括指定文件的新變化
$ git rm <file> //刪除文件
$ git rm -f <file> //刪除之前已經(jīng)修改并且放到緩沖區(qū),需要強(qiáng)制的刪除
$ git rm --cached <file> //只刪除緩沖區(qū)文件衰猛,仍保留在當(dāng)前的工作目錄中
$ git mv <sourchfile> <targetfile> //移動(dòng)或重命名文件迟蜜,目錄,軟連接
$ git tag -a v1.0 //創(chuàng)建一個(gè)帶注解的標(biāo)簽
3. git 分支管理
$ git branch //列出分支
$ git branch <branchname> //創(chuàng)建分支
$ git branch -r //查看遠(yuǎn)程分支
$ git branch -a //查看本地和遠(yuǎn)程的所有分支\
$ git checkout <branchname> //切換分支
$ git checkout -b <branchname> //創(chuàng)建分支并立即切換到該分支下面
$ git branch -d <branchname> //刪除分支
$ git checkout –b dev origin/dev //創(chuàng)建本地dev分支并將遠(yuǎn)程的origin的dev分支到本地來(lái)啡省,
$ git merge <branchname> //將branchname分支合并到當(dāng)前分支下面(當(dāng)前分支認(rèn)可合并所有分支的所有修改娜睛,合并沖突時(shí),需要手動(dòng)修改沖突文件卦睹,然后再用git add 和 git commit
$ git stash //隱藏當(dāng)前的工作現(xiàn)場(chǎng)(等待恢復(fù)后繼續(xù)任務(wù))畦戒,執(zhí)行該命令后(git status 命令查看是沒(méi)有任何的改動(dòng)的)可以創(chuàng)建其他分支用于進(jìn)行其他的任務(wù)
$ git stash list //查看git stash隱藏的工作現(xiàn)場(chǎng)
$ git stash apply //恢復(fù)后,stash內(nèi)容并不刪除结序,你需要使用命令git stash drop來(lái)刪除障斋。
$ git stash pop //恢復(fù)的同時(shí)把stash內(nèi)容也刪除了。
4. git版本控制
$ git log //最新修改在最前面
$ git log --oneline //查看歷史記錄的簡(jiǎn)潔版本
$ git log --graph //查看歷史記錄
$ git log --reverse //逆向顯示所有日志
$ git log --author=rui //查看指定用戶(hù)提交的日志
$ git reset --hard HEAD^ //返回到上一個(gè)版本,回退到上上個(gè)版本只需把HEAD^ 改成 HEAD^^ 以此類(lèi)推
$ git reset --hard HEAD~100 //回退到前一百個(gè)版本
$ git reset --hard <版本號(hào)> //回退到指定的版本
$ git rebase origin/master //直接和遠(yuǎn)端的master分支之間rebase
$ git rebase master //和本地的master分支之間rebase(本地master和遠(yuǎn)端的master之間可能不是同步的)
reset 三種模式的區(qū)別
- --hard:重置位置的同時(shí),直接將 working Tree工作目錄垃环、 index 暫存區(qū)及 repository 都重置成目標(biāo)Reset節(jié)點(diǎn)的內(nèi)容,所以效果看起來(lái)等同于清空暫存區(qū)和工作區(qū)邀层。
(1) 要放棄目前本地的所有改變時(shí),即去掉所有add到暫存區(qū)的文件和工作區(qū)的文件晴裹,可以執(zhí)行 git reset -hard HEAD 來(lái)強(qiáng)制恢復(fù)git管理的文件夾的內(nèi)容及狀態(tài)被济;(2) 真的想拋棄目標(biāo)節(jié)點(diǎn)后的所有commit(可能覺(jué)得目標(biāo)節(jié)點(diǎn)到原節(jié)點(diǎn)之間的commit提交都是錯(cuò)了,之前所有的commit有問(wèn)題)涧团。
- --soft:重置位置的同時(shí)只磷,保留working Tree工作目錄和index暫存區(qū)的內(nèi)容,只讓repository中的內(nèi)容和 reset 目標(biāo)節(jié)點(diǎn)保持一致泌绣,因此原節(jié)點(diǎn)和reset節(jié)點(diǎn)之間的【差異變更集】會(huì)放入index暫存區(qū)中(Staged files)钮追。所以效果看起來(lái)就是工作目錄的內(nèi)容不變,暫存區(qū)原有的內(nèi)容也不變阿迈,只是原節(jié)點(diǎn)和Reset節(jié)點(diǎn)之間的所有差異都會(huì)放到暫存區(qū)中元媚。
原節(jié)點(diǎn)和reset節(jié)點(diǎn)之間的【差異變更集】會(huì)放入index暫存區(qū)中(Staged files),所以假如我們之前工作目錄沒(méi)有改過(guò)任何文件苗沧,也沒(méi)add到暫存區(qū)刊棕,那么使用reset --soft后,我們可以直接執(zhí)行 git commit 將 index暫存區(qū)中的內(nèi)容提交至 repository 中待逞。為什么要這樣呢甥角?這樣做的使用場(chǎng)景是:假如我們想合并「當(dāng)前節(jié)點(diǎn)」與「reset目標(biāo)節(jié)點(diǎn)」之間不具太大意義的 commit 記錄(可能是階段性地頻繁提交,就是開(kāi)發(fā)一個(gè)功能的時(shí)候,改或者增加一個(gè)文件的時(shí)候就commit识樱,這樣做導(dǎo)致一個(gè)完整的功能可能會(huì)好多個(gè)commit點(diǎn)嗤无,這時(shí)假如你需要把這些commit整合成一個(gè)commit的時(shí)候)時(shí),可以考慮使用reset --soft來(lái)讓 commit 演進(jìn)線圖較為清晰怜庸〉狈福總而言之,可以使用--soft合并commit節(jié)點(diǎn)割疾。
- --mixed(默認(rèn)):重置位置的同時(shí)嚎卫,只保留Working Tree工作目錄的內(nèi)容,但會(huì)將 Index暫存區(qū) 和 Repository 中的內(nèi)容更改和reset目標(biāo)節(jié)點(diǎn)一致宏榕,因此原節(jié)點(diǎn)和Reset節(jié)點(diǎn)之間的【差異變更集】會(huì)放入Working Tree工作目錄中驰凛。所以效果看起來(lái)就是原節(jié)點(diǎn)和Reset節(jié)點(diǎn)之間的所有差異都會(huì)放到工作目錄中〉F耍總之工作目錄的修改恰响、暫存區(qū)的內(nèi)容以及由 reset 所導(dǎo)致的新的文件差異,都會(huì)被放進(jìn)工作目錄
(1)使用完reset --mixed后涌献,我們可以直接執(zhí)行 git add 將這些改變果的文件內(nèi)容加入 index 暫存區(qū)中胚宦,再執(zhí)行 git commit 將 Index暫存區(qū) 中的內(nèi)容提交至Repository中,這樣一樣可以達(dá)到合并commit節(jié)點(diǎn)的效果(與上面--soft合并commit節(jié)點(diǎn)差不多,只是多了git add添加到暫存區(qū)的操作)枢劝;(2)移除所有Index暫存區(qū)中準(zhǔn)備要提交的文件(Staged files)井联,我們可以執(zhí)行 git reset HEAD 來(lái) Unstage 所有已列入 Index暫存區(qū) 的待提交的文件。(有時(shí)候發(fā)現(xiàn)add錯(cuò)文件到暫存區(qū)您旁,就可以使用命令)烙常。(3)commit提交某些錯(cuò)誤代碼,或者沒(méi)有必要的文件也被commit上去鹤盒,不想再修改錯(cuò)誤再commit(因?yàn)闀?huì)留下一個(gè)錯(cuò)誤commit點(diǎn))蚕脏,可以回退到正確的commit點(diǎn)上,然后所有原節(jié)點(diǎn)和reset節(jié)點(diǎn)之間差異會(huì)返回工作目錄侦锯,假如有個(gè)沒(méi)必要的文件的話就可以直接刪除了驼鞭,再commit上去就OK了。
使用fetch更新倉(cāng)庫(kù)
//方法一 $ git fetch origin master //從遠(yuǎn)程的origin倉(cāng)庫(kù)的master分支下載代碼到本地的>origin master $ git log -p master.. origin/master//比較本地的倉(cāng)庫(kù)和遠(yuǎn)程參考的區(qū)別 $ git merge origin/master//把遠(yuǎn)程下載下來(lái)的代碼合并到本地倉(cāng)庫(kù)尺碰,遠(yuǎn)程的和>本地的合并 //方法二 $ git fetch origin master:temp //從遠(yuǎn)程的origin倉(cāng)庫(kù)的master分支下載到本地>并新建一個(gè)分支temp $ git diff temp//比較master分支和temp分支的不同 $ git merge temp//合并temp分支到master分支 $ git branch -d temp//刪除temp
git fetch 后可以使用
git log FETCH_HEAD
產(chǎn)看差異
可以使用git merge命令或者git rebase命令挣棕,在本地分支上合并遠(yuǎn)程分支。git merge origin/master
或者git rebase origin/master
表示在當(dāng)前分支上亲桥,合并origin/master
5. 替換本地改動(dòng)
$ git checkout -- filename //丟棄工作區(qū)的修改洛心,不會(huì)影響已經(jīng)提交到緩沖區(qū)的內(nèi)容。指令先從緩存區(qū)中拉取版本還原题篷,如果沒(méi)有再到版本庫(kù)中拉取還原词身。
$ git fetch origin //丟棄本地的所有改動(dòng)和提交,到服務(wù)器上獲取最新的的版本歷史
$ git reset --hard origin:master //切換到拉到本地時(shí)的master
$ git pull <遠(yuǎn)程主機(jī)名><遠(yuǎn)程分支名>:<本地分支名> //在工作目錄獲取并合并遠(yuǎn)端的改動(dòng)
$ git fetch origin 遠(yuǎn)程分支:本地分支 //拉取遠(yuǎn)程分支并創(chuàng)建本地分支
$ git pull [remote] [branch] //取回遠(yuǎn)程倉(cāng)庫(kù)的變化悼凑,并與本地分支合并
git pull和 git fetch 跟著一個(gè) git merge FETCH_HEAD實(shí)現(xiàn)的功能一樣,原理不一樣
6.刪除恢復(fù)文件
$ git rm fillename //刪除指定文件
$ git rm
使用
rm filename
刪除文件后使用git status
查看的時(shí)候能發(fā)現(xiàn)璧瞬,只是在工作區(qū)刪除了文件户辫,操作并沒(méi)有被add到緩存區(qū),可以是使用git checkout -- filename
來(lái)恢復(fù)文件到工作區(qū)嗤锉,或使用git add 來(lái)將刪除提交到緩沖區(qū)渔欢。
使用git rm fillename
刪除文件,指令執(zhí)行之后git status
查看的時(shí)候發(fā)現(xiàn)刪除操作已經(jīng)add到了緩沖區(qū)這時(shí)候要恢復(fù)文件可以使用git reset head filename
執(zhí)行后將刪除的文件恢復(fù)到緩沖區(qū)后使用git checkout -- filename
恢復(fù)文件到工作區(qū)
從效果上看rm filename + git add filename == git rm filename
7. 推送改動(dòng)
$ git remote //列出遠(yuǎn)程主機(jī)名
$ git push <遠(yuǎn)程主機(jī)名><本地分支名>:<遠(yuǎn)程分支名> //推動(dòng)到遠(yuǎn)端倉(cāng)庫(kù)
$ git push origin master //將改動(dòng)提交到遠(yuǎn)端倉(cāng)庫(kù),可以把 master 換成你想要推送的任何分支
8. 子模塊
$ git clone --recursive //
9:代碼提交示例:
$ git status //查看修改
$ git add -u (git add <filename>)//將修改添加到緩沖區(qū)
$ git diff //查看改動(dòng)瘟忱,確定是要提交的內(nèi)容
$ git commit -m "annotation" //將緩沖區(qū)提交到了 HEAD奥额,并添加注釋
$ git push <遠(yuǎn)程主機(jī)名><本地分支名>:<遠(yuǎn)程分支名> //推動(dòng)到遠(yuǎn)端倉(cāng)庫(kù)