分布式版本控制系統(tǒng) Git
組成結(jié)構(gòu)
- 工作區(qū):就是你在電腦里能看到的目錄。兩種狀態(tài):已跟蹤(tracked)或未跟蹤(untracked)。
- 暫存區(qū):英文叫 stage 或 index。一般存放在 .git 目錄下的 index 文件(.git/index)中,所以我們把暫存區(qū)有時(shí)也叫作索引(index)。
- 版本庫(kù):工作區(qū)有一個(gè)隱藏目錄 .git,是 Git 的版本庫(kù)。
- 遠(yuǎn)程倉(cāng)庫(kù)
操作
初始化
// 本地初始化空倉(cāng)庫(kù)
git init // 使用當(dāng)前目錄作為Git倉(cāng)庫(kù),并創(chuàng)建.git文件
git init [dir_name] // 指定目錄
查看狀態(tài)
git status // 查看項(xiàng)目的當(dāng)前狀態(tài)
git status -s // 以精簡(jiǎn)的方式顯示文件狀態(tài)
// 查看執(zhí)行 git status 的結(jié)果的詳細(xì)信息
git diff // 尚未緩存的改動(dòng)
git diff --cached // 查看已緩存的改動(dòng)
git diff HEAD // 查看已緩存的與未緩存的所有改動(dòng)
git diff --stat // 顯示摘要而非整個(gè) diff
查看歷史
git log
/* 添加參數(shù)
https://www.cnblogs.com/biglucky/p/5076885.html
*/
--oneline // 簡(jiǎn)潔的版本
--before={3.weeks.ago}
--after={2010-04-18}
--no-merges // 隱藏合并提交
--pretty=format:"%cn committed %h on %cd" // 格式化
git blame [file_name] // 顯示修改記錄
添加文件到本地倉(cāng)庫(kù)
git add [.|file_name] // 開(kāi)始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時(shí)把有沖突的文件標(biāo)記為已解決狀態(tài)
git commit –m "commit messages" // 將緩存區(qū)內(nèi)容添加到倉(cāng)庫(kù)中
git commit -am "項(xiàng)目初始化+目錄結(jié)構(gòu)劃分" // 將已跟蹤文件放到暫存區(qū)(省略 git add)
git commit --amend // 進(jìn)入vim編輯器,對(duì)上次提交的內(nèi)容進(jìn)行修改,也可以修改提交說(shuō)明
遠(yuǎn)程倉(cāng)庫(kù)
// 創(chuàng)建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin git@github.com:pipizh/mini-program.git // 本地和遠(yuǎn)程倉(cāng)庫(kù)相互關(guān)聯(lián)
git push -u origin master // 推送 → 用本地分支合并到遠(yuǎn)程分支。
git remote -v // 查看當(dāng)前的遠(yuǎn)程庫(kù),執(zhí)行時(shí)加上 -v 參數(shù),可以看到每個(gè)別名的實(shí)際鏈接地址。
git fetch // 從遠(yuǎn)程倉(cāng)庫(kù)下載新分支與數(shù)據(jù)。
git pull // git fetch 和 git merge FETCH_HEAD 的簡(jiǎn)寫(xiě)?!?將遠(yuǎn)程分支合并到本地分支。
版本回退
reset 的本質(zhì):移動(dòng) HEAD 以及它所指向的 branch
git reset HEAD file_name
// 添加選項(xiàng)
git reset --hard id // 根據(jù) id 回退到指定的提交版本,此回退操作不建議
git reset --mixed id // (默認(rèn))
git reset --soft id
// git reflog 查看id
// --hard:刪除工作空間改動(dòng)代碼,撤銷(xiāo)commit,撤銷(xiāo)git add,撤銷(xiāo)工作區(qū)修改
// --mixed:撤銷(xiāo)commit,撤銷(xiāo)git add,保留工作目錄
// --soft:保留工作目錄的內(nèi)容,并把因?yàn)楸A艄ぷ髂夸泝?nèi)容所帶來(lái)的新的文件差異放進(jìn)暫存區(qū),即只撤銷(xiāo)commit
刪除文件
git rm <file> // 刪除工作區(qū)文件,并且將這次刪除放入暫存區(qū),提交之后會(huì)刪除版本庫(kù)中的文件。
// 同時(shí)暫存區(qū)不能存有該文件,如果刪除文件之前修改過(guò)并且已經(jīng)放到暫存區(qū)的話,git rm 命令會(huì)報(bào)錯(cuò)。必須要用強(qiáng)制刪除選項(xiàng) -f
git rm -f <file> // 刪除工作區(qū)和暫存區(qū)文件,并且將這次刪除放入暫存區(qū)。
git rm --cached <file> // 刪除暫存區(qū)文件,但保留工作區(qū)的文件,并且將這次刪除放入暫存區(qū)。
git rm –r * // 遞歸刪除整個(gè)目錄中的所有子目錄和文件
克隆
// clone 遠(yuǎn)程倉(cāng)庫(kù)
git clone url_name [dir_name] // 指定地址和存放目錄(可選)
git clone git@github.com:fsliurujie/test.git // SSH協(xié)議
git clone git://github.com/fsliurujie/test.git // GIT協(xié)議
git clone https://github.com/fsliurujie/test.git // HTTPS協(xié)議
標(biāo)簽管理
如果你達(dá)到一個(gè)重要的階段,并希望永遠(yuǎn)記住那個(gè)特別的提交快照,你可以使用 git tag 給它打上標(biāo)簽。
git tag -a v1.0 [id] -m "commit messages"http:// 給最新一次提交打上(HEAD,也可通過(guò)id選定)"v1.0"的標(biāo)簽,-m 選項(xiàng)意為"創(chuàng)建一個(gè)帶注解的標(biāo)簽"(可選)
git show v1.0 // 查看此版本所修改的內(nèi)容
git tag // 查看所有標(biāo)簽
git checkout v1.0 // 切換到標(biāo)簽v1.0
git push v1.0
git push --tags // 推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽
git tag -d v1.0 // 刪除本地標(biāo)簽v1.0
git push origin :refs/tags/v1.0 // 刪除遠(yuǎn)程標(biāo)簽v1.0
分支管理
git branch branch_name // 創(chuàng)建分支
git checkout branch_name // 切換分支
git checkout -b branch_name // 創(chuàng)建子分支,并切換到子分支上。git 將還原你的工作目錄到分支的狀態(tài)
git branch -d branch_name // 刪除本地分支
git push origin -d branch_name // 刪除遠(yuǎn)程分支
git branch // 查看所有分支
// 將文件推送到遠(yuǎn)程倉(cāng)庫(kù)并創(chuàng)建遠(yuǎn)程分支
git push origin branch_name
// 合并分支
git checkout branch_name_1
git merge branch_name_2 // 切換到 branch_name_1,將 branch_name_2 分支上的代碼合并到 branch_name_1
git push // 此命令默認(rèn)推送到遠(yuǎn)程master
分支沖突
https://www.cnblogs.com/gavincoder/p/9071959.html
合并分支時(shí),會(huì)產(chǎn)生沖突,不管在本地上合并兩個(gè)分支,或是本地分支與遠(yuǎn)程分支的合并。(多人合作場(chǎng)景下)
如果在相同文件名下相同位置出現(xiàn)不同的修改(修改了同一個(gè)文件的名稱),合并時(shí)就會(huì)產(chǎn)生沖突。Git用<<<<<<<、=======、>>>>>>>標(biāo)記出不同分支的內(nèi)容。
解決沖突:git status 查看沖突文件,再手動(dòng)編輯為希望的內(nèi)容并add+commit。
開(kāi)發(fā)建議:每次開(kāi)發(fā)前先從 git 上 down 下來(lái)最新的代碼在 master 上,在 master 基礎(chǔ)上建立自己的分支,做的修改在分支提交。push 時(shí)先從遠(yuǎn)程倉(cāng)庫(kù) pull master,然后和本地分支進(jìn)行合并 merge 后再 push。這樣即使修改同一個(gè)文件也不容易沖突。
錯(cuò)誤
Git命令中文顯示亂碼的問(wèn)題解決 git config --global core.quotepath false