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
- 查看本地分支對應(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ū)單個文件的修改
git checkout filename
- 放棄未暫存區(qū)當(dāng)前目錄下的修改
git checkout .
- 放棄未暫存區(qū)單個文件的修改
git reset
- 回退一個版本,且會將暫存區(qū)的內(nèi)容和本地已提交的內(nèi)容全部恢復(fù)到未暫存的狀態(tài),不影響原來本地文件(未提交的也
不受影響)
git reset (–mixed) HEAD~1
- 回退一個版本,不清空暫存區(qū),將已提交的內(nèi)容恢復(fù)到暫存區(qū),不影響原來本地的文件(未提交的也不受影響)
git reset –soft HEAD~1
- 回退一個版本,清空暫存區(qū),將已提交的內(nèi)容的版本恢復(fù)到本地,本地的文件也將被恢復(fù)的版本替換
git reset –hard HEAD~1
(git reset --hard
(未跟蹤的文件刪除不掉)和git clean -df
用來清除未跟蹤的文件和目錄已维,是一對好基友. 結(jié)合使用他們能讓你的工作目錄完全回退到最近一次commit的時候)
參考鏈接: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)容說明'
- 打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)文件
參考文章:http://www.reibang.com/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"
- 對上次提交不滿意,繼續(xù)修改生成一個新的commit替換上次的commit,也可以不加-m 參數(shù) 蛔溃,會彈出個框讓編輯上次message,不修改代表直接使用上次的message
git commit -amend -m "message"
`
原文鏈接:https://blog.csdn.net/qianxuedegushi/article/details/80311358
git rebase
rebase之前需要保證工作區(qū)沒有changes,否則會報如下錯誤
error: cannot rebase: Your index contains uncommitted changes.
error: Please commit or stash them.
- 1.rebase和merge區(qū)別
下圖是各個分支所處的情況
git merge
git checkout mywork
git merge origin
git rebase
git checkout mywork
git rebase origin
rebase用于合并時小結(jié)
git rebase
會先找到mywork
和origin
分支的共同祖先篱蝇,然后將mywork
分支共同祖先之后的commit保存為補丁贺待,然后將當(dāng)前分支代碼更新帶origin
最新代碼,然后在應(yīng)用剛才保存的補丁
- rebase和merge優(yōu)缺點對比
1.rebase可以保證commit線性零截,但是會打亂時間的排序麸塞,不產(chǎn)生新的commit,如果有沖突需要再解決完沖突后 git add . 然后
git rebase --continue
繼續(xù)或者git rebase --abort
恢復(fù)或者git rebase --skip
跳過,即使沖突也不會產(chǎn)生新commit,解決沖突的變動會在之前提交的commit里發(fā)生變化
2.merge會產(chǎn)生一個新的merge commit
涧衙,commit結(jié)構(gòu)由于不是線性看起來不是很友好喘垂,解決沖突,git add .
,git commit -m message
原文鏈接:http://gitbook.liuhui998.com/4_2.html
2.rebase用于調(diào)整commit
代表調(diào)整最近4次提交,會出現(xiàn)交互界面 esc : wq后即可執(zhí)行
git rebase -i HEAD~4
- 場景1 將后三次提交合并到第一次提交中,則改成如下(注意)
p f0ff319 第一次提交
s 2a1aa7c 第二次提交
s c9cc729 第三次提交
s 566e84e 第四次提交
修改每個commit id前面的pick值绍撞。如果改成squash則代表將此項合并到上個commit里正勒,注意在現(xiàn)實的列表里,第一個commit不能用squash因為他已經(jīng)是第一個了所以不能合并到上一個
- 場景2 將第三次提交合并到第二次提交上
p f0ff319 第一次提交
p 2a1aa7c 第二次提交
s c9cc729 第三次提交
p 566e84e 第四次提交
- 場景3 修改第二次提交的commit message但是文件改變不變
p f0ff319 第一次提交
r 2a1aa7c 第二次提交
p c9cc729 第三次提交
p 566e84e 第四次提交
- 場景4 修改第二次提交的文件變動傻铣,但是message仍然使用之前的message
p f0ff319 第一次提交
e 2a1aa7c 第二次提交
p c9cc729 第三次提交
p 566e84e 第四次提交
- 場景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
時如果遠(yuǎn)端有改動章贞,則會因為本地版本和遠(yuǎn)端版本不同報reject錯誤,所以每次push時不管有無變動都最好先pull
所以當(dāng)遠(yuǎn)端有變動的時候產(chǎn)生了以下2種場景
- 場景1:提交完代碼 非洲,pull代碼如果遠(yuǎn)端有更新 鸭限,還會產(chǎn)生一個merge commit,或者使用rebase 就不會有新的commit 两踏,然后push
- 場景2:在提交之前败京,先pull,如果沒有改動相同的文件梦染,則pull不會報錯赡麦,然后commit -> push一個完整的正常流程朴皆,如果在pull時遠(yuǎn)端有和你共同改動的文件,pull就會報錯提示你本地的修改會被遠(yuǎn)端覆蓋(因為pull就是fetch+merge)
- 場景2 有相同改動時報錯解決方法
解決方法1:此時可以采用場景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)用指定貯藏(具體指定那個可以使用
git stash list
查看)
git stash apply stash@{2}