git 合并两个远程分支

场景:

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

实例:

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

实验准备:

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

实验材料:

分支地址:

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

更新前,自己仓库的状态
更新前,google 仓库的状态

简单版

  1. 本地 clone 自己的远程仓库
    git clone git@github.com:tianqing2117/flexbox-layout.git
    

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

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

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

  3. 从步骤 2 添加的远程仓库 merge 代码
    git merge google/master
    

    添加后可以通过 git remote -v 查看一下

  4. 提交变更到自己的远程仓库
    git push origin master
    

复杂版

操作步骤

  1. 本地 clone 自己的远程仓库
    git clone git@github.com:tianqing2117/flexbox-layout.git
    

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

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

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

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

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

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

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

  5. 切换回本地 master 分支
    git checkout master
    

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

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

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

  7. 提交变更到自己的远程仓库
    git push origin master
    

实验结果

更新后自己远程仓库

相关命令详解

// 命令格式
 git archive -o 导出文件名.zip 导出版本号 $(git diff --name-only 旧版本号..新版本号)
//命令格式
git branch --set-upstream-to=origin/远程分支名(可通过 `git branch -a` 查看)

示例:

git branch --set-upstream-to=origin/1.0.1
//命令格式
git cherry-pick commit版本号

示例:

git cherry-pick 62ecb3
//暂存
git stash
//查看暂存列表
git stash list
//取出暂存的修改(仅应用,不删除)
git stash apply --index
//删除暂存的内容 (名字可由 git stash list 查询)
git stash drop 暂存名
// 应用最后一个储藏,并从堆栈中移除(最常用)
git stash pop

示例:

git cherry-pick 62ecb3

git 库迁移

时常需要把 git 项目迁移到新的 git 服务上 要保留完整的 commit 记录及 branches

1. 在新的 git 服务上创建项目(空项目)

2. clone 裸库

git clone --bare 原 git 项目地址

3. 推送镜像到新地址

git push --mirror 新 git 项目地址

git status 中文文件名乱码

修改配置即可

git config --global core.quotepath false