Git 分支操作


上一篇操作中每次提交都要手動輸入用戶名和密碼,若想避免這些麻煩,可以在系統中創建 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命令:

很好,一切都回到了最開始時的樣子,就像什么都沒有發生。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM