Git常見命令和遇到問題的解決辦法

一、Git整體理解

Git代碼管理是分布式管理方式系統(tǒng),優(yōu)點在于其極高的安全性和非常強大的分支管理。


image.png
  • 工作區(qū)(working directory): 就是本地的代碼區(qū),電腦能看到的目錄,就是工作區(qū).

  • 暫存區(qū)(Index):工作區(qū)下有一個隱藏的'.git'文件,其主要作用是存儲Git自動創(chuàng)建的第一個master分支,還有指向master分支的HEAD指針.還有一個最重要的stage的暫存區(qū).需要提交的文件修改通通放到暫存區(qū),然后一次性提交到暫存區(qū)的所有修改.

  • 本地倉: 本地的個人倉庫.管理著個人的代碼的版本信息.

  • 遠程倉: 線上的倉庫.管理著推送到服務(wù)器的代碼版本.

過程一、有工作區(qū)<->暫存區(qū)

  • 工作區(qū)->暫存區(qū):
    用git add . 添加所有的修改或者git add <文件名>添加單個指定的文件修改到暫存區(qū)中.
  • 暫存區(qū)->工作區(qū):
    (1)git rm --cached "文件路徑" 不刪除物理文件,緊將git的緩存刪除.
    (2)git rm --f "文件路徑" 不僅將該文件從緩存中 刪除,還將物理文件刪除(不會放到垃圾桶).
    例如: git rm -rf .DS_Store
    (3)git reset <版本號> 利用版本庫清空暫存區(qū).原理:將當前分支重設(shè)(reset)到指定的<commit>或者HEAD(默認,如果不指定commit,默認是HEAD,即最新的一次提交)
    --hard
    git reset --hard <commit號>重設(shè)(reset)index和working directory,自從<commit>以來在working directory中的任何改變都被丟棄,并把HEAD指向<commit>
    --soft
    git reset --soft <commit號>index和working directory中的內(nèi)容不作任何改變,僅僅把HEAD指向<commit>。這個模式的效果是,執(zhí)行完畢后,自從<commit>以來的所有改變都會顯示在git status的"Changes to be committed"中

過程二、由暫存區(qū)<->本地倉庫

  • 暫存區(qū)->本地倉庫
    用git commit -m'本次commit的描述'
  • 本地倉庫->暫存區(qū)
    (1) git reset <版本號> 利用版本庫清空暫存區(qū).原理:將當前分支重設(shè)(reset)到指定的<commit>或者HEAD(默認,如果不指定commit,默認是HEAD,即最新的一次提交)
    (2) --hard
    git reset --hard <commit號>重設(shè)(reset)index和working directory,自從<commit>以來在working directory中的任何改變都被丟棄,并把HEAD指向<commit>
    (3) --soft
    git reset --soft <commit號>index和working directory中的內(nèi)容不作任何改變,僅僅把HEAD指向<commit>。這個模式的效果是,執(zhí)行完畢后,自從<commit>以來的所有改變都會顯示在git status的"Changes to be committed"中.退回到該次commit提交,但是該版本之后所有的修改都沒有了,如果想要恢復(fù),就要試圖從還未關(guān)閉的終端中找到你想要的退回的版本號,或者用git reflog查找你想要的commit版本號.繼續(xù)用git reset --soft <commit號>回退

過程三、由本地倉->遠程倉庫

git push

說明:三種git add的區(qū)別

-git add .提交新文件(new)和被修改(modified)的文件,不包括被刪除(deleted)的文件

  • git add -u提交被修改(modified)和被刪除(deleted)的文件,不包括新文件(new)
  • git add -A 提交所有變化

1、在本地創(chuàng)建一個Git管理的項目

  • 從線上拉項目到本地
    git clone "項目的地址路徑"克隆一個Git管理的項目到本地
  • 本地項目上傳線上
    git init
    git remote add origin "地址url"

2、Git上的常用查看操作

(1)查看文本內(nèi)容
cat<文件名>
(2)查看git的狀態(tài)
git status會告訴你在當前的分支上git的情況(有沒有修改,修改的文件是什么等)

3、查看更詳細的文件修改

git diff查看所有文件的不同
git diff <文件名>查看指定文件的不同
diff是difference的縮寫,只能查看還未add(還沒加入到暫存區(qū))的修改

4、查看所有的commit信息

git log
git log --pretty=oneline更簡潔的查看log信息(只有commit號和描述信息)

5、查看所有的git操作過的命令,可以找到刪除了的commit號

git reflog

6、查看分支合并圖

git log --graph

四、沖突處理

需要把

<<<<<<HEAD
=======
>>>>>>

中間的刪掉

五、Git分支操作

1、分支基本操作

  • 分支的創(chuàng)建和切換
    git branch "分支名"創(chuàng)建一個分支git checkout "分支名"切換到該分支
    創(chuàng)建并切換到該分支git checkout -b "分支名"
  • 列出所有的分支
    git branch列出本地分支 用*標記當前的分支
    git branch -a列出遠程分支
  • 合并分支
    git merge "分支名"合并指定分支到當前分支
    git rebase "分支名"合并指定分支到當前分支
    兩者的區(qū)別在于會不會保留分支操作的記錄,前者記錄,后者不記錄.建議用merge
  • 刪除分支
    刪除本地分支:git branch -d "分支名"
    強制刪除本地分支:git branch -D "分支名"
    刪除遠程分支:git push origin :<分支名>(輕易不要動?。?br> 如果提示the branch XXX is not fully merged(XXX分支有沒合并到當前分支的內(nèi)容)
  • 本地新建了一個分支要推送到線上,需要設(shè)置關(guān)聯(lián)或者追蹤
    第一次push:git push origin 本地分支名:遠程分支名
  • 遠程端生成了一個新的分支,拉取到本地
    先關(guān)聯(lián)遠程端分支到本地:git branch --set-upstream-to=origin/<線上分支名> <本地分支名>
    然后git pull

六、bug的分支

用issue作為分支的開頭標記,當有一個bug出現(xiàn)需要改的時候,先拉取一個issue分支,修改并合并到開發(fā)分支上,然后刪除issue分支。

七、feature分支

  • 開發(fā)新的功能的時候,最好拉取一個新的分支,以feature開頭。
  • 丟掉一個沒有合并過的分支,即刪除分支
    git branch -D <分支名>強制刪除該分支內(nèi)容

八、暫存的使用

1、git stash暫存
2、 git stash list查看所有的暫存
3、git stash apply從暫存開始執(zhí)行,但是stash內(nèi)容不會刪除
4、 git stash drop刪除暫存
5、git stash pop回復(fù)暫存的同時刪除暫存
6、git stash apply stash@{0}恢復(fù)指定的暫存

九、遠程倉的操作

  • 查看遠程倉的信息
    git remote
    git remote -v顯示更詳細的信息
  • 將分支推送到遠程倉
    git push origin 本地分支名:遠程分支名

十、標簽的使用

標簽智能在master分支上使用,盡量寫清楚所有的修改,為了萬一的版本回退做好描述工作。
1、git tag <name>新建一個標簽
2、git tag -a <name> -m'指定的標簽信息'
3、git show <tag名字>查看詳細的tag信息
4、git tag查看所有的tag名字
5、git tag -d <標簽名字>刪除一個標簽
6、git push origin < 標簽名>推送標簽到遠程
7、git push origin --tags一次性推送所有未推送的標簽
8、刪除遠程倉上的tag

  • 先刪除本地的標簽:git tag -d <tag名字>
  • 刪除遠程端的標簽:git push origin :tag名字

十一、Git配置全局信息

1、配置作者名稱
git config --global user.name "Your Name"
2、配置個人郵箱
git config --global user.email "email@example.com"
3、配置git的顏色(文件名會標記上顏色)
git config --global color.ui true

十二、Linux的一些簡單操作和一些符號的解釋

1、目錄/文件的操作
-mkdir "目錄名" 在當前路徑下創(chuàng)建一個文件夾

  • mvdir "目錄1" "目錄2"移動或者重命名一個目錄 (如果目錄2不存在,就直接修改目錄1的名稱為目錄2)

  • rmdir"目錄名" 刪除一個目錄

  • touch創(chuàng)建一個文件

  • vim "文件名 編輯文件,如果文件不存在,就創(chuàng)建并進入編輯.

  • 刪除一個文件
    sudo rm -rf <文件名> 在上帝權(quán)限下刪除,可以刪除一個該用戶沒有權(quán)限的文件(包括系統(tǒng)文件),不建議使用
    rm <文件名>能刪除當前用戶權(quán)限下的文件
    2、轉(zhuǎn)換目錄

  • cd + "路徑"進入該文件目錄下(也可以將文件直接拖進來)

  • cd ..回到上級目錄

-cd . 當前目錄 cd / 回到根目錄

  • cd test.rtf 不可用. 不能cd到文件里.只能cd到目錄.
    報錯信息: -bash: cd: test.rtf: Not a directory
    3、拷貝/移動/刪除
    cp "需要拷貝的文件路徑" "目標地址路徑"
    拷貝文件 例如: cp /Users/goulela/Desktop/test.rtf /Users/goulela/Desktop/文件夾2
    mv "需要移動的文件路徑" "目標地址路徑"
    移動文件 例如: mv 文件夾2 /Users/goulela/Desktop/創(chuàng)建文件夾/文件夾
    4、顯示操作
    -file "文件名"顯示文件的類型

  • wc "文件名"統(tǒng)計文件的字符數(shù),詞數(shù),行數(shù)

  • pwd查看當前所在的目錄

  • ls 顯示當前路徑下有什么文件

  • ls + "目錄名" 顯示特定的路徑下有什么文件

  • ls -w 顯示中文

  • ls -l 詳細信息

  • ls -a 顯示所有文件,包括隱藏文件

5、時間操作

  • data顯示系統(tǒng)的當前日期和時間
  • cal顯示日歷
    6、網(wǎng)絡(luò)與通信
  • ping "url" 給一個遠程主機發(fā)送 回應(yīng)請求
  • 終止ping打印 control + c
  • who 列出當前登錄的所有用戶
  • whoami顯示當前正進行操作的用戶名

十三、符號解釋

1、-r 就是向下遞歸,不管有多少級目錄,一并刪除
2、-f 就是直接強行刪除,不作任何提示的意思
3、-rf 向下遞歸強制刪除

十四、顯示安裝詳細信息

在安裝命令后面添加--verbose,可以查看打印詳細信息

十五、git config

配置git的相關(guān)參數(shù)
git一共有3個配置文件:
1、倉庫級的配置文件:在倉庫的.git/.gitconfig,該配置文件只對所在的倉庫有效。
2、全局配置文件:Mac系統(tǒng)在~/.gitconfig,Windows系統(tǒng)在C:\Users\<用戶名>\.gitconfig。
3、系統(tǒng)級的配置文件:在Git的安裝目錄下(Mac系統(tǒng)下安裝目錄在/usr/local/git)的etc文件夾下的gitconfig。

# 查看配置信息
# --local:倉庫級,--global:全局級,--system:系統(tǒng)級
$ git config <--local | --global | --system> -l

# 查看當前生效的配置信息
$ git config -l

# 編輯配置文件
# --local:倉庫級,--global:全局級,--system:系統(tǒng)級
$ git config <--local | --global | --system> -e

# 添加配置項
# --local:倉庫級,--global:全局級,--system:系統(tǒng)級
$ git config <--local | --global | --system> --add <name> <value>

# 獲取配置項
$ git config <--local | --global | --system> --get <name>

# 刪除配置項
$ git config <--local | --global | --system> --unset <name>

# 配置提交記錄中的用戶信息
$ git config --global user.name <用戶名>
$ git config --global user.email <郵箱地址>

# 更改Git緩存區(qū)的大小
# 如果提交的內(nèi)容較大,默認緩存較小,提交會失敗
# 緩存大小單位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <緩存大小>

# 調(diào)用 git status/git diff 命令時以高亮或彩色方式顯示改動狀態(tài)
$ git config --global color.ui true

# 配置可以緩存密碼,默認緩存時間15分鐘
$ git config --global credential.helper cache

# 配置密碼的緩存時間
# 緩存時間單位:秒
$ git config --global credential.helper 'cache --timeout=<緩存時間>'

# 配置長期存儲密碼
$ git config --global credential.helper store

十六、Git clone

從遠程倉庫克隆一個版本庫到本地。

# 默認在當前目錄下創(chuàng)建和版本庫名相同的文件夾并下載版本到該文件夾下
$ git clone <遠程倉庫的網(wǎng)址>

# 指定本地倉庫的目錄
$ git clone <遠程倉庫的網(wǎng)址> <本地目錄>

# -b 指定要克隆的分支,默認是master分支
$ git clone <遠程倉庫的網(wǎng)址> -b <分支名稱> <本地目錄>

十七、Git init

初始化項目所在目錄,初始化后會在當前目錄下出現(xiàn)一個名為.git的目錄。

# 初始化本地倉庫,在當前目錄下生成 .git 文件夾
$ git init

十八、git status

查看本地倉庫的狀態(tài)

# 查看本地倉庫的狀態(tài)
$ git status

# 以簡短模式查看本地倉庫的狀態(tài)
# 會顯示兩列,第一列是文件的狀態(tài),第二列是對應(yīng)的文件
# 文件狀態(tài):A 新增,M 修改,D 刪除,?? 未添加到Git中
$ git status -s

十九、git remote

操作遠程庫

# 列出已經(jīng)存在的遠程倉庫
$ git remote

# 列出遠程倉庫的詳細信息,在別名后面列出URL地址
$ git remote -v
$ git remote --verbose

# 添加遠程倉庫
$ git remote add <遠程倉庫的別名> <遠程倉庫的URL地址>

# 修改遠程倉庫的別名
$ git remote rename <原遠程倉庫的別名> <新的別名>

# 刪除指定名稱的遠程倉庫
$ git remote remove <遠程倉庫的別名>

# 修改遠程倉庫的 URL 地址
$ git remote set-url <遠程倉庫的別名> <新的遠程倉庫URL地址>

二十、git branch

操作git的分支命令

# 列出本地的所有分支,當前所在分支以 "*" 標出
$ git branch

# 列出本地的所有分支并顯示最后一次提交,當前所在分支以 "*" 標出
$ git branch -v

# 創(chuàng)建新分支,新的分支基于上一次提交建立
$ git branch <分支名>

# 修改分支名稱
# 如果不指定原分支名稱則為當前所在分支
$ git branch -m [<原分支名稱>] <新的分支名稱>
# 強制修改分支名稱
$ git branch -M [<原分支名稱>] <新的分支名稱>

# 刪除指定的本地分支
$ git branch -d <分支名稱>

# 強制刪除指定的本地分支
$ git branch -D <分支名稱>

二十一、git checkout

檢出命令,用于創(chuàng)建,切換分支等

# 切換到已存在的指定分支
$ git checkout <分支名稱>

# 創(chuàng)建并切換到指定的分支,保留所有的提交記錄
# 等同于 "git branch" 和 "git checkout" 兩個命令合并
$ git checkout -b <分支名稱>

# 創(chuàng)建并切換到指定的分支,刪除所有的提交記錄
$ git checkout --orphan <分支名稱>

# 替換掉本地的改動,新增的文件和已經(jīng)添加到暫存區(qū)的內(nèi)容不受影響
$ git checkout <文件路徑>

二十二、git cherry-pick

把已經(jīng)提交的記錄合并到當前分支。

# 把已經(jīng)提交的記錄合并到當前分支
$ git cherry-pick <commit ID>

二十三、git add

把要提交的文件的信息添加到暫存區(qū)中。當使用git commit時,將依據(jù)暫存區(qū)中的內(nèi)容類進行文件的提交。

# 把指定的文件添加到暫存區(qū)中
$ git add <文件路徑>

# 添加所有修改、已刪除的文件到暫存區(qū)中
$ git add -u [<文件路徑>]
$ git add --update [<文件路徑>]

# 添加所有修改、已刪除、新增的文件到暫存區(qū)中,省略 <文件路徑> 即為當前目錄
$ git add -A [<文件路徑>]
$ git add --all [<文件路徑>]

# 查看所有修改、已刪除但沒有提交的文件,進入一個子命令系統(tǒng)
$ git add -i [<文件路徑>]
$ git add --interactive [<文件路徑>]

二十四、git commit

將暫存區(qū)中的文件提交到本地倉庫中。

# 把暫存區(qū)中的文件提交到本地倉庫,調(diào)用文本編輯器輸入該次提交的描述信息
$ git commit

# 把暫存區(qū)中的文件提交到本地倉庫中并添加描述信息
$ git commit -m "<提交的描述信息>"

# 把所有修改、已刪除的文件提交到本地倉庫中
# 不包括未被版本庫跟蹤的文件,等同于先調(diào)用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"

# 修改上次提交的描述信息
$ git commit --amend

二十五、git fetch

從遠程倉庫獲取最新的版本到本地的tmp分支上。

# 將遠程倉庫所有分支的最新版本全部取回到本地
$ git fetch <遠程倉庫的別名>

# 將遠程倉庫指定分支的最新版本取回到本地
$ git fetch <遠程主機名> <分支名>

二十六、git merge

合并分支

# 把指定的分支合并到當前所在的分支下
$ git merge <分支名稱>

二十七、git diff

比較版本之間的差異

# 比較當前文件和暫存區(qū)中文件的差異,顯示沒有暫存起來的更改
$ git diff

# 比較暫存區(qū)中的文件和上次提交時的差異
$ git diff --cached
$ git diff --staged

# 比較當前文件和上次提交時的差異
$ git diff HEAD

# 查看從指定的版本之后改動的內(nèi)容
$ git diff <commit ID>

# 比較兩個分支之間的差異
$ git diff <分支名稱> <分支名稱>

# 查看兩個分支分開后各自的改動內(nèi)容
$ git diff <分支名稱>...<分支名稱>

二十八、git pull

從遠程倉庫獲取最新版本合并到本地。
首先會執(zhí)行g(shù)it fetch,然后執(zhí)行 git merge,把獲取的分支的HEAD合并到當前分支。

# 從遠程倉庫獲取最新版本。
$ git pull

二十九、git push

把本地倉庫的提交推送到遠程倉庫

# 把本地倉庫的分支推送到遠程倉庫的指定分支
$ git push <遠程倉庫的別名> <本地分支名>:<遠程分支名>

# 刪除指定的遠程倉庫的分支
$ git push <遠程倉庫的別名> :<遠程分支名>
$ git push <遠程倉庫的別名> --delete <遠程分支名>

三十、git log

把本地倉庫的提交推送到遠程倉庫

# 把本地倉庫的分支推送到遠程倉庫的指定分支
$ git push <遠程倉庫的別名> <本地分支名>:<遠程分支名>

# 刪除指定的遠程倉庫的分支
$ git push <遠程倉庫的別名> :<遠程分支名>
$ git push <遠程倉庫的別名> --delete <遠程分支名>

三十一、git reset

還原提交記錄

# 重置暫存區(qū),但文件不受影響
# 相當于將用 "git add" 命令更新到暫存區(qū)的內(nèi)容撤出暫存區(qū),可以指定文件
# 沒有指定 commit ID 則默認為當前 HEAD
$ git reset [<文件路徑>]
$ git reset --mixed [<文件路徑>]

# 將 HEAD 的指向改變,撤銷到指定的提交記錄,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>

# 將 HEAD 的指向改變,撤銷到指定的提交記錄,文件未修改
# 相當于調(diào)用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>

# 將 HEAD 的指向改變,撤銷到指定的提交記錄,文件也修改了
$ git reset --hard <commit ID>

三十二、git revert

生成一個新的提交來撤銷某次提交,此次提交之前的所有提交都會被保留。

# 生成一個新的提交來撤銷某次提交
$ git revert <commit ID>

三十三、刪除掉本地不存在的遠程分支

多人合作開發(fā)時,如果遠程的分支被其他開發(fā)刪除掉,在本地執(zhí)行 git branch --all 依然會顯示該遠程分支,可使用下列的命令進行刪除:

# 使用 pull 命令,添加 -p 參數(shù)
$ git pull -p

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

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

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