笔者最近进行开发过程中,所有参与者的代码需要通过 git 上传到远端仓库中,不同的模块对应不同的 git 分支,不同模块的数据需要从远端仓库中获取。这里记录下笔者从远端仓库中获取分支数据,进行修改,最后重新上传同步分支数据的过程。

  注:对于本地不存在 git 仓库的情况,要么直接通过 git clone 命令获取对应的远端整个仓库,此时获得远端仓库的所有数据,要么可以选择一个目录,通过 git init 命令将该目录初始化为一个空的 git 仓库,之后再根据下文描述的步骤获取仓库数据(可以单独获取仓库的某一分支的数据)。   

  Index

  1.添加远端仓库信息 - git remote add/remove

  2.获取远端仓库数据 - git fetch

  3.本地创建/切换分支 - git checkout/branch

  4.本地工作及修改 - git add/commit/status

  5.推送数据至远端仓库 - git push

  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

git 学习笔记 —— 获取远端分支并修改后提交至远端仓库的更多相关文章

  1. Git学习笔记(3)——撤销修改和文件的删除

    本文主要记录了git中,错误的撤销和文件的删除. 撤销修改 这里有3中情况 改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 不但改乱了工作区某个 ...

  2. git学习笔记06-创建分支合并分支-比svn快多了,因为只有指针在改变

    一开始git只有一条时间线,这个分支叫主分支,即master分支. HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支. 每次提交,mas ...

  3. git学习笔记二-branch分支

    1.刚创建好的空仓库的分支是空的,即使是master分支也是不存在的.master分支是不能通过git branch 来创建的,只有在完成第一次提交才会自动创建,有git自动完成master分子的创建 ...

  4. git 学习笔记 —— 保留/丢弃当前分支修改并切换至其他分支

    笔者在本地终端进行 git 工作目录的相关处理时,遇到由于某种情况需要使用 git checkout 命令切换到其他分支的情景.此时,若已经对当前分支做了一定的修改,则直接切换分支时 git 会提示错 ...

  5. Git学习笔记3-远程仓库

    1.添加远程仓库 $ git remote add [shortname] [url] $ git remote add origin https://github.com/Mike199201/Gi ...

  6. git学习笔记之二 -- git分支

    前面对git基础作了简单的总结,这次对git的杀手锏--分支做一总结. Git分支简介 几乎每个版本控制系统都以某种形式支持分支,可以使你的工作从开发主线上分离开来,以免影响开发主线.很多版本控制系统 ...

  7. GIT学习笔记(4):远程分支

    GIT学习笔记(4):远程分支 远程分支 远程分支是什么 远程分支是对远程仓库中的分支的索引.它们是一些无法移动的本地分支:只有在GIT进行网络交互时才会更新.远程分支就是书签,提醒着你上次连接远程仓 ...

  8. GIT学习笔记(3):分支管理

    GIT学习笔记(3):分支管理 何谓分支 GIT是如何存储数据的 GIT不是存储文件差异或者变化量,而是一系列文件的快照.在Git提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容 ...

  9. Git学习笔记(5)——分支管理

    本文主要记录了分支的原理.分支的创建,删除,合并.以及分支的使用策略. 分支在实际中的作用 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不 ...

随机推荐

  1. 记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法

    记一次查询超时的解决方案The timeout period elapsed...... https://www.cnblogs.com/wyt007/p/9274613.html Exception ...

  2. scala 正则

    package com.program import scala.util.matching.Regex object RegexTest { def main(args: Array[String] ...

  3. redis生成分布式id方案

    分布式Id - redis方式   本篇分享内容是关于生成分布式Id的其中之一方案,除了redis方案之外还有如:数据库,雪花算法,mogodb(object_id也是数据库)等方案,对于redis来 ...

  4. kali无法安装nvidia显卡驱动

    按照各位大神的博客安装nvidia显卡驱动一直失败,重启之后无法正常进入系统,恢复模式可以进入,一直以为自己是不是哪里步骤不对,后面来回重装了几次系统. 最后意识到虚拟机里用的是虚拟网卡,并非宿主机的 ...

  5. Python【每日一问】30

    问: [基础题]:一个足球队在寻找年龄在10岁到12岁的小女孩(包括10岁和12岁)加入.编写一个程序,询问用户的性别(m表示男性,f表示女性)和年龄,然后显示一条消息指出这个人是否可以加入球队,询问 ...

  6. SpringBoot扩展点之一:SpringApplicationRunListener

    三种监听器的关系 ApplicationListener.SpringApplicationRunListeners.SpringApplicationRunListener的关系: SpringAp ...

  7. jwt的简单使用

    目录 简介 java版本 golang版本 简介 使用jwt对数据进行存储加密,分为java和golang版本. java版本 maven配置 <dependency> <group ...

  8. 华为 S5700 交换机 批量修改端口方法

    常常在配置交换机端口的时候需要将多个端口设置为相同的配置,当时各端口逐一去配置不仅慢,而且容易出错,这个时候就需要对端口进行批量设置,不仅快捷,而且避免了反复输出容易出错的情况.不同系列.不同版本交换 ...

  9. GitLab CI/CD的官译【原】

    CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...

  10. Java自学-接口与继承 Object类

    Java中的超类 Object 步骤 1 : Object类是所有类的父类 声明一个类的时候,默认是继承了Object public class Hero extends Object package ...