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


准備工作

  • 要讓 GitHub 識別出你推送的提交確實是你推送的,需要創建 SSH Key。
  • 創建 SSH Key:ssh-keygen -t rsa -C "youremail@example.com"
    郵箱地址任意,僅作注釋之用。鍵入回車后會要求你輸入一個 passphrase(密碼),這個可有可無,作用是防止有人取得你的計算機使用權限,在 SSH 連接時還要輸入這個密碼,建議不用填直接跳過。
  • 然后計算機用戶主目錄里找到 .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 git@github.com:<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 "torvalds@linux-foundation.org" ,再 git push ,Github 頁面上就會顯示是 linus torvalds 提交的代碼,很有意思。

克隆遠程庫 - git clone

  • 關聯遠程庫(先有遠程庫):git clone git@github.com:<Github用戶名>/gitskills.git ,執行該命令后會在當前目錄下新建一個 gitskills 目錄,並將遠程庫克隆到本地的 gitskills 目錄中。

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

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

多人協作

  • 查看遠程庫名:git remote
  • 查看遠程庫信息,顯示了可以抓取和推送的遠程庫地址:
    $ git remote -v
    origin  git@github.com:username/learngit.git (fetch)
    origin  git@github.com:username/learngit.git (push)
    
  • 推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,Git 就會把該分支推送到遠程庫對應的遠程分支上: git push origin master ,如果要推送 dev 分支,就改成: git push origin dev
    但是,並不是一定要把本地分支往遠程推送,那么,哪些分支需要推送,哪些不需要呢?
    • master 分支是主分支,因此要時刻與遠程同步; dev 分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
    • bug 分支只用於在本地修復 bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個 bug;
    • feature 分支是否推到遠程,取決於你是否和你的小伙伴合作在上面開發。
  • 現在,另外一位同事要在 dev 上進行開發,首先將遠程庫克隆到本地:
    git clone git@github.com: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 'git@github.com: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 為我們標識出的沖突位置修改為所需要的樣子,然后提交,再推送到遠程即可。


免責聲明!

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



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