筆者最近進行開發過程中,所有參與者的代碼需要通過 git 上傳到遠端倉庫中,不同的模塊對應不同的 git 分支,不同模塊的數據需要從遠端倉庫中獲取。這里記錄下筆者從遠端倉庫中獲取分支數據,進行修改,最后重新上傳同步分支數據的過程。
注:對於本地不存在 git 倉庫的情況,要么直接通過 git clone 命令獲取對應的遠端整個倉庫,此時獲得遠端倉庫的所有數據,要么可以選擇一個目錄,通過 git init 命令將該目錄初始化為一個空的 git 倉庫,之后再根據下文描述的步驟獲取倉庫數據(可以單獨獲取倉庫的某一分支的數據)。
Index
1.添加遠端倉庫信息 - git remote add/remove
3.本地創建/切換分支 - git checkout/branch
4.本地工作及修改 - git add/commit/status
1. 添加遠端倉庫信息 —— git remote add/remove
用戶可通過 git remote add 命令添加一個遠程倉庫的信息。一般平台如 github 頁面首頁的右上角都包含有 clone 按鈕,點擊即可獲得倉庫對應的 url .
git remote add name url //添加一個遠程倉庫,命名為 name ,其對應資源地址由 url 指定
如下命令即添加了一個遠程倉庫,並將其命名為 test . 之后可以直接通過名字 test 來進行遠程倉庫的管理工作。當用戶使用 git clone 命令獲取一個遠程倉庫數據時,git 會將該遠程倉庫默認命名為 origin,用戶可以通過 git clone 的 -o 命令指定遠程倉庫的名字 。
git remote add test https://github.com/schacon/simplegit-progit //添加遠程倉庫 test,其 url 如命令所示 git clone -o test https://github.com/schacon/simplegit-progit //下載遠程倉庫數據至本地,遠程倉庫名被命名為 test
對應的,用戶可以通過 git remote remove 來刪除遠程倉庫的信息。
git remote remove test //刪除 test 對應的遠程倉庫的信息
注意 git remote add 命令僅僅配置了遠程倉庫的 url 等信息,並沒有獲取對應的倉庫數據。用戶可以通過 git remote 命令查看已經添加了的遠程倉庫信息。
git remote //顯示當前已有的所有倉庫的名稱 git remote -v //顯示詳細的倉庫信息,包括倉庫名稱和對應的 url 等 git remote show test //顯示遠程倉庫 test 的詳細信息
在設置好遠程倉庫的信息后,即可將遠程倉庫的數據拉取到本地。這里主要通過 git fetch 命令獲取遠端倉庫更新的數據( 即相對於上一次 git fetch 而言新增的修改,若本次為第一次獲取該分支數據,則獲取該分支的所有數據)。
git fetch test //直接使用時,獲取 test 對應遠程倉庫的所有新增修改(即所有分支的修改數據) git fetch test test1 //加入分支名參數,表示獲取 test 對應遠程倉庫的 test1 分支的新增修改數據
取回本地的數據均通過 倉庫名/分支名 的方式使用,如上述獲取的分支數據即為 test/test1.注意,git fetch 命令僅將分支數據取回到本地但並不會自動切換到上述分支數據中。
圖示為筆者通過 git fetch 命令取回 origin 倉庫對應的 MD5sum 分支的數據,其本地數據名稱為 origin/MD5sum .
注意,git fetch 僅取回本地相對於上一次 git fetch 時遠端倉庫新增的修改,故而 git fetch 命令並不一定會獲得整個 origin/MD5sum 所包含的文件數據,假如本地倉庫之前已經獲取過 origin/MD5sum 分支的數據,則再次運行 git fetch 只會獲得遠端倉庫新增的修改,而不是整個項目。
若之前已經通過 git fetch 命令獲取了數據,則再次運行 git fetch 命令時僅獲取遠端倉庫的增量部分,此時可以先切換到該遠端分支對應的本地分支(切換分支方法見點3),再通過 git merge 命令將新增的修改與之前存在的數據融合,此時獲得融合了 origin/MD5sum 新修改的數據。
git merge origin/MD5sum //合並遠端倉庫的 MD5sum 分支到當前分支
新手暴力方法:如果之前在命令行實驗中 git fetch 取回了遠端數據,即本地已經有了對應分支的數據,則再次執行 git fetch 時獲取的只是相對於上一次獲取數據時新增的數據(如發生了改動的單個文件)。在不熟悉其他命令情況下,想要在一個新的文件夾中獲取該分支完整的代碼,可以暫時使用暴力操作方法,可以參考暴力獲取完整倉庫分支數據的方法。
3.本地創建/切換分支 —— git checkout/branch
在獲取數據后,需要進行分支切換進而使用上述數據,並以此為基礎進行編輯工作。有兩種選擇,一種是將上述獲取的數據融合到當前分支中,一種是開始一個新的本地分支,並以此分支為基礎進行對應的修改。筆者這里選擇的是第二種,即開始一個新的分支,並在此分支上進行的修改( 在第一次獲取該遠程倉庫分支時,由於之前本地不存在相應的數據,因此獲取的是該遠端分支所有的數據,而不是增量,比較適合第二種情況 )。開始/切換新的分支可以使用 git checkout 命令,其最后一個參數可用於指定分支的開始點。
git checkout name //切換到分支 name git checkout -b name //創建並切換到 name 分支 git checkout -b name origin/test //切換到 bame 分支,並設置開始點為 origin/test 分支
如筆者通過如下命令切換到新的 MD5sum 分支,並以遠程倉庫獲取的 origin/MD5sum 分支數據作為開始點。(若想在當前分支上進行修改,則需要通過 git merge或 git rebase 將 origin/MD5sum 數據合並到當前本地分支中,再進行操作,這里不做介紹)
git checkout -b MD5sum origin/MD5sum //創建新分支,並以 origin/MD5sum 作為開始點
在創建新分支的同時,該分支還同時被設定"追蹤"( track )遠端分支 origin/MD5sum。建立上述追蹤關系后, MD5sum 分支默認的 git pull / push 命令的默認遠端倉庫分支即為 origin/MD5sum.
用戶可以通過 git branch 命令查看目前已有的分支情況,並對分支進行管理。注意, git branch 命令只能創建分支,並不會自動進行分支的切換。用戶總是需要通過 git checkout 命令手動切換所在分支。
git branch //查看本地分支, * 表示當前所在分支,使用 -v 參數則會顯示各分支最后一次提交 git branch -a //查看本地和遠端倉庫的所有分支 git branch test //新建名為 test 的本地分支,-d 參數表示刪除某個分支
筆者通過 git branch 查看的輸出如下,可以看到此時筆者已經位於本地 MD5sum 分支下。
若之前已經通過 git fetch 命令獲取了數據,則再次運行 git fetch 命令時僅獲取遠端倉庫的增量部分,此時可以先切換到該分支對應的本地分支,再通過 git merge 命令將新增的修改與之前存在的數據融合,此時獲得融合了 origin/MD5sum 新修改的數據。
git merge origin/MD5sum //合並遠端倉庫的 MD5sum 分支到當前分支
4.本地工作及修改 —— git status/add/commit
在本地對 MD5sum 分支進行修改和提交借助 git 的如 git status/add/commit 命令。簡單而言,可以通過 git status 命令跟蹤各個文件的狀態,通過 git add 命令將修改后的文件加入待提交狀態,通過 git commit 將待提交狀態的修改提交,具體的 git 命令和含義可以參考筆者的另一篇文章 git 學習記錄—— git 中的倉庫、文件狀態、修改和提交操作等。這里即注意本地的 git commit 都是將修改提交保存在本地,若想要數據與遠程倉庫同步,還需要將本地修改提交到遠程倉庫。
在本地修改數據並提交后,還需要將本地的修改推送至遠端倉庫的對應分支上。git 獲取遠端倉庫時,會將遠端倉庫完整的項目拷貝至本地的計算機上,故而 git 中的絕大多數操作都是基於本地文件和資源,從而使得用戶在離線情況下仍能以較快的速度對本地的項目數據庫進行操作,如 git commit 命令即將本地的修改保存在本地倉庫中,用戶需在網絡環境下進行本地與服務器端的同步。用戶需要通過 git push 命令將本地修改推送到遠端倉庫的特定分支中。
可以使用 git push 將本地分支數據上傳到遠端倉庫特定分支中,git push 命令的形式如下所示。
git push 遠端倉庫 x 本地分支 y : 遠端分支 z //將本地的分支 y 推送到遠端倉庫 x 中的分支 z
在筆者的例子中,即將本地分支 MD5sum 的修改推送到遠端倉庫 origin 對應的 MD5sum 分支中,命令如下所示。
git push origin MD5sum:MD5sum //將本地分支 MD5sum 推送到 origin 對應的遠端倉庫的 MD5sum 分支中
git push 還有個特殊的寫法,表示刪除遠端倉庫的對應分支,寫法與其基本用法一致,但本地分支名為空。
git push origin :MD5sum //刪除 origin 對應的遠端倉庫的 MD5sum 分支,操作請謹慎
(1) 在命令行或 git bash 環境下 ls -a 可以看到當前目錄下有一個 .git 目錄,該目錄即為 git 倉庫管理信息的目錄,通過 rm -rf .git/ 即刪除掉該目錄,此時當前目錄變為一個普通目錄,而不再是倉庫;
(2) 進入想要存放分支數據的新目錄中,通過 git init 命令將該目錄初始化為一個空的 git 倉庫;
(3) 上述 git 倉庫通過本文所描述的方法添加遠程倉庫的信息,並使用 git fetch 命令獲取對應遠程倉庫分支的數據,此時由於本地倉庫是空的,所以 git fetch 會取回遠端倉庫相對於上一次取回數據新增的修改( 本次 git fetch 即為第一次 fetch 操作),即整個分支全部的數據都為新增的修改,即分支數據被完整的取回本地;
(4) 使用本文的方法新增分支,並在該分支中進行遠端獲取的數據的修改;
參考資料:
git 拉取遠程分支到本地 —— CSDN - git 獲取遠程倉庫分支的文章,有圖
Git遠程操作詳解 —— 阮一峰的博客 - 介紹了 git clone/remote/fetch/pull/push 命令的操作和原理
Git 基礎 - 遠程倉庫的使用,Git 文檔 - 遠程倉庫的描述,git 官方文檔
Git 分支 - 遠程分支,Git 文檔 - git 遠程倉庫的描述,推薦閱讀。介紹了某些命令的基本操作
git提交本地分支到遠程分支—— cnblog - 提交本地分支到遠程分支
Git - 分支的新建與合並 - git 文檔關於分支的建立和合並操作,推薦
Git 少用 Pull 多用 Fetch 和 Merge - oschina