我的使用git
的一些總結,一下經常使用命令的互相搭配使用,能很是完美的處理好平常遇到的99%
的狀況(不敢說100%,得留點餘地)。
還有一些使用頻率很是低的指令沒有記錄,至少普通開發者很是不經常使用,之後可能會補充。
話很少說
首先須要先下載git
這個仍是要說一下的在這裏推薦一個學習
git
的網頁小遊戲,輸入命令後顯式的展現倉庫變化,用來學習git
仍是不錯的
連接:https://learngitbranching.js.org/node
git status
查看當前分支狀態 git reflog
查看每一次的命令,都作過什麼 git log
查看此分支完整的提交記錄,回車繼續看,q
中止 git log --oneline
查看此分支簡略的提交記錄,只展現提交號和提交信息 git show
查看最近一次提交的具體代碼變化 git show <提交ID>
查看某次提交的具體代碼變化 git diff
查看當前代碼add
後,會add
哪些內容 git diff --staged
查看如今commit
提交後,會提交哪些內容 git diff HEAD
查看當前代碼add
並提交後,會提交哪些內容 git log --oneline --graph
圖形化展現合併歷史git
git init
初始化倉庫,默認爲master
分支 git add -A
提交所有文件修改到緩存區 git add <具體某個文件路徑+全名>
提交某些文件到緩存區 git commit -m "<註釋>"
提交代碼到本地倉庫,並寫提交註釋 git commit –a -m "<新註釋>"
更改上次提交的註釋github
git branch
查看本地全部分支 git branch -r
查看遠程全部分支 git branch -a
查看本地和遠程全部分支 git merge <分支名>
合併分支 git merge --abort
合併分支出現衝突時,取消合併,一切回到合併前的狀態 git branch <新分支名>
基於當前分支,新建一個分支 git checkout --orphan <新分支名>
新建一個空分支(會保留以前分支的全部文件) git branch -D <分支名>
刪除本地某個分支 git push <遠程庫名> :<分支名>
刪除遠程某個分支 git branch <新分支名稱> <提交ID>
從提交歷史恢復某個刪掉的某個分支 git branch -m <原分支名> <新分支名>
分支改名 git checkout <分支名>
切換到本地某個分支 git checkout <遠程庫名>/<分支名>
切換到線上某個分支 git checkout -b <新分支名>
把基於當前分支新建分支,並切換爲這個分支npm
git pull <遠程倉庫名> <遠程分支名>
拉取遠程倉庫的分支與本地當前分支合併 git pull <遠程倉庫名> <遠程分支名>:<本地分支名>
拉取遠程倉庫的分支與本地某個分支合併 git push <遠程倉庫名> <本地分支名>
推送本地某個分支到遠程與其對應的分支上,遠程沒有則會給遠程庫新建分支 git push <遠程倉庫名> <本地分支名>:<遠程分支名>
推送本地分支到遠程某個分支 git push <遠程倉庫名> :<遠程分支名>
刪除遠程某個分支 git push -f <同上的命令>
強制提交,覆蓋線上 git fetch
獲取線上最新版信息記錄,不合並,用法和pull相似(一個特殊的操做,好比多人開發分支,其餘人提交後,本身看分支的時候,可能還知不道線上的分支已經比本身的新了,須要這個指令,來獲取一下線上的最新版本,會拉取,但不會合並,存在本地倉庫中)緩存
git diff <文件名>
對比最近提交,和近近次提交的區別,不加文件名,則爲總體對比 git diff HEAD^ -- <文件名>
同上 git diff HEAD~<一個數字> -- <文件名>
上次提交和前第幾回提交做對比 git diff <提交ID> <文件名>
上次提交和某次提交做對比 git diff <文件名>
工做區與暫存區比較 git diff HEAD <文件名>
工做區與最近提交比較 git diff <本地分支名> <文件名>
當前分支的文件與其餘分支的文件進行比較安全
注意,當回滾代碼時,reset
和revert
均可以使用,下面是兩個指令的區別
reset
:真實硬性回滾,目標版本後面的提交記錄所有丟失了
revert
:一樣回滾,但實際這個回滾操做,算是一個提交,目標版本後面的提交記錄也所有都有,並且會多一次提交,就是此次revert
--hard
的功能:不加他,文件修改會保留,都會處於add以前的狀態;加上他,文件修改會被刪除,丟失掉app
git <reset/revert> <--hard?> HEAD^
回退到上次提交 git <reset/revert> <--hard?> <提交記錄>
回退到以前的某次提交 git <reset/revert> <--hard?> <某個分支>
回退到此分支的提交狀態,至關於複製分支過來 git reset <文件完整路徑+完整名>
把add
過的某個文件撤銷到未add
的狀態 git reset
把add
過的全部文件撤銷到未add
的狀態 git checkout <文件完整路徑+完整名>
一個尚未add
的文件,撤銷修改 git checkout .
尚未add
的全部文件,撤銷修改ssh
git remote -v
查看對應的遠程倉庫地址 git clone <遠程倉庫地址連接>
克隆某個遠程庫,默認庫名爲origin
git clone <遠程倉庫地址連接> <庫名>
克隆某個遠程庫,並自定庫名 git remote remove <遠程倉庫名>
和遠程的某個倉庫解除綁定關係 git remote add <遠程倉庫名> <遠程倉庫地址連接>
和某個遠程倉庫創建綁定關係 git remote set-url <遠程倉庫名> <要改成的遠程倉庫地址連接>
修改綁定的遠程庫連接 git push --set-upstream <遠程倉庫名> <遠程分支名>
當前分支和遠程某個分支創建綁定關係學習
常常有這樣的事情發生,當你正在進行項目中某一部分的工做,裏面的東西處於一個比較雜亂的狀態。
而你想轉到其餘分支上進行一些工做。
問題是,你不想提交進行了一半的工做,不然之後你沒法回到這個工做點。
解決這個問題的辦法就是git stash命令。
git stash save <註釋信息>
當前分支提交到儲藏,插到儲藏序列的最前面(不包括新建文件) git stash save -u <註釋信息>
同上,會包括新建文件,功能更強大 git stash list
查看全部儲藏中的工做 git stash drop <儲藏的名稱>
刪除對應的某個儲藏 git stash pop
取出儲藏中最後存入的工做狀態進行恢復,會刪除儲藏 git stash pop <儲藏對應的數字>
取出儲藏中對應的工做狀態進行恢復,會刪除儲藏 git stash apply
取出儲藏中最後存入的工做狀態進行恢復,注意,不會刪除儲藏 git stash apply <儲藏的名稱>
取出儲藏中對應的工做狀態進行恢復,注意,不會刪除儲藏 git stash branch <新分支名> <儲藏的名稱>
從儲藏中新建分支,會刪除儲藏 git stash clear
清空全部儲藏中的工做fetch
tag
是什麼,雖然整個開發過程,每一個提交都對應一個提交ID,回滾也比較方便,但總有一些重大意義的提交,好比從v0.91升級到了v1.0,這個v1.0是必需要單獨摘出來保存的,不然萬一出現回滾事故,致使提交記錄丟失呢?雖然能夠單獨新建分支保存,但分支的功能並非用來作這個的。冗餘的分支在開發時也容易產生誤操做。
因此
tag
的用處就來了,他能夠把某次提交後的項目,整個單獨複製拎出來,命名爲一個tag(能夠以項目版本或打tag的時間來命名),能夠寫註釋,存在tag列表中,與分支隔離開,除非專門命令操做,不然只要項目存在,他們就不會受到影響。同時,可使用tag快速回滾項目、基於tag新建分支等,在項目總體的管理上很是方便。
git tag
列出本倉庫中全部tag列表 git tag <tag名>'
基於最近的一次提交打tag(輕量tag,不推薦) git tag -a <tag名> -m '<此tag的註釋>'
基於最近的一次提交打tag git tag -a <tag名> <提交ID> -m '<此tag的註釋>'
基於某次提交打tag git show <tag名>
查看此tag的tag信息 git tag -d <tag名>
刪除本地某個tag git push origin :refs/tags/<tag名>
刪除遠程倉庫中的tag git push <遠程倉庫名> <tag名>'
推送某個tag至某個遠程庫 git push <遠程倉庫名> --tags'
推送全部tag至某個遠程庫 git checkout -b <新分支名> <tag名>'
基於某個tag新建分支
.gitignore
文件在使用Git的過程當中,有的文件好比日誌、臨時文件、編譯的中間文件等不要提交到代碼倉庫,這時就要設置相應的忽略規則,來忽略這些文件的提交。
沒錯就是.gitignore
文件了。
此文件須要放在.git
(默認是隱藏文件,是git的本地倉庫)同一目錄下
寫法以下:
node_modules/ dist/ *.map npm-debug.log* yarn-debug.log* yarn-error.log*
這樣,當git add
的時候,上面定義忽略的那些文件,就會被git忽略,發生了變化git也不會管。
然而有時候,是會出現意外的。
好比,git已經提交過了,這是後忽然說,這裏面有個文件須要被忽略,而後我把這個文件寫到了.gitignore
文件中。。。無效!這個文件仍然沒有被忽略!
這是就須要以下命令,來刪除此文件並忽略
git rm -r --cached <文件路徑+文件全名>
在git庫中刪除文件並中止追蹤,但實際文件還保留,只是忽略掉。
由此,方可。
SSH
公鑰綁定一個遠程倉庫,有兩種方式:
若是遠程倉庫爲公開倉庫,則二者在使用上,區別不大;
但若是是私密倉庫,則http方式,須要輸入用戶名和密碼登陸後,纔可創建聯繫,但這樣一來,須要把私密倉庫的帳號和密碼暴露,即便添加了項目團隊成員,若是成員的帳號密碼暴露,任何人在任何設備上,登陸帳號密碼,至少都能對項目進行拉取操做,因此就有了下面更合適的方式---ssh
。
ssh
的話,則只須要本地設備,輸入一條git
指令,生成一對公鑰和私鑰,而後把公鑰的內容,複製添加到遠程庫的設置中,讓遠程庫認識此設備,就想當於用戶填寫了帳號和密碼,好處是,這種方法在遠程庫的添加上,只認設備不認帳戶,這樣只用保證設備是安全的,倉庫就是安全的。
下面爲本地設備生成ssh
輸入ssh-keygen
來生成ssh
window默認存放在C盤/用戶/<用戶名稱>/.ssh
文件夾中
Mac默認存放在硬盤/用戶/<用戶名稱>/.ssh
文件夾中
其中兩個文件,id_rsa.pub
爲公鑰,須要打開復制其中的內容,粘貼到須要的git遠程倉庫網站的帳戶設置中(另外一個爲私鑰,切記保管好)
注:一個ssh鑰匙對,在一個git遠程倉庫網站中,只能被一個用戶添加。
若是有另外一個用戶,也想把倉庫共享給這臺設備,再次寫入公鑰,則會失敗。
好比如今需求,就須要一臺設備,能拉取到github中多個帳戶的倉庫,該如何設置?
再次輸入ssh-keygen
生成祕鑰對,可是不能一直回車,須要在給祕鑰對命名時,輸入一個新名字,不然會替換原有的。
或者也能夠直接輸入ssh-keygen -f id_new
生成完畢後,進入對應存放ssh鑰匙對的.ssh文件夾中,會發現又多了一對祕鑰,名字分別爲id_new
和id_new.pub
。
此時,能夠把新的id_new.pub
的內容複製到github中另外一個帳戶的setting中,可是,本地設備須要設置一下。
進入到本地的設備的存放ssh鑰匙對的.ssh文件夾中,新建名爲config
的文件,輸入如下內容進行保存:
Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa Host new.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_new
咱們知道,在github中使用ssh連接時,連接的格式爲:git@github.com:<用戶名稱>/<項目名稱>.git
此時,有github中的用戶A和用戶B,都有ssh連接給到這臺設備,分別是: git@github.com:user-A/item-A.git
git@github.com:user-B/item-B.git
則此設備在綁定遠程倉庫的時候,須要在連接上作手腳。
第一條不用動,第二個須要參照配置文件的Host
進行修改,兩條連接分別改成: git@github.com:user-A/item-A.git
(沒有變化) git@new.github.com:user-B/item-B.git
此時,設備能夠成功綁定這兩個帳戶的倉庫。
依次類推,設備綁定多個帳戶,再也不是問題,關鍵就是配置config
文件,可以對應起來便可。
git config user.name
查看設置的用戶名 git config user.email
查看設置的用戶郵箱 git config --global user.name <用戶名>
設置用戶名 git config --global user.email <郵箱>
設置用戶郵箱
修改用戶登陸信息
控制面板 -> 用戶帳戶 -> 管理 Windows 憑據
,便可看到普通憑據中有git的帳戶信息,可編輯更改
鑰匙串訪問.app -> 右上角搜索git
,便可看到,可編輯更改