參考Git教程
1. 創(chuàng)建版本庫(kù)
| 命令 | 行為 |
|---|---|
git init |
把當(dāng)前目錄變成Git可以管理的倉(cāng)庫(kù)(添加.git文件) |
git add <file> |
將工作區(qū)中的<file>文件添加到暫存區(qū) |
git commit -m "information" |
將暫存區(qū)中的<file>文件提交到當(dāng)前分支 |
注意理解工作區(qū)、版本庫(kù)、暫存區(qū)、分支的概念。
2. 版本回退(工作區(qū)、暫存區(qū)均重置)
| 命令 | 行為 |
|---|---|
git log |
版本控制系統(tǒng)的歷史記錄 |
git log --pretty=oneline |
將歷史記錄顯示在一行 |
git reset --hard HEAD^ |
回退到上一個(gè)版本 |
git reset --hard HEAD^^ |
回退到上上一個(gè)版本 |
git reset --hard <commit id> |
回退該版本號(hào) |
git reflog |
用于查找版本號(hào)(當(dāng)前版本之后的版本) |
3. 撤銷(xiāo)修改
| 命令 | 行為 |
|---|---|
git status |
列出工作區(qū)、暫存區(qū)和當(dāng)前分支的狀態(tài) |
git checkout -- <file> |
撤銷(xiāo)工作區(qū)修改,使工作區(qū)的<file>與當(dāng)前暫存區(qū)的相同 |
git reset HEAD <file> |
撤銷(xiāo)暫存區(qū)修改,使暫存區(qū)的<file>與當(dāng)前分支的相同, |
場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file。
場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作。
場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷(xiāo)本次提交,參考版本回退,不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)。
4.刪除文件
| 命令 | 行為 |
|---|---|
git rm <file> |
從暫存區(qū)刪除<file>,同時(shí)刪除工作區(qū)的<file> |
在工作區(qū)刪除文件后,有兩種選擇:
- 確實(shí)要從版本庫(kù)中刪除該文件,那就用命令git rm刪掉,并且git commit,現(xiàn)在,文件就從版本庫(kù)中被刪除了。
- 另一種情況是刪錯(cuò)了,從當(dāng)前分支恢復(fù)到暫存區(qū)
git reset HEAD <file>,從暫存區(qū)恢復(fù)到工作區(qū)git checkout -- <file>。
4. 遠(yuǎn)程倉(cāng)庫(kù)
添加遠(yuǎn)程庫(kù)
- 創(chuàng)建SSH-Key
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" - 將當(dāng)前版本庫(kù)與github遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián) (git remote add)
git remote add origin git@github.com:michaelliao/learngit.git(復(fù)制SSH地址) - 將本地倉(cāng)庫(kù)的所有內(nèi)容推送到遠(yuǎn)程倉(cāng)庫(kù) (git push -u)
git push -u origin master
由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
從遠(yuǎn)程庫(kù)克?。╣it clone)
-
git clone git@github.com:michaelliao/gitskills.git(復(fù)制SSH地址)
5. 分支管理
創(chuàng)建與合并分支
| 命令 | 行為 |
|---|---|
git branch dev |
創(chuàng)建dev分支 |
git checkout dev |
切換到dev分支 |
git checkout -b dev |
創(chuàng)建并切換到dev分支 |
git branch |
查看分支 |
git merge dev |
合并指定分支到當(dāng)前分支。Fast-forward表示“快進(jìn)模式” |
git branch -d dev |
刪除合并過(guò)的dev分支 |
git branch -D dev |
刪除沒(méi)有被合并過(guò)的dev分支 |
開(kāi)發(fā)一個(gè)新feature,最好新建一個(gè)分支;
如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支,可以通過(guò)git branch -D <name>強(qiáng)行刪除。
解決沖突
| 命令 | 行為 |
|---|---|
git log --graph --pretty=oneline --abbrev-commit |
可以看到分支合并圖 |
分支管理策略
| 命令 | 行為 |
|---|---|
git merge --no-ff -m "merge with no-ff" dev |
禁用Fast forward(快進(jìn)模式) |
合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并。
Bug分支
| 命令 | 行為 |
|---|---|
git stash |
可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作 |
git stash list |
查看所有工作現(xiàn)場(chǎng)列表 |
git stash apply stash@{id} |
恢復(fù)工作現(xiàn)場(chǎng) |
git stash drop stash@{id} |
刪除工作現(xiàn)場(chǎng) |
git stash pop stash@{id} |
回復(fù)后再刪除工作現(xiàn)場(chǎng)(只有一個(gè)是可省略stash@{id}) |
因?yàn)楫?dāng)前正在做的分支沒(méi)有commit時(shí),操作其他分支工作區(qū)會(huì)受到影響,因此需要git stash。修復(fù)bug時(shí),我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后刪除;當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場(chǎng)。
多人協(xié)作
| 命令 | 行為 |
|---|---|
git remote |
查看遠(yuǎn)程庫(kù)的信息 |
git remote -v |
查看遠(yuǎn)程庫(kù)的詳細(xì)信息 |
git push origin dev |
將dev分支推送到遠(yuǎn)程庫(kù) |
git checkout -b dev origin/dev |
由于克隆是只克隆master分支,在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支 |
git pull 和 git fetch
|
git pull取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并 |
git branch --set-upstream dev origin/dev |
如果git pull提示“no tracking information”,則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建 |
多人協(xié)作的工作模式通常是這樣:
- 首先,可以試圖用git push origin branch-name推送自己的修改;
- 如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并;
- 如果合并有沖突,則解決沖突,并在本地提交;
- 沒(méi)有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!
6. 標(biāo)簽
| 命令 | 行為 |
|---|---|
git tag v1.0 |
為當(dāng)前分支的當(dāng)前版本創(chuàng)建標(biāo)簽 |
git tag v1.0 6224937(commit id) |
為這個(gè)版本創(chuàng)建標(biāo)簽 |
git tag -a v1.0 -m "version v1.0 released" 6224937 |
-a指定標(biāo)簽名,-m指定說(shuō)明信息 |
git tag |
查看所有標(biāo)簽 |
git show v1.0 |
查看標(biāo)簽信息 |
git tag -d v1.0 |
刪除本地標(biāo)簽 |
git push origin v1.0 |
推送某個(gè)標(biāo)簽到遠(yuǎn)程 |
git push origin --tags |
一次性推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽 |
先git tag -d v1.0再 git push origin :refs/tags/v1.0
|
先刪除本地標(biāo)簽,再刪除遠(yuǎn)程標(biāo)簽 |