常用的 git 命令總結(jié)


三大區(qū)域: 工作區(qū) → 緩存區(qū) → 本地倉庫



一 、

? ??使用 git config 命令進(jìn)行配置:

? ? git config --global user.name "<用戶名字>"

? ? git config --global user.email "<用戶郵箱>"

? ? 配置完成后,家目錄下會生成 .gitconfig 文件。

? ? ssh-keygen -t rsa:本地生成 SSH 密鑰對,用戶家目錄下生成 .ssh 目錄,復(fù)制此目錄里公鑰的內(nèi)容到 github 的相關(guān)處,設(shè)置 SSH 直連


二 、

? ??git 要求對本地倉庫關(guān)聯(lián)的每個遠(yuǎn)程主機(jī)都必須指定一個主機(jī)名,用于本地倉庫識別自己關(guān)聯(lián)的主機(jī),git remote 命令就用于管理主機(jī),一個本地倉庫可以關(guān)聯(lián)多個主機(jī)

? ? git clone <URL>:克隆一個遠(yuǎn)端倉庫到當(dāng)前目錄,執(zhí)行此命令后,當(dāng)前這個克隆來的新倉庫就關(guān)聯(lián)到了遠(yuǎn)端,也就是主機(jī),默認(rèn)新建的本地倉庫名和遠(yuǎn)端倉庫名一致,默認(rèn)主機(jī)名為 origin,默認(rèn)分支為 master。同時,這個遠(yuǎn)端倉庫的所有分支也一并被克隆到了本地倉庫,但這些分支不會出現(xiàn)在 git branch 的列表中,因為它們是隱式分支,不同于上游分支,上游分支是指本地分支跟蹤的遠(yuǎn)端分支,執(zhí)行 git branch -r 可以看到這些隱式分支

? ? 關(guān)于上個命令的補(bǔ)充:如果此時執(zhí)行 git checkout dev 切換到分支 dev(這個分支 dev 需要在遠(yuǎn)端有同名分支,所以才能不用新建直接切換),那么本地的分支列表里就有了 dev 分支,同時這個本地分支 dev 已經(jīng)關(guān)聯(lián)到了遠(yuǎn)端同名分支,這個遠(yuǎn)端同名分支又叫前者的上游分支,而且此時本地分支和隱式分支的代碼版本一樣。這時回到主分支,執(zhí)行 git merge dev 和 git merge origin/dev ,雖然結(jié)果相同,但是本質(zhì)上不同:前者是合并本地分支 dev,后者則是合并遠(yuǎn)端傳進(jìn)來的隱式分支 origin/dev 。如果在 dev 分支上提交但不推送,origin/dev 的版本無變化;如果在 dev 分支上推送提交到遠(yuǎn)端,那么 origin/dev 這個隱式分支的代碼版本會自動更新

? ? git clone -o <haha> <URL> :結(jié)果同上個命令,只是把預(yù)設(shè)的主機(jī)名改成了 haha

? ? git clone <URL> <hello> :克隆一個遠(yuǎn)端倉庫到當(dāng)前目錄,并把這個克隆得到的本地倉庫更名為 hello

? ? git init:將當(dāng)前所在目錄變成本地倉庫

? ? git remote add <主機(jī)名> <URL>:把當(dāng)前本地倉庫關(guān)聯(lián)(跟蹤)到 github 遠(yuǎn)程倉庫,注意主機(jī)名不可同名。此命令不會把該主機(jī)的遠(yuǎn)程分支信息都添加到本地倉庫成為隱式分支,因為這個命令沒有在本地生成與之關(guān)聯(lián)的顯式分支,這一點(diǎn)與 git clone 不同

? ? git remote rename <one> <two> :修改主機(jī)名 one 為 two

? ? git remote -v:查看本地倉庫關(guān)聯(lián)的主機(jī)信息(主機(jī)名和網(wǎng)址)

? ? git remote set-url <origin> <URL>:修改當(dāng)前倉庫關(guān)聯(lián)(跟蹤)的遠(yuǎn)端倉庫網(wǎng)址,origin 為主機(jī)名

? ? git remote rm <origin>:刪除本地倉庫與遠(yuǎn)端的關(guān)聯(lián),即刪除與主機(jī) origin 的關(guān)聯(lián)

? ? git remote remove <origin> :同上


三 、

? ??git status:查看當(dāng)前分支的全部區(qū)域狀態(tài)

? ? git add <file>:添加工作區(qū)的文件修改到暫存區(qū)

? ? git add <A/*>:添加工作區(qū) A 目錄下的全部修改到暫存區(qū)

? ? git add .:添加全部修改到暫存區(qū)

? ? git ls-files :查看已經(jīng)被跟蹤的文件列表

? ? git diff:查看未添加到緩存區(qū)的修改(不包含未被跟蹤的文件,即新建的且未使用過 git add 添加到緩存區(qū)的新建文件)

? ? git diff --cached:查看已添加到緩存區(qū)的修改

? ? git diff <版本號1> <版本號2> :查看相對于版本 1 來說,版本 2 的不同(通常版本 1 要早于 版本 2)

? ? git diff <dev2> :和分支 dev2 比,當(dāng)前分支有什么不同,比的是全部三大區(qū)域

? ? git diff <dev2> <file1> :和分支 dev2 比,當(dāng)前分支有什么不同,只比較文件 file1

? ? git checkout -- <file>:撤銷此文件未添加到緩存區(qū)的修改(對未被跟蹤的文件無效)

? ? git checkout .:撤銷全部未添加到緩存區(qū)的修改(對未被跟蹤的文件無效)

? ? git rm --cached <file>:撤銷已添加到緩存區(qū)的修改

? ? git reset -- <file>:撤銷已添加到緩存區(qū)的修改

? ? git reset --:撤銷緩存區(qū)的全部內(nèi)容

? ? git commit -m '<備注>':提交緩存區(qū)的修改到本地代碼庫

? ? git commit -a -m '<備注>':將沒有加到緩存區(qū)的修改一并提交,但 -a 選項不會添加未被跟蹤的文件

? ? 關(guān)于忽略文件的配置文件:在本地倉庫的根目錄下創(chuàng)建文件 .gitignore ,并將此文件提交,即生效。但是已經(jīng)提交的文件中如果有符合忽略規(guī)則的,就管不了了,人家已經(jīng)上船了


四 、

? ? git log <dev>:查看分支 dev 的提交歷史記錄,即使用 git commit 命令的記錄(默認(rèn)是時間倒序,最近的提交排在最上面),不寫分支名查看當(dāng)前分支的提交歷史記錄

? ? git log --reverse:時間正序顯示提交歷史記錄

? ? git log --oneline:一行顯示提交歷史記錄

? ? git log --graph :圖示法顯示提交歷史

? ? git log --reverse --oneline --graph?:時間正序 + 一行顯示 + 圖示法顯示

? ? git log -n :顯示最近的 n 個提交

*? ? git log -p :不知道啥玩意

? ? git log --author <作者> :查看指定作者的提交記錄

? ? git reset --hard HEAD^ / HEAD~1:退回上一個版本(HEAD 就是指向 master 的指針)

? ? git reset --hard HEAD^^ / HEAD~2:退回上兩個版本

? ? git reset --hard <版本號>:進(jìn)入到此版本

*? ? git reset --soft <版本號> :軟退回,待補(bǔ)充

? ? git reflog:查看本地版本變化記錄,包括提交、退回和切換分支。這個記錄是本地記錄,它是不會被傳到遠(yuǎn)端的,刪除本地倉庫后,就沒了

? ? git reset --hard HEAD@{n}:退回到最近 n 次本地版本變化前


五 、

? ??git branch:查看本地分支列表

? ? git branch -vv :查看本地分支列表詳情(包括分支名、關(guān)聯(lián)信息和最新提交信息),這里可以寫倆 v ,可以寫八個 v ,都沒事兒

? ? git branch -r:查看遠(yuǎn)端分支列表(此命令不聯(lián)網(wǎng)),所謂遠(yuǎn)端分支,就是本地隱式分支

? ? git branch -a :查看本地和遠(yuǎn)端(也就是本地隱式分支)所有分支 (此命令不聯(lián)網(wǎng))

? ? git branch -a -vv:綜上所述(可簡寫為 git branch -avv)

? ? git branch -d / -D <dev>?:刪除本地分支 dev ,可以一次刪除多個,此命令不能在 dev 分支下進(jìn)行

? ? git branch -rd <origin>/<dev> :刪除本地隱式分支 origin/dev

? ? git branch -m <dev1> <dev2> :將本地分支 dev1 重命名為 dev2

? ? git push origin :<dev> :刪除主機(jī)為 origin 的遠(yuǎn)程分支 dev

? ? 關(guān)于查看分支的命令的補(bǔ)充 :以上所有 branch 命令都是針對本地倉庫關(guān)聯(lián)的主機(jī),實際上顯示的都是本地分支,只是有顯式、隱式之分而已。既然這些命令都不聯(lián)網(wǎng),如何獲得遠(yuǎn)端分支(也就是本地隱式分支)的信息呢?真相就是執(zhí)行 git clone 時,會傳進(jìn)來該主機(jī)全部的遠(yuǎn)端分支信息,這些遠(yuǎn)端分支被稱為本地隱式分支,執(zhí)行 git fetch 命令可以刷新這些信息,執(zhí)行 git push 時也會刷新當(dāng)前分支關(guān)聯(lián)的隱式分支信息,執(zhí)行 git pull 時,除了刷新當(dāng)前主機(jī)的全部遠(yuǎn)端分支信息外,還拉取了當(dāng)前分支的遠(yuǎn)端分支提交,如果當(dāng)前分支版本不低于它所關(guān)聯(lián)的遠(yuǎn)端分支,那么執(zhí)行 git pull 與執(zhí)行 git fetch 作用一樣。所有關(guān)聯(lián)到遠(yuǎn)端的本地分支的都有對應(yīng)的隱式分支在本地。注意:這些命令刷新本地隱式分支信息,只對當(dāng)前分支所屬的主機(jī)有效

? ? git fetch :把當(dāng)前分支所屬主機(jī)的所有遠(yuǎn)端分支的最新提交版本傳到本地倉庫(此命令需聯(lián)網(wǎng)),相當(dāng)于刷新了全部的本地隱式分支。注意,這些傳到本地倉庫的隱式分支用 git branch -r 命令才能看到,因為它們就是遠(yuǎn)程分支的復(fù)制版啊。重要的一點(diǎn):如果遠(yuǎn)端分支被刪除,執(zhí)行此命令后,本地的同名隱式分支是不會被刪除的。如何把這些最新的隱式分支版本合并到本地分支呢?參見下一個命令

? ? git merge <origin>/<haha> :把本地隱式分支合并到當(dāng)前所在分支(因為此操作不聯(lián)網(wǎng),所以需先執(zhí)行 git fetch 刷新一下),如果要合并同名隱式分支的話,直接執(zhí)行 git merge 即可

? ? git fetch <主機(jī)名 origin> <分支名 dev> :更新任意主機(jī)的任意一個遠(yuǎn)端分支的最新版本到本地,此命令在任何分支下執(zhí)行效果都一樣

? ? git fetch <origin> <dev>:<test> :該命令會新建一個本地分支 test ,同時將遠(yuǎn)端分支 dev (注意:這里不是本地隱式分支,此命令需聯(lián)網(wǎng))的版本傳入此新建分支,但二者不自動關(guān)聯(lián),不自動切換分支。此命令在任何分支執(zhí)行,效果相同

? ? 補(bǔ)充 :所有 fetch 命令都需聯(lián)網(wǎng),執(zhí)行后都不會自動切換分支

? ? git branch <dev>:創(chuàng)建新分支 dev,新建分支與執(zhí)行此命令時所在的分支內(nèi)容一致(不聯(lián)網(wǎng),不切換)

? ? git checkout <dev>:切換到分支 dev

? ? git checkout - :切換回上一個分支,此命令類似于 Linux 命令 cd -

? ? git checkout -b <dev>:創(chuàng)建新分支 dev 并切換到此分支,新建分支與執(zhí)行此命令時所在的分支代碼版本一致。

? ? 注意:以上新建分支的命令不聯(lián)網(wǎng),得到的新建分支未與遠(yuǎn)端同名分支產(chǎn)生關(guān)聯(lián),所以不能直接 git pull 或 push 。關(guān)于如何在不關(guān)聯(lián)遠(yuǎn)端分支的情況下推送以及如何關(guān)聯(lián)遠(yuǎn)端分支,參見下文第六部分

? ? git checkout -b <haha> origin/<dev> :創(chuàng)建新分支 haha 并切換到此分支,同時將本地隱式分支 dev 的全部內(nèi)容拉取到此新建分支,此時新建分支已經(jīng)關(guān)聯(lián)到遠(yuǎn)端分支 dev,其中 origin 為主機(jī)名,這步操作也不聯(lián)網(wǎng)。由于這個新建分支和與之關(guān)聯(lián)的遠(yuǎn)端分支不同名,所以無法直接使用 git push 命令推送。如果 dev 是 master,可以省略

? ? git merge <dev>:合并本地分支 dev 的所有提交到當(dāng)前分支。合并遠(yuǎn)程分支(也就是本地隱式分支也差不多,詳見上面。所有的 merge 操作都不聯(lián)網(wǎng)。如果當(dāng)前分支版本高于 dev 分支,合并無效

? ? git merge --squash <dev> :合并本地分支 dev 到當(dāng)前分支,只合并文件修改,不合并提交,log 是沒變化的。執(zhí)行此操作后這些修改就已經(jīng)在當(dāng)前分支的暫存區(qū),等待提交。當(dāng)然合并隱式分支也是一樣的

? ? git rebase <dev> :也是把 dev 分支合并到本地分支(dev 可以是本地顯式分支,也可以是本地隱式分支)。幾點(diǎn)補(bǔ)充:1、如果合并的分支起了沖突,修改沖突文件并添加到緩存區(qū),然后執(zhí)行 git rebase --continue,若是不想合并了,執(zhí)行 git rebase --abort 即退回到合并前的狀態(tài);2、因為 rebase 是基于的意思,也就是基于 dev 分支進(jìn)行的合并,合并成功后,兩條分支的所有提交保留,并且不產(chǎn)生新的提交,dev 的提交記錄在前,當(dāng)前分支的提交記錄在后;3、如果當(dāng)前本地分支版本高于 dev,那么合并無效。它和 git merge 的區(qū)別參見?此鏈接 ,里面的圖中,箭頭畫反了

? ? git pull --rebase origin <dev> :把遠(yuǎn)端分支 origin/dev 合并到當(dāng)前本地分支,注意是遠(yuǎn)端分支不是本地隱式分支,因為該命令有了 pull ,所以聯(lián)網(wǎng)。其它說明參見上個命令。很多人說它相當(dāng)于執(zhí)行了 git fetch 后又執(zhí)行了 git rebase,其實不對,這就是與上一個命令第 3 點(diǎn)補(bǔ)充不同的地方,如果沒有產(chǎn)生沖突,分兩種情況:1、若本地分支的高版本曾推送到遠(yuǎn)端,此命令可以將遠(yuǎn)程分支的低版本覆蓋當(dāng)前分支的高版本;2、若本地分支的高版本未曾推送至遠(yuǎn)端,則此命令無效

? ? 所有本地分支之間有一種特殊的關(guān)系:如果你對一個分支進(jìn)行了修改(不執(zhí)行 commit), 可能的話,那么所有的分支立刻都有了相同的修改,不管各分支現(xiàn)在處于哪個版本、關(guān)聯(lián)到遠(yuǎn)端與否,切換分支后就能看到。但是盡量少利用這個特性。切換分支要謹(jǐn)慎。(其實本質(zhì)上只是 HEAD 指針的移動而已,移來移去,一不小心就可能把這些未提交的修改給弄掉地上摔碎了,因為沒有提交,所以就再找不回來了)


六 、

? ? git push <origin> <dev>:推送分支 dev 的所有內(nèi)容到主機(jī)為 origin 的遠(yuǎn)端倉庫的同名分支,若遠(yuǎn)端倉庫沒有 dev 分支,那么會自動創(chuàng)建,但不自動關(guān)聯(lián)。這個命令在任何分支上執(zhí)行結(jié)果一樣。主機(jī)名隨意,隨意的原因是未關(guān)聯(lián)任何遠(yuǎn)端的分支屬于本地倉庫的孤立分支

? ? git push <origin> <dev>:<haha> :推送?dev 分支的所有內(nèi)容到主機(jī)為 origin 的遠(yuǎn)端倉庫的 haha 分支,其它內(nèi)容同上

? ? 關(guān)于上面兩個命令的補(bǔ)充:對未關(guān)聯(lián)到遠(yuǎn)端的分支才會用這些命令,已關(guān)聯(lián)的直接在那個分支上 push 了。此命令不能使原本未關(guān)聯(lián)到遠(yuǎn)端的當(dāng)前分支關(guān)聯(lián)到遠(yuǎn)端同名分支,盡管它能推送提交,但是,如果之前關(guān)聯(lián)過,后來失聯(lián)了,這個命令可以復(fù)聯(lián)。執(zhí)行?git branch -u?命令可以使當(dāng)前分支關(guān)聯(lián)到遠(yuǎn)端分支。注意:只有關(guān)聯(lián)到遠(yuǎn)端同名分支的本地分支才可以使用 git push 推送

? ? git branch -u <origin>/<dev1> <dev2>?:將本地分支 dev2 關(guān)聯(lián)到主機(jī)名為 origin 的遠(yuǎn)端分支 dev1 (此命令可以在任何分支下進(jìn)行)

? ? git branch --unset-upstream <dev> :解除本地分支 dev 與遠(yuǎn)端的關(guān)聯(lián)。如果當(dāng)前分支為 dev,分支名參數(shù)可省略

? ? git push --set-upstream <origin> <dev> :推送分支 dev 到主機(jī)名為 origin 的遠(yuǎn)端同名分支,遠(yuǎn)端若無此分支,自動新建。此命令中主機(jī)名 origin 隨意,隨意的原因是未關(guān)聯(lián)任何遠(yuǎn)端的分支屬于本地倉庫的孤立分支

? ? git push --set-upstream <origin> <dev>:<haha> :推送分支 dev 到主機(jī)名為 origin 的遠(yuǎn)端分支 haha ,其它內(nèi)容同上個命令

? ? 補(bǔ)充?:上面兩個命令中的 --set-upstream 都可以用 -u 代替

? ? git push <origin> :<dev> :刪除主機(jī)名為 origin 的遠(yuǎn)端倉庫分支 dev (它可以在任何分支下進(jìn)行且結(jié)果都一樣)

? ? git push <origin> :<dev1> :<dev2> :<dev3> :一次性刪多個

? ? git push <origin> --delete <dev>:同上

? ? git push :與遠(yuǎn)端同名分支建立關(guān)聯(lián)后,用此命令推送提交到遠(yuǎn)端,如果本地版本低于遠(yuǎn)端分支,這個就不好使了,只能強(qiáng)推

? ? git push -f :強(qiáng)行推送(即利用強(qiáng)行覆蓋的方式將你的本地倉庫代碼推送至遠(yuǎn)端倉庫)

? ? git push --all :將所有本地分支最新提交推送到遠(yuǎn)端同名分支,沒有的自動創(chuàng)建。某些情況下,比如本地分支 a 原來已經(jīng)關(guān)聯(lián)到遠(yuǎn)端分支 b,之后這個遠(yuǎn)端分支 b 又被刪了,此時執(zhí)行此命令會自動生成遠(yuǎn)端 a 分支,但遠(yuǎn)端 a 分支沒有和本地 a 分支關(guān)聯(lián)過,所以二者不能自動關(guān)聯(lián)。如果執(zhí)行此命令前本地分支 a 就關(guān)聯(lián)了遠(yuǎn)端同名分支 a ,后來遠(yuǎn)端分支 a 被刪了,這種情況下執(zhí)行此命令,會新建遠(yuǎn)端分支 a ,順便自動關(guān)聯(lián)到本地分支 a

? ? git push -u --all :將所有本地分支最新提交推送到遠(yuǎn)端同名分支并關(guān)聯(lián),沒有的自動創(chuàng)建

? ? git pull :此操作刷新了該分支所屬主機(jī)的所有本地隱式分支,類似 git fetch 。同時如果當(dāng)前本地分支版本低于它所關(guān)聯(lián)的遠(yuǎn)端同名分支,則該分支也自動更新版本,如果不低于,不更新,如果不關(guān)聯(lián),那肯定也不更新

? ? 注意:這個 git pull 和 git fetch 只是把遠(yuǎn)端倉庫的分支信息覆蓋到了本地隱式分支,如果遠(yuǎn)端分支被刪除,執(zhí)行這倆命令后,本地同名隱式分支是不受影響的,它不會被刪除。那么這種情況下,如何刪除這個本地隱式分支呢?參見下個命令

? ? git remote prune <origin> :刪除無效的本地隱式分支,無效的意思就是遠(yuǎn)程同名分支已經(jīng)沒有了,它還在這兒呆著呢。此命令聯(lián)網(wǎng)。關(guān)于 remote 的其它命令,參見第二部分

? ? git fetch -p :刷新本地隱式分支同時刪除無效的隱式分支,相當(dāng)于執(zhí)行了 git fetch 和 git remote prune 兩個命令

? ? git pull <origin> <dev> :從主機(jī)為 origin 的遠(yuǎn)端分支 dev 獲取最新版本到本地倉庫當(dāng)前分支,與命令 git merge origin/dev 效果不同,后者合并的是本地隱式分支


七 、

? ??git config --global alias.<st> '<status>':設(shè)置簡潔命令

? ? git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative:一個比較清晰的 log 一行顯示

? ? git config --global color.ui true:開啟 git 輸入著色

? ? git config --global core.quotepath false:設(shè)置顯示中文文件名

? ? git config -l:查看 git 配置



--- END ---

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

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

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