github和gitee(四)

一 關聯github遠程倉庫

  (github的使用不做介紹)由於本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以,需要⼀點設置:
  第1步:創建SSH Key。在⽤戶主⺫錄下,看看有沒有.ssh⺫錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個⽂件,如果已經有了,可直接跳到下⼀步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"

  你需要把郵件地址換成你⾃⼰的郵件地址,然後⼀路回⻋,使⽤默認值即可,由於這個Key也不是⽤于軍事目的,所以也⽆需設置密碼。如果⼀切順利的話,可以在⽤戶主目錄⾥找到.ssh目錄,⾥⾯有id_rsa和id_rsa.pub兩個⽂件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放⼼地告訴任何⼈。
  第2步:登陸GitHub,打開“Account settings”,“SSH Keys”⻚⾯:然後,點“Add SSH Key”,填上任意Title,在Key⽂本框⾥粘貼id_rsa.pub⽂件的內容,點“Add Key”,你就應該看到已經添加的Key。爲什麼GitHub需要SSH Key呢?因爲GitHub需要識別出你推送的提交確實是你推送的,⽽不是別⼈冒充的,⽽Git⽀持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你⾃⼰才能推送。當然,GitHub允許你添加多個Key。假定你有若干電腦,你⼀會⼉在公司提交,⼀會⼉在家⾥提交,只要把每臺電腦的Key都添加到GitHub,就可以在每臺電腦上往GitHub推送了。
  第3步:登陸驗證,使用命令:

$ ssh -T [email protected]

  如果初次設置的話,會出現如下界面,輸入yes 同意即可:

  第4步:添加遠程庫,現在的情景是,你已經在本地創建了⼀個Git倉庫後,又想在GitHub創建⼀個Git倉庫,並且讓這兩個倉庫進⾏遠程同步,這樣,GitHub上的倉庫既可以作爲備份,又可以讓其他⼈通過該倉庫來協作,真是⼀舉多得。先在github創建一個空倉庫,在本地的同名倉庫下:

$ git remote add origin [email protected]:michaelliao/learngit.git

  michaelliao替換成你⾃⼰的GitHub賬戶名,添加後,遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字⼀看就知道是遠程庫。
  第5步:就可以把本地庫的所有內容推送到遠程庫上:

$ git push -u origin master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (19/19), 13.73 KiB, done.
Total 23 (delta 6), reused 0 (delta 0)
To [email protected]:michaelliao/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

  把本地庫的內容推送到遠程,⽤git push命令,實際上是把當前分支master推送到遠程。由於遠程庫是空的,我們第⼀次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。推送成功後,可以⽴刻在GitHub⻚⾯中看到遠程庫的內容已經和本地⼀模⼀樣。
  第6步:從現在起,只要本地作了提交,就可以通過命令:

$ git push origin master

二 關聯gitee遠程倉庫

  建立倉庫,有兩種情況:1、本地已經開發一個項目有一段時間了,需要提交到 gitee 上;2、在 gitee 上建立倉庫,然後 clone 到本地,修改完成後,再次提交到 gitee 上。針對這兩種情況,分別如下:
  對於第一種情況,和 github 的使用一樣,前面有講述,如下操作:
在這裏插入圖片描述

cd existing_git_repo
git remote add origin https://gitee.com/use1/test.git
git push -u origin master

  對於第二種情況,如下操作:
在這裏插入圖片描述

git clone [email protected]:use1/test.git
touch test.txt #進行修改
git add test.txt
git commit -m "second commit"
git push -u origin master #提交

  git push -u origin master命令將本地的master分支推送到origin主機,同時指定origin爲默認主機,後面就可以不加任何參數使用git push了,此示例只有一個主分支。

三 origin

  其實,對於git的使用主要圍繞三點展開:1、從遠程取數據(git clone);2、改動代碼;3、將改動同步到遠端(git push)。
  這3個步驟又涉及到兩個repository,一個是remote repository,在遠程服務器上;一個是local repository,在自己工作區上。其中 1,3 兩個步驟涉及到remote server/remote repository/remote branch,2 涉及到 local repository/local branch。
  設計到遠程庫,必須明確origin的概念,已經關聯了遠程倉庫的本地倉庫,使用git remote時:

$ git remote -v #查看clone地址
origin  https://gitee.com/use1/test.git (fetch)
origin  https://gitee.com/use1/test.git (push)

  也就是說 git 默認創建了一個指向遠端代碼庫的 origin,顧名思義,origin 就是一個名字,在關聯一個遠程庫時,git默認創建的指向這個遠程代碼庫的標籤, origin指向的是repository,master只是這個repository中默認創建的第一個branch(運行git remote –v或者查看.git/config可以看到origin的含義)。
  如果user1想加一個遠程指向user2的代碼庫,可以在控制檯輸入:

$ git remote add upstream [email protected]:user2/repository.git
$ git remote -v
origin [email protected]:user1/repository.git (fetch)
origin [email protected]:user2/repository.git (push)
upstream [email protected]:user2/repository.git (fetch)
upstream [email protected]:user2/repository.git (push)

  增加了指向 user2 代碼庫的 upstream。

四 https和git協議

  git支持https和git兩種傳輸協議,github 和 gitee 都有兩種協議可選:
在這裏插入圖片描述在這裏插入圖片描述
  git使用https協議,每次pull, push都會提示要輸入密碼,使用git協議,然後配置 ssh 密鑰,這樣免去每次都輸密碼的麻煩。所以根據具體情況,在使用 url 的時候以自己的情況而定。

五 切換協議

  對於使用 https 協議進行同步的項目,每次提交都需要輸入賬號和密碼,對於這個問題,有兩種解決方法:
  1、保存密碼到本地:在項目目錄下輸入:git config --global credential.helper store,然後會在本地生成一個文本,上邊記錄賬號和密碼,然後你使用上述的命令配置好之後,再操作一次git pull,然後它會提示你輸入賬號密碼,這一次之後就不需要再次輸入密碼了。
  2、切換成ssh(必須是在配置了公鑰的情況下):

$ git remote -v #查看clone地址
origin  https://gitee.com/use1/test.git (fetch)
origin  https://gitee.com/use1/test.git (push)
$ git remote rm origin #移除https的方式,換成ssh方式
$ git remote add origin [email protected]:use1/test.git #關聯遠程庫
$ git remote -v
origin	[email protected]:use1/test.git (fetch)
origin	[email protected]:use1/test.git (push)

六 更新遠程倉庫到本地

  對於多個終端的開發,不同的終端修改完成後提交到遠程倉庫,爲了保持最新狀態,需要及時跟新,對於遠程倉庫更新到本地,使用git fetchgit pull命令,此示例只有一個主分支。

1 git fetch

  1. git fetch:更新git remote 中所有的遠程 repo 所包含分支的最新 commit-id,將其記錄到.git/FETCH_HEAD文件中;
  2. git fetch remote_repo:更新名稱爲 remote_repo 的遠程 repo 上的所有 branch 的最新commit-id,將其記錄;
  3. git fetch remote_repo remote_branch_name:更新名稱爲 remote_repo 的遠程 repo 上的分支 remote_branch_name;
  4. git fetch remote_repo remote_branch_name:local_branch_name:更新名稱爲 remote_repo 的遠程 repo 上的分支 remote_branch_name,並在本地創建 local_branch_name 本地分支保存遠端分支的所有數據。

2 git pull

  git pull的作用是從一個倉庫或者本地的分支拉取並且整合代碼。

git pull [<options>] [<repository> [<refspec>…​]]

  是倉庫的名字, 是分支的名字。如果都不寫,會有一個默認值。

七 git fetch和git pull的區別

  本地.git文件夾裏面存儲了本地倉庫 master 分支的 commit ID和跟蹤的遠程分支 orign/master 的 commit ID(可以有多個遠程倉庫)。

.git/refs/head/[本地分支]
.git/refs/remotes/[正在跟蹤的分支]

  其中head就是本地分支,remotes是跟蹤的遠程分支。
  更改遠端跟蹤分支只能用git fetch,或者是git push後作爲副產品(side-effect)來改變。我們無法直接對遠程跟蹤分支操作。

1 git fetch

  當遠程服務器有更新時,使用 git fetch 更新代碼,本地的庫中 master 的 commitID 不變,但是與遠程庫關聯的 orign/master 的 commitID 和遠程一樣。這時候本地相當於存儲了兩個代碼的版本號,我們還要通過merge去合併這兩個不同的代碼版本(如果這兩個版本都修改了同一處的代碼,這時候merge就會出現衝突)。
  相當於fetch的時候本地的master沒有變化,但是與遠程倉關聯的那個版本號被更新了,我們接下來就是在本地合併這兩個版本號的代碼。

2 git pull

在這裏插入圖片描述
  使用git pull的會將本地的代碼更新至遠程倉庫裏面最新的代碼版本。
  由此可見,git pull看起來像git fetch+get merge,但是根據commit ID來看的話,他們實際的實現原理是不一樣的。這裏借用之前文獻看到的一句話:不要用git pull,用git fetch和git merge代替它。git pull的問題是它把過程的細節都隱藏了起來,以至於你不用去了解git中各種類型分支的區別和使用方法。當然,多數時候這是沒問題的,但一旦代碼有問題,你很難找到出錯的地方。看起來git pull的用法會使你喫驚,簡單看一下git的使用文檔應該就能說服你。將下載(fetch)和合並(merge)放到一個命令裏的另外一個弊端是,你的本地工作目錄在未經確認的情況下就會被遠程分支更新。當然,除非你關閉所有的安全選項,否則git pull在你本地工作目錄還不至於造成不可挽回的損失,但很多時候我們寧願做的慢一些,也不願意返工重來。以上內容來自這裏

八 submodule子模塊

1 背景

  項目的版本庫在某些情況下需要引用其他版本庫中的文件,例如有一套公用的代碼庫,可以被多個項目調用,這個公用代碼庫能直接放在某個項目的代碼中,而是要獨立爲一個代碼庫,那麼其他要調用公用的代碼庫該如何處理?分別把公用的代碼庫拷貝到各自的項目中會造成冗餘,丟棄了公共代碼庫的維護歷史,這些顯示不是好的辦法,現在要了解的git子模組(git submodule)就解決了這個問題。
  Git 子模塊功能允許你將一個Git倉庫當作另外一個Git倉庫的子目錄。這允許你克隆另外一個倉庫到你的項目中並且保持你的提交相對獨立。

2 添加子模塊

  添加子模塊非常簡單,命令如下:git submodule add <url> <path>;其中,url爲子模塊的路徑,path爲該子模塊存儲的目錄路徑。
  執行成功後,git status會看到項目中修改了.gitmodules,並增加了一個新文件(爲剛剛添加的路徑);git diff --cached查看修改內容可以看到增加了子模塊,並且新文件下爲子模塊的提交hash摘要,git commit提交即完成子模塊的添加。

3 子模塊的使用

  克隆項目後,默認子模塊目錄下無任何內容。需要在項目根目錄執行如下命令完成子模塊的下載:

git submodule init
git submodule update

  或:

git submodule update --init --recursive

  執行後,子模塊目錄下就有了源碼,再執行相應的makefile即可。

4 子模塊的更新

  子模塊的維護者提交了更新後,使用子模塊的項目必須手動更新才能包含最新的提交。在項目中,進入到子模塊目錄下,執行 git pull更新,查看git log查看相應提交。完成後返回到項目目錄,可以看到子模塊有待提交的更新,使用git add,提交即可。

5 刪除子模塊

  有時子模塊的項目維護地址發生了變化,或者需要替換子模塊,就需要刪除原有的子模塊。刪除子模塊較複雜,步驟如下:
  rm -rf 子模塊目錄 刪除子模塊目錄及源碼;
  vi .gitmodules 刪除項目目錄下.gitmodules文件中子模塊相關條目;
  vi .git/config 刪除配置項中子模塊相關條目;
  rm .git/module/* 刪除模塊下的子模塊目錄,每個子模塊對應一個目錄,注意只刪除對應的子模塊目錄即可。
  執行完成後,再執行添加子模塊命令即可,如果仍然報錯,執行如下:
  git rm --cached 子模塊名稱
  完成刪除後,提交到倉庫即可。
  

九 遇到的問題

一、使用ssh連接遠程主機時:
在這裏插入圖片描述
  大概意思就是說密鑰權限的文件不能爲777,不能被其他用戶讀取。瞭解了問題後,修改密鑰文件權限爲700就OK了。
二、fatal: remote origin already exists.
  $ git remote rm origin
三、! [rejected] master -> master (non-fast-forward)
  問題(Non-fast-forward)的出現原因在於:git倉庫中已經有一部分代碼,所以它不允許你直接把你的代碼覆蓋上去。於是你有2個選擇方式:
  1、強推,即利用強覆蓋方式用你本地的代碼替代git倉庫內的內容:git push -f
  2、先把git的東西fetch到你本地然後merge後再push。

$ git fetch
$ git merge

  這2句命令等價於:git pull

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章