常用git指令

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 newNamegit 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)
  • 2.操作文件
    • 放棄未暫存區(qū)單個(gè)文件的修改
      git checkout filename
    • 放棄未暫存區(qū)當(dāng)前目錄下的修改
      git checkout .

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
    1. 列出要查看的tag匹配,可以
      git tag -l v1.0.*
v1.0.3
v1.0.4-201703081020
v1.0.5-201704141453
v1.0.6-201704151447
    1. 打tag:
      git tag -a v2.3.2 -m '新上線內(nèi)容說(shuō)明'
    1. 提交到遠(yuǎn)端:
      git push origin v2.3.2

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è)分支所處的情況


current.png

git merge

git checkout mywork
git merge origin
merge.jpg

git rebase

git checkout mywork
git rebase origin
rebase1.jpg
rebase2.jpg

rebase用于合并時(shí)小結(jié)

git rebase 會(huì)先找到myworkorigin分支的共同祖先,然后將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 
ji
  • 場(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}

推薦一個(gè)學(xué)習(xí)git的小游戲

https://learngitbranching.js.org/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一般來(lái)說(shuō),日常使用只要記住下圖6個(gè)命令,就可以了。但是熟練使用,恐怕要記住60~100個(gè)命令。 下面是我整理的常用...
    Wey的小窩閱讀 163評(píng)論 0 1
  • 配置 首先是配置帳號(hào)信息ssh -T git@github.com # 登陸 github 修改項(xiàng)目中的個(gè)人信息 ...
    guanguans閱讀 813評(píng)論 0 3
  • git 使用筆記 git原理: 文件(blob)對(duì)象,樹(shù)(tree)對(duì)象,提交(commit)對(duì)象 tree對(duì)象 ...
    神刀閱讀 3,847評(píng)論 0 10
  • git clone git remote add upstream http://... git checkout...
    good__day閱讀 485評(píng)論 0 4
  • 曾夢(mèng)想仗劍走天涯 看一看世界的繁華 年少的心總有些輕狂 如今你四海為家 曾讓你心疼的姑娘 如今已悄然無(wú)蹤影 愛(ài)情總...
    memore閱讀 322評(píng)論 0 0

友情鏈接更多精彩內(nèi)容