1. 程式人生 > 實用技巧 >Git 遠端庫:Github 推送 push 克隆 clone、協作開發詳解

Git 遠端庫:Github 推送 push 克隆 clone、協作開發詳解

準備工作

  • 要讓 GitHub 識別出你推送的提交確實是你推送的,需要建立 SSH Key。

  • 建立 SSH Key:ssh-keygen -t rsa -C "[email protected]"

    郵箱地址任意,僅作註釋之用。鍵入回車後會要求你輸入一個 passphrase(密碼),這個可有可無,作用是防止有人取得你的計算機使用許可權,建議不用填直接跳過。

  • 然後到計算機使用者主目錄裡找到 .ssh 目錄,裡面的 id_rsa 和 id_rsa.pub 兩個檔案就是SSH Key 的祕鑰對,id_rsa 是私鑰,不能洩露出去,id_rsa.pub 是公鑰,可以放心地告訴任何人。

  • 登陸 GitHub,打開個人設定新增 SSH key,填上任意 Title,在 Key 文字框裡貼上公鑰。

推送到遠端庫 - git push

  • 關聯遠端庫(先有本地庫):首先再 Github 網頁上建立一個新的庫,例如命名為 learngit。在本地倉庫中執行 git remote add origin [email protected]:<Github使用者名稱>/learngit.git,將本地庫與遠端庫關聯。

  • origin 就是遠端庫的名字,這是 Git 預設的叫法,也可以改成別的,但是 origin 這個名字一看就知道是遠端庫。

  • 下一步,把本地庫的所有內容推送到遠端庫上: git push -u origin master

    (實際上是把當前 master 分支推送到遠端)。

    • git push 的格式為 git push <遠端庫名> <本地分支名>:<遠端分支名>

    • 第一次推送 master 分支時加上 -u 引數,指定 origin 為預設主機,在以後的推送或者拉取時就可以不加任何引數使用 git push 了。

在 Github 上顯示的 commit 記錄中,如果本地倉庫設定的 Git email 地址是 Github 上已存在的賬號,則 push 到 Github 上後 commit 記錄裡會顯示相應的 Github 使用者名稱和頭像,而非 Git username。

可以嘗試設定 git config user.email "[email protected]" ,再 git push ,Github 頁面上就會顯示是 linus torvalds 提交的程式碼,很有意思。

克隆遠端庫 - git clone

  • 關聯遠端庫(先有遠端庫):git clone [email protected]:<Github使用者名稱>/gitskills.git ,執行該命令後會在當前目錄下新建一個 gitskills 目錄,並將遠端庫克隆到本地的 gitskills 目錄中。

Github裡 git clone 和 download zip 的區別:git clone 包含 .git 目錄,即包含歷史版本資訊,而 download zip 沒有歷史版本資訊,相當於當前分支的最新版本。

  • 如果是多人協作開發,最好的方式是先建立遠端庫,然後各自從遠端克隆一份即可。

多人協作

  • 檢視遠端庫名:git remote

  • 檢視遠端庫資訊,顯示了可以抓取和推送的遠端庫地址:

    $ git remote -v
    origin  [email protected]:username/learngit.git (fetch)
    origin  [email protected]:username/learngit.git (push)
    
  • 推送分支,就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支,Git 就會把該分支推送到遠端庫對應的遠端分支上: git push origin master ,如果要推送 dev 分支,就改成: git push origin dev

    但是,並不是一定要把本地分支往遠端推送,那麼,哪些分支需要推送,哪些不需要呢?

    • master 分支是主分支,因此要時刻與遠端同步; dev 分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;
    • bug 分支只用於在本地修復 bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個 bug;
    • feature 分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。
  • 現在,另外一位同事要在 dev 上進行開發,首先將遠端庫克隆到本地:

    git clone [email protected]:username/learngit.git

    然後建立遠端 origin 的 dev 分支到本地:git checkout -b dev origin/dev

    這一步的前提是遠端庫已經有 dev分支,否則先需要把 dev 分支推送到遠端庫 git push origin dev,然後同事 git pull 重新拉取資料,現在便可建立遠端的 dev 分支到本地。

    現在他就可以在 dev 上繼續修改,並且時不時地把 dev 分支 push 到遠端:git push origin dev

  • 一般情況是這樣:同事先修改了 dev 分支並 push 到了遠端,而此時你也對 dev 分支進行了修改,但是你 push 到遠端庫便會出錯,因為你本地分支和遠端分支不一致,即遠端分支上存在本地分支中不存在的提交:

    $ git push origin dev
    To github.com:username/learngit.git
     ! [rejected]        dev -> dev (fetch first)
    error: failed to push some refs to '[email protected]:username/learngit.git'
    hint: Updates were rejected because the remote contains work that you do
    hint: not have locally. This is usually caused by another repository pushing
    hint: to the same ref. You may want to first integrate the remote changes
    hint: (e.g., 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    

    由提示可知,在這種情況下我們需要先用 git pull 把最新的提交從 origin/dev 拉取下來,即先讓本地分支與遠端分支完成同步,可能還需要解決衝突,然後再推送便可成功。

    如果 git pull 也提示失敗了,原因是沒有指定本地 dev 分支與遠端 dev 分支的關聯。所以需要先設定 dev 和 origin/dev 的關聯,再執行 git pull

    $ git branch --set-upstream-to=origin/dev dev
    Branch 'dev' set up to track remote branch 'dev' from 'origin'.
    
    $ git pull
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    可以看出,執行 git pull 時發生了衝突。此時解決衝突的方式和解決分支合併衝突的方式一樣。編輯 readme.txt,將 Git 為我們標識出的衝突位置修改為所需要的樣子,然後提交,再推送到遠端即可。