最初只有一个分支,随着业务发展,分化出不同的分支,分化出的分支又要合并最初分支的修改。

github 上 fork 别人的项目,别人的项目有更新,自己 fork 的分支也有修改(不能删除后重新fork),需要合并原分支的修改(可能也是 merge 其他人的修改)。

实验准备:

本机已安装好 git 命令行,且配置好 ssh 密钥,可以向自己的 gitbub 提交。

实验材料:

分支地址:

git@github.com:tianqing2117/flexbox-layout.git
自己的仓库地址,有 pull、push 的权限,最终也是更新到这个仓库; https://github.com/google/flexbox-layout.git
fork 的原项目地址,有 pull 的权限;

两年前 fork 了 google 的项目,google 这两年持续在更新这个项目,一直没有合并 google 的更新。

更新前,自己仓库的状态
更新前,自己仓库的状态
更新前,google 仓库的状态
更新前,google 仓库的状态
  • 本地 clone 自己的远程仓库
  • git clone git@github.com:tianqing2117/flexbox-layout.git
    

    clone 后需要 cd 到 flexbox-layout 文件夹里才进入 git 项目目录。

  • 添加原项目地址为远程仓库地址
  • git remote add google git@github.com:google/flexbox-layout.git
    

    这里给这个远程仓库地址起名叫 google

  • 新建本地分支接受 google 仓库地址的内容
  • git checkout -b tmp
    

    这里创建了一个本地分支叫 tmp ,并切换过去了

  • 从 google 远程分支更新修改到 本地 tmp 分支
  • git pull google master:tmp
    

    这里把 google 远程仓库的修改同步到了本地 tmp 分支

  • 切换回本地 master 分支
  • git checkout master
    

    因为这个分支的内容是和自己的远程仓库保持同步的

  • 从本地 tmp 分支合并修改到 master 分支
  • git merge tmp
    

    相当于把 google 远程仓库的变更合并到本地 master 分支

  • 提交变更到自己的远程仓库
  • git push origin master
    更新后自己远程仓库
    更新后自己远程仓库

    相关命令详解

  • git clone
  • git clone <版本库的网址> 
    git clone <版本库的网址> <本地目录名> // 指定本地目录名
    git clone -o romoteBranchName <版本库的网址> //指定远程分支名称
    

    clone 命令会创建指定本地目录名的文件夹把版本库的内容更新下来,默认创建本地分支 master 和远程分支 origin 并绑定;
    -o 可以指定远程分支名称;
    不指定本地目录名则创建与版本库目录名一样的目录。

  • git remote
  • git remote //命令列出所有远程主机
    git remote -v //列出所有远程主机并展示远程主机的网址
    git remote show <主机名> //查看远程分支的详细状况
    git remote add <主机名> <网址> //添加远程主机名
    git remote rm <主机名> // 删除远程主机
    git remote rename <原主机名> <新主机名> // 修改远程主机名
    
  • git branch
  • git branch //查看本地分支 现在所在的分支会有 * 号标注
    git branch -r //查看远程分支
    git branch -a //查看所有分支(本地+远程)
    
  • git checkout
  • git checkout 分支名 //切换到指定分支
    //指定本地分支切出新分支并切换。不指定分支时根据当前分支切新分支
    git checkout -b newBrach 远程分支/本地已有分支 
    
  • git merge
  • git merge 本地分支名 //合并本地分支
    //合并本地分支,用于取 fetch 后的内容
    git merge 远程分支/本地分支 
    
  • git pull
  • //把指定远程主机名远程分支的内容拉取到指定的本地分支
    git pull <远程主机名> <远程分支名>:<本地分支名>
    //把指定分支内容拉取到当前本地分支,相当于先 fetch 再 merge
    git pull <远程主机名> <远程分支名> 
    
  • git push
  • //把指定本地分支的 commit 推到指定的远程主机远程分支上
    git push <远程主机名> <本地分支名>:<远程分支名>
    //把本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
    git push <远程主机名> <远程分支名>