# 基线版本和定制版本同步更改
可以参考这个链接  
https://www.cnblogs.com/Mufasa/p/14431990.html  
有两种方案：
- 多分支
- 多仓库 
  
结合咱们公司项目分配到具体负责人的特点，推荐大家采用 **多仓库**方案创建定制规约版本。  
 
~~## 多分支~~  
~~1. 从基线仓库拉取最新的程序到本地~~  
~~2. 创建新分支代表定制版本，并切换到新分支~~  
~~3. 做一些定制化修改~~  
~~4. 测试无误后提交更改~~  
~~5. 把定制版本分支推送到服务器~~  
~~6. 基线仓库更新优化~~  
~~7. 切换到定制版本分支，单次更改可以采用摘取（cherry-pick）命令把基线上的更改提交到当前定制分支。同时同步多次更改可以采用合并命令。~~  
~~8. 推送定制分支~~  

## 多仓库
### 定制版本搭建
#### 1. 从基线仓库克隆最新的程序到本地  
在文件夹右键选择Git克隆，在URL栏填写基线仓库的服务器地址,点击确定  
![](./git_clone.png)  

#### 2. 做一些定制化修改，代表定制版本
- 如果是新定制版本，直接在当前程序上修改即可  
- ~~如果是已经存在的定制版本，首先删除基线程序所有文件(保留.git文件夹和.gitignore文件)，然后把定制程序复制过来即可。**需要注意的是: 要保证定制程序和基线程序的版本相同。如果定制程序比基线落后的话，会丢失中间版本的更改。**~~  
拿一个已经存在的定制程序举例，删除基线程序所有文件，只保留.git和.gitignore文件。(这里简化操作，所有操作都在"master"分支进行，如果已经用上"Git Flow"分支管理，应当先切换到"develop"分支，再删除。)  
![](./git_deletebase.png)  
然后把定制程序复制过来,可以用TortoiseGit查看已修改的内容，此时的已修改应当是基线程序和定制程序的不同点，和用BC对比出来是一样的。  
![](./git_diff1.png)
![](./BC_diff.jpg)

#### 3. 提交更改
测试无误后提交更改  
![](./git_submit.png)

#### 4. 创建定制版本仓库
在服务器新建定制版本仓库。  
打开TortoiseGit的推送界面，点击“管理”按钮，选中“origin”查看详细信息。会发现“URL”还是原来的基线仓库连接。我们需要将"URL"改成定制仓库的连接。  
然后我们需要再添加一个名叫“upstream”（上游仓库，**名字可以任意，能表示基线，需要和origin区分开**）的远端仓库，链接为原来基线仓库的链接。后面抓取时会用到。  
此时的远端列表如下：  
![](./git_origin.png)  
![](./git_upstream.png)
#### 5.推送
把定制版本程序推送到定制版本仓库，打开TortoiseGit的推送界面，保持远端还是origin，点击确定。
![](./git_push.png)

### 实际应用
前面的操作把定制版本的架子搭好了，下面就要测试应用了。  
#### 基线程序的更改同步到定制版本  
![](./git_from_base_to_custome.png)  
##### 1. 基线程序版本更新  
在基线程序上面做一些更改并且提交推送。
##### 2. 定制版本获取基线更改
在本地的定制版本库，打开TortoiseGit的获取界面，把远端改成“upstream”,点击确定。  
![](./git_fetch.png)
##### 3. 合并获取的更改
打开TortoiseGit的合并界面，分支选择“remotes/upstream/master”，点击确定。  
![](./git_merge.png)  
如果没有冲突，合并会顺利结束；如果有冲突，需要手动解决冲突。  
合并完成后，就可以测试程序、提交更改、推送更改。  
<span style="color: red;font-weight: bold;font-size: 20px;">注意，合并只是代码文本的合并，git不会检查字节对齐、EE跨页等问题，仍然需要自己检查改动点。</span>  

#### 定制版本更改同步到基线程序
定制版本同步到基线程序要麻烦一些。  
![](./git_from_custome_to_base.png)
##### 1. 定制版本更改  
在定制程序上面做一些更改、提交和推送到定制仓库。
##### 2. 推送定制版本到基线仓库
如何让基线仓库知道定制版本修改了什么呢？给基线仓库也推送一份就可以了。  
在定制程序下打开TortoiseGit的推送界面，修改要推送到远端的分支名称，不要和master、develop等重要分支重复，并且把远端的连接改为“upstream”，点击确定。  
![](./git_push_upstream.png)  
这样，在服务器上就会多出一个分支“GX”，内容为定制版本的更改。
##### 3. 获取基线仓库的更改
在基线程序下，打开TortoiseGit的获取界面，点击确定。  
然后打开TortoiseGit的日志信息界面，点击右上角的超链接（这里是master） 
![](./git_log_main.png)  
然后在引用列表选择“remotes/origin/GX”，即上一步新上传的分支。双击打开。 
##### 4. 摘取更改
找到要采纳的更改，右键选择“摘取此提交”，点击“继续”。  
![](./git_cherry_pick.png)  
有冲突的会提示冲突，需要解决冲突，没有冲突了，然后点击提交。这样就把定制版本的更改同步到基线。测试无误后就可以推送到基线仓库。
##### 5. 删除基线上的定制分支
一切都结束后，基线上的定制分支就用不到了，可以删除它。  
在引用列表界面，选中“remotes/origin/GX”，右键选择“删除远端分支”，这样本地和服务器上都会删除该分支。  
![](./git_delete_branch.png)