笔者最近进行开发过程中,所有参与者的代码需要通过 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 的详细信息
2. 获取远程仓库的数据 —— git fetch
在设置好远程仓库的信息后,即可将远程仓库的数据拉取到本地。这里主要通过 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 都是将修改提交保存在本地,若想要数据与远程仓库同步,还需要将本地修改提交到远程仓库。
5.推送数据到远端仓库 —— git push
在本地修改数据并提交后,还需要将本地的修改推送至远端仓库的对应分支上。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