上一篇操作中每次提交都要手動輸入用戶名和密碼,若想避免這些麻煩,可以在系統中創建 SSH 公私鑰,並將公鑰放到 GitHub 指定位置。如此操作即可生成 GitHub 賬戶對於當前系統中的 Git 授權。
終端執行 ssh-keygen
命令按幾次回車生成公私鑰,公私鑰存放在家目錄下的隱藏目錄 .ssh
中的兩個文件中:
將(/c/Users/Hasee/.ssh/id_rsa)文件中的公鑰內容復制出來,實驗環境中可以使用右側工具欄中的剪切板復制:
然后在 GitHub 網頁上添加公鑰:
回到倉庫主目錄,點擊下圖所示的綠色按鈕,點擊紫色框中的 “Use SSH”,然后復制這個鏈接。
在環境里刪除原倉庫,使用此鏈接重新克隆倉庫。
重要的一點:只有使用這種 git 開頭的地址克隆倉庫,SSH 關聯才會起作用。
使用 SSH 的好處主要有兩點:
- 免密碼推送,執行
git push
時不再需要輸入用戶名和密碼了; - 提高數據傳輸速度。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上一篇中的操作,有些命令的重復度極高,比如 git status
和 git branch -avv
等,Git 可以對這些命令設置別名,以便簡化對它們的使用,設置別名的命令是 git config --global alias.[別名] [原命令]
,如果原命令中有選項,需要加引號。別名是自定義的,可以隨意命名,設置后,原命令和別名具有同等作用。操作如下:
自己設置的別名要記住,也可以使用 git config -l
命令查看配置文件。下面文檔中的命令將使用這些別名。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面介紹 Git 作為分布式版本控制器最強大的功能:分支管理。
在介紹分支前,先講解另一個命令 git fetch
,它的作用是將遠程倉庫的分支信息拉取到本地倉庫,注意,僅僅是更新了本地的遠程分支信息,也就是執行 git branch -avv
命令時,查看到的 remotes
開頭的行的分支信息。
舉例說明一下,首先我們在 GitHub 頁面上對 one.txt 文件進行修改並增加一次提交。
提交完成后,提交數變成 3 個,點下圖紫色框中的鏈接可以看到提交記錄:
在實驗環境中執行 git fetch
命令,然后執行 git branch -avv
查看分支信息:
可以看到,本地分支 master 的版本號無變化,而遠程分支已經更新。所以,fetch
命令的作用是刷新保存在本地倉庫的遠程分支信息,此命令需要聯網。此時若想使本地 master 分支的提交版本為最新,可以執行 git pull
命令來拉取遠程分支到本地,pull
是拉取遠程倉庫的數據到本地,需要聯網,而由於前面執行過 git fetch
命令,所以也可以執行 git rebase origin/master
命令來實現 “使本地 master 分支基於遠程倉庫的 master 分支”,rebase
命令在后面還會經常用到,這里只需按部就班操作即可:
可以看到,遠程倉庫 master 分支、本地倉庫的 origin/master 分支、本地倉庫的 master 分支已經一致。
分支在項目開發中作用重大,多人協作時尤其不可或缺。例如一個項目上線了 1.0 版本,研發部門需要開發 1.1、1.2 兩個測試版,增加不同的新功能,測試版的代碼顯然不能在正式版所在的分支上,此時需要新的分支來存放不同版次的代碼。再例如實驗樓的課程團隊在維護課程倉庫時,每個人都有各自的分支,在自己的分支上進行修改,然后向 master 分支提 PR(pull request),最后從 master 分支推送到線上。
執行 git branch [分支名]
可以創建新的分支:
此命令創建新分支后並未切換到新分支,還是在 master 分支上,執行 git checkout [分支名]
切換分支,checkout
也是常用命令,切換分支:
創建新分支還要手動切換太麻煩,介紹另一個常用的命令 git checkout -b [分支名]
創建分支並切換到新分支:
如上圖所示的分支信息,前兩行是新建的本地分支信息,它們的版本號與主分支 master 一致,這是因為在哪個分支上創建新分支,新分支的提交記錄就與哪個分支一致。新建分支並無跟蹤任何遠程分支,所以沒有 master 分支中的中括號和括號內的藍色遠程分支名。
假設我們要在當前分支 dev1 上開發一個新的功能,需要增加一個文件 new_func1,然后生成一個新的提交:
好,新功能已經寫好並提交到了版本區,現在要推送了,推送到哪里呢?正常邏輯當然要推送到遠程倉庫的同名分支,不過現在遠程倉庫里只有一個分支:
上圖紫色框中是一個下拉按鈕,點擊后顯示倉庫中的全部分支,按鈕上顯示的是當前所在分支。
執行 git push [主機名] [本地分支名]:[遠程分支名]
即可將本地分支推送到遠程倉庫的分支中,通常冒號前后的分支名是相同的,如果是相同的,可以省略 :[遠程分支名]
,如果遠程分支不存在,會自動創建:
上圖命令可以簡寫為 git push origin dev1
。注意哦,這是我們創建 SSH 關聯后第一次執行 push
命令,可以看到傳輸速度有明顯的提高,更重要的是,不再需要重復輸入用戶名和密碼了。現在執行 git br
查看一下分支情況:
可以看到,遠程分支 origin/dev1 的信息已經在本地存在,且與本地同名分支一致。
現在有個問題,當我們再次在 dev1 分支上修改並提交,推送到遠程倉庫時還是要輸入上面的那個長長的命令,好不方便。如果能和 master 分支一樣跟蹤遠程同名分支,就可以直接使用 git push
命令推送了。有辦法的,執行這個命令 git branch -u [主機名/遠程分支名] [本地分支名]
將本地分支與遠程分支關聯,或者說使本地分支跟蹤遠程分支。如果是設置當前所在分支跟蹤遠程分支,最后一個參數本地分支名可以省略不寫:
這個命令的 -u
選項是 --set-upstream
的縮寫。可不可以讓本地分支跟蹤遠程非同名分支呢?可以的,盡管幾乎遇不到這種自找麻煩的需求。可不可以撤銷本地分支對遠程分支的跟蹤呢?也是可以的,執行 git branch --unset-upstream [分支名]
即可撤銷該分支對遠程分支的跟蹤,同樣地,如果撤銷當前所在的分支的跟蹤,分支名可以省略不寫:
問題又來了,前面的操作是先將本地分支推送到遠程倉庫,使遠程倉庫創建新分支,然后再執行命令使本地分支跟蹤遠程分支,有沒有辦法在推送時就自動跟蹤遠程分支呢?有的,在推送的時候,加個 --set-upstream
或其簡寫 -u
選項即可,現在切換到 dev 分支試一下這個命令:
接下來,介紹一下刪除分支的方法。
首先,刪除遠程分支,使用 git push [主機名] :[遠程分支名]
,如果一次性刪除多個,可以這樣:git push [主機名] :[遠程分支名] :[遠程分支名] :[遠程分支名]
。此命令的原理是將空分支推送到遠程分支,結果自然就是遠程分支被刪除。另一個刪除遠程分支的命令:git push [主機名] --delete [遠程分支名]
。刪除遠程分支的命令可以在任意本地分支中執行。兩個命令分別試一下:
可以看到本地倉庫已經沒有遠程分支 dev 和 dev1 的分支信息。查看 GitHub 倉庫頁面,也只剩 master 一個分支。操作成功。
回到實驗環境,使用 git branch -D [分支名]
刪除本地分支,同樣地,此命令也可以一次刪除多個,將需要刪除的分支名羅列在命令后面即可。在此之前,先介紹一個極少用到的命令:給本地分支改名 git branch -m [原分支名] [新分支名]
,若修改當前所在分支的名字,原分支名可以省略不寫:
好,現在要一次性刪除本地分支 ved 和 dev1。需要注意的一點:當前所在的分支不能被刪除。切換到 master 分支,然后執行 git branch -D ved dev1
命令:
很好,一切都回到了最開始時的樣子,就像什么都沒有發生。