git branch
- 不帶參數(shù):列出所有本地分支,并且在當(dāng)前分支的前面用"*"標(biāo)記
git branch - 列出所有遠(yuǎn)端分支
git branch -r - 列出所有分支(本地和遠(yuǎn)端)
git branch -a - 創(chuàng)建新分支
git branch myNewBranch - 刪除分支
git branch -d myBranch - 查看本地分支對(duì)應(yīng)的遠(yuǎn)程分支
git branch -vv - 給分支重命名
git branch -m oldName newName后git push origin HEAD將新分支推送到遠(yuǎn)端
git checkout
- 1.操作分支
- 切換分支到master
git checkout master - 創(chuàng)建hotfix分支并切換到hotfix分支
git checkout -b hotfix(相當(dāng)于git branch hotfix+git checkout hotfix)
- 切換分支到master
- 2.操作文件
- 放棄未暫存區(qū)單個(gè)文件的修改
git checkout filename - 放棄未暫存區(qū)當(dāng)前目錄下的修改
git checkout .
- 放棄未暫存區(qū)單個(gè)文件的修改
git reset
- 回退一個(gè)版本,且會(huì)將暫存區(qū)的內(nèi)容和本地已提交的內(nèi)容全部恢復(fù)到未暫存的狀態(tài),不影響原來(lái)本地文件(未提交的也
不受影響)
git reset (–mixed) HEAD~1 - 回退一個(gè)版本,不清空暫存區(qū),將已提交的內(nèi)容恢復(fù)到暫存區(qū),不影響原來(lái)本地的文件(未提交的也不受影響)
git reset –soft HEAD~1 - 回退一個(gè)版本,清空暫存區(qū),將已提交的內(nèi)容的版本恢復(fù)到本地,本地的文件也將被恢復(fù)的版本替換
git reset –hard HEAD~1(git reset --hard(未跟蹤的文件刪除不掉)和git clean -df用來(lái)清除未跟蹤的文件和目錄,是一對(duì)好基友. 結(jié)合使用他們能讓你的工作目錄完全回退到最近一次commit的時(shí)候)
參考鏈接:https://www.cnblogs.com/instona/p/4243009.html
git tag
- 1.列出當(dāng)前已有的tag:
git tag
v1.0.3
v1.0.4-201703081020
v1.0.5-201704141453
v1.0.6-201704151447
v2.3.1
- 列出要查看的tag匹配,可以
git tag -l v1.0.*
- 列出要查看的tag匹配,可以
v1.0.3
v1.0.4-201703081020
v1.0.5-201704141453
v1.0.6-201704151447
- 打tag:
git tag -a v2.3.2 -m '新上線內(nèi)容說(shuō)明'
- 打tag:
- 提交到遠(yuǎn)端:
git push origin v2.3.2
- 提交到遠(yuǎn)端:
git add
- git add -A 提交所有變化
- git add -u 提交被修改(modified)和被刪除(deleted)文件,不包括新文件(new)
-
git add . 提交新文件(new)和被修改(modified)文件,不包括被刪除(deleted)文件
git_version_1.0.jpg
git_version_2.0.jpg
參考文章:http://www.itdecent.cn/p/65fb3fa62057
git status
查看文件狀態(tài)
git diff
1) 工作區(qū)和暫存區(qū)比較
git diff
2)暫存區(qū)和HEAD比較
git diff --cached
3)工作區(qū)和HEAD比較
git diff HEAD
參考鏈接:https://www.cnblogs.com/lianghe01/p/5846525.html
git commit
git commit -m "message"git commit -a -m “message” 相當(dāng)于git add -u + git commit -m "message"- 對(duì)上次提交不滿(mǎn)意,繼續(xù)修改生成一個(gè)新的commit替換上次的commit,也可以不加-m 參數(shù) ,會(huì)彈出個(gè)框讓編輯上次message,不修改代表直接使用上次的message
git commit -amend -m "message"
`
原文鏈接:https://blog.csdn.net/qianxuedegushi/article/details/80311358
git rebase
rebase之前需要保證工作區(qū)沒(méi)有changes,否則會(huì)報(bào)如下錯(cuò)誤
error: cannot rebase: Your index contains uncommitted changes.
error: Please commit or stash them.
- 1.rebase和merge區(qū)別
下圖是各個(gè)分支所處的情況

git merge
git checkout mywork
git merge origin

git rebase
git checkout mywork
git rebase origin


rebase用于合并時(shí)小結(jié)
git rebase會(huì)先找到mywork和origin分支的共同祖先,然后將mywork分支共同祖先之后的commit保存為補(bǔ)丁,然后將當(dāng)前分支代碼更新帶origin最新代碼,然后在應(yīng)用剛才保存的補(bǔ)丁
- rebase和merge優(yōu)缺點(diǎn)對(duì)比
1.rebase可以保證commit線性,但是會(huì)打亂時(shí)間的排序,不產(chǎn)生新的commit,如果有沖突需要再解決完沖突后 git add . 然后
git rebase --continue繼續(xù)或者git rebase --abort恢復(fù)或者git rebase --skip跳過(guò),即使沖突也不會(huì)產(chǎn)生新commit,解決沖突的變動(dòng)會(huì)在之前提交的commit里發(fā)生變化
2.merge會(huì)產(chǎn)生一個(gè)新的merge commit,commit結(jié)構(gòu)由于不是線性看起來(lái)不是很友好,解決沖突,git add .,git commit -m message
原文鏈接:http://gitbook.liuhui998.com/4_2.html
2.rebase用于調(diào)整commit
代表調(diào)整最近4次提交,會(huì)出現(xiàn)交互界面 esc : wq后即可執(zhí)行
git rebase -i HEAD~4

- 場(chǎng)景1 將后三次提交合并到第一次提交中,則改成如下(注意)
p f0ff319 第一次提交
s 2a1aa7c 第二次提交
s c9cc729 第三次提交
s 566e84e 第四次提交
修改每個(gè)commit id前面的pick值。如果改成squash則代表將此項(xiàng)合并到上個(gè)commit里,注意在現(xiàn)實(shí)的列表里,第一個(gè)commit不能用squash因?yàn)樗呀?jīng)是第一個(gè)了所以不能合并到上一個(gè)
- 場(chǎng)景2 將第三次提交合并到第二次提交上
p f0ff319 第一次提交
p 2a1aa7c 第二次提交
s c9cc729 第三次提交
p 566e84e 第四次提交
- 場(chǎng)景3 修改第二次提交的commit message但是文件改變不變
p f0ff319 第一次提交
r 2a1aa7c 第二次提交
p c9cc729 第三次提交
p 566e84e 第四次提交
- 場(chǎng)景4 修改第二次提交的文件變動(dòng),但是message仍然使用之前的message
p f0ff319 第一次提交
e 2a1aa7c 第二次提交
p c9cc729 第三次提交
p 566e84e 第四次提交
- 場(chǎng)景5 刪除第二次提交
p f0ff319 第一次提交
d 2a1aa7c 第二次提交
p c9cc729 第三次提交
p 566e84e 第四次提交
git pull
git pull = git fetch + git merge fetch_header
git pull --rebase = git fetch + git rebase fetch_header
git push
git push時(shí)如果遠(yuǎn)端有改動(dòng),則會(huì)因?yàn)楸镜匕姹竞瓦h(yuǎn)端版本不同報(bào)reject錯(cuò)誤,所以每次push時(shí)不管有無(wú)變動(dòng)都最好先pull
所以當(dāng)遠(yuǎn)端有變動(dòng)的時(shí)候產(chǎn)生了以下2種場(chǎng)景
- 場(chǎng)景1:提交完代碼 ,pull代碼如果遠(yuǎn)端有更新 ,還會(huì)產(chǎn)生一個(gè)merge commit,或者使用rebase 就不會(huì)有新的commit ,然后push
- 場(chǎng)景2:在提交之前,先pull,如果沒(méi)有改動(dòng)相同的文件,則pull不會(huì)報(bào)錯(cuò),然后commit -> push一個(gè)完整的正常流程,如果在pull時(shí)遠(yuǎn)端有和你共同改動(dòng)的文件,pull就會(huì)報(bào)錯(cuò)提示你本地的修改會(huì)被遠(yuǎn)端覆蓋(因?yàn)閜ull就是fetch+merge)
- 場(chǎng)景2 有相同改動(dòng)時(shí)報(bào)錯(cuò)解決方法
解決方法1:此時(shí)可以采用場(chǎng)景1的方式先commit在pull,然后push
解決方法2:貯藏(git stash),然后在pull,git stash apply,git push
git stash
- 查看貯藏列表
git stash list - 應(yīng)用最近一次貯藏
git stash apply - 應(yīng)用指定貯藏(具體指定那個(gè)可以使用
git stash list查看)
git stash apply stash@{2}

