1 问题描述

 最近在负责项目的时候,经常需要在杭州、南京两地同时开发代码,当然,以南京现场开发的程序为准,但当杭州的开发某个节点完成时,就需要把开发的内容合并到南京现场,之前采用的方式是通过使用BeyongComapre,但这种问题的一个极大的缺陷就是两地开发中有一方的提交日志会丢失,提交历史是项目开发中极为重要的信息,它记录着同事们是如何一步一步走到当前的提交的,因此最好不要把这些提交日志搞丢,在此次同时从杭州带代码到南京时,自己通过Git提供的分支功能,非常优雅的解决了即合入杭州开发的新功能的同时,又保留了杭州开发时所生成的提交记录,因此把操作的过程记录如下,算是对1024这个程序员节日的一种纪念。

2 基本过程


上述的图例简单的描述了操作序列步骤。
由于南京和杭州的开发为基于相同分支上的开发,因此优点就是当某个开发者所做的修改经常与其他开发者的修改混淆在一起的时候,有利于冲突的快速检测。
问题的解决还是依赖于分支,即把南京的开发当成一个完成的特性来合并到主干分支上。

2.1 分支管理

对于版本提交为什么不能依次进行,以便形成一个直线型的提交历史记录,Rene Preibel认为有以下两个主要的原因:

  1. 有两个以上的开发者在对同一个项目进行并行式开发。
  2. 为修复旧版本中的bug而需要创建和发布新的版本。
    显示当前活跃分支
$ git branch
* developlenovo@Lenovo-PC MINGW64 /d/600-Git/campus (develop)
$

创建新分支

git branch new-branch

切换到新分支

git check new-branch

删除分支

git branch -d new-branch

需要注意的是,如果我们正在试图删除一个分支时自己还未转移到不同的分支上,Git会给出一个警告,并拒绝该删除操作,如果要坚持删除该分支,需要使用-D选项。

git branch -D b-branch
在当前项目中,我们以南京现场的项目为A项目,杭州开发的待合入的项目为B项目,行文以A、B项目表述。

首先进入B项目根目录,新建一个分支

cd Project_B
git branch HZ-1024

表示为项目B创建了新的特性分支HZ-1024.
Git分支管理的内容参见Git分支管理

2.2 远端管理

接下来要做的是要把新建的分支HZ-1024推送到A项目的远端,使得A项目的远端同时包含A项目的origin/HZ-1024.
在Git的世界里,remote命令用来进行对仓库的远端进行管理

NAME
git-remote - Manage set of tracked repositoriesSYNOPSIS
git remote [-v | --verbose]
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
git remote rename <old> <new>
git remote remove <name>
git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
git remote set-branches [--add] <name> <branch>…​
git remote get-url [--push] [--all] <name>
git remote set-url [--push] <name> <newurl> [<oldurl>]
git remote set-url --add [--push] <name> <newurl>
git remote set-url --delete [--push] <name> <url>
git remote [-v | --verbose] show [-n] <name>…​
git remote prune [-n | --dry-run] <name>…​
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…​]

参见git命令之git remote的用法首先我们用

$ git remote get-url --all origin
http://git.sysdep.com:8899/xxx/campus.git

获取项目B的远端url。
并以同样的方式cd到A项目的根目录,获取A项目的远端Url。然后通过git remote set的命令设置项目A的url,

lenovo@Lenovo-PC MINGW64 /d/600-Git/campus (develop)
$ git remote set-url origin http://git.sysdep.com:8899/sqh/campus.gitlenovo@Lenovo-PC MINGW64 /d/600-Git/campus (develop)
$ git remote get-url origin
http://git.sysdep.com:8899/sqh/campus.git

然后,就要在A项目的中央版本库中维护新建的特性分支。

git checkout -b HZ-1024
git push --set-upstream origin HZ-1024
git push

–set-upstream参数会将本地的特性分支与远程版本库中的新分支连接起来。即将来执行push和pull操作时都可以免去显式指定远程分支的操作。

2.3 合并分支

接下来的重点在于,相关的合并必须始终在master分支上合并。否则master分支就无法获得一个第一分支的提交历史,这就毫无意义了。由于我们基于develop分支开发,因此首先更新develop分支。

git checkout develop
~~git pull --ff-only~~
git merge HZ-1024

–ff-only表示不允许快进式合并,因为两地同步进行开发,因此此处的命令可以不执行。
也可以使用以下命令来执行合并操作,并同时防止其执行快进式合并。

git merge HZ-1024 --no-ff --nocommit

这里–no-ff参数的作用就是防止快进式合并,而–no-commit参数则用于指示Git不要因为接下来的可能失败的测试而停止任何提交。

2.4 解决冲突

Git非常适合于在几个开发者对同一软件做多处修改时,被用来合并它们对程序源代码所做的修改。但对于编辑冲突,即通常发生在两个开发者对同一行代码做了不同修改的时候,这种情况下,Git往往无法自行确定那一种才是正确的。

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

当合并分支时,如果确实提示了冲突,我们只要会正确的阅读冲突所生成的文件,解决冲突便不再棘手。
冲突的文件会产生冲突编制。冲突标志通常会描述两组修改,首先是这些被修改的行在当前分支(HEAD)中的内容,然后接下来又列出了他们在另一个分支即(Merge_HEAD)的内容。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>标记出冲突的内容。
然后,我们需要与代码修改的双方来沟通,当冲突发生以为着沟通的必要,需要删除冲突标志内容的同时决定那个分支上的内容为正确的。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
~~<<<<<<< HEAD~~
Creating a new branch is quick & simple.
~~=======
Creating a new branch is quick AND simple.
>>>>>>> feature1~~

上图表示接受了当前分支的提交。参见解决冲突

2.5 合并提交

在解决完所有的冲突文件之后,需要把所有的冲突文件注册修改。

git add .

然后提交

git commit

2.6 删除分支

删除新建的特性分支

git branch -d HZ-1024
git push origin :HZ-1024

3总结

在开发过程中,会遇到许多的问题,问题意为着困惑,解决问题意味着成长,对于Git这个工具,当前项目还仅仅是基于一个分支开发的模式,但未来还是要基于更多的特性,诸如基于特性分支的开发,熟练的使用Git,理解GIt的工作原理、理解提交、分支、版本库的含义对于工作都有很好的帮助。通过不断的工具使用,锤炼工具思维,升级自己的工具套装,抬升效率,让工作生活优雅高效或许就是一点一点的意义所在,就连记录,我想,也有着同样的作用。

                     2019-10-24 23:24于北四环中路海友酒店学院桥店

Git如何保留两地并行开发的提交相关推荐

  1. Git学习文档之一 学习文档-并行开发

    ##并行开发 ###集成管理员工作流 由于 Git 允许使用多个远程仓库,开发者便可以建立自己的公共仓库,往里面写数据并共享给他人,而同时又可以从别人的仓库中提取他们的更新过来.这种情形通常都会有个代 ...

  2. git merge 回退_Git项目开发必备命令

    前言 Github:https://github.com/HealerJean 博客:http://blog.healerjean.com 1.开发常备 1.0.本地直接创建仓库 git init / ...

  3. 使用Git将我的最后一个X提交一起压缩

    如何使用Git将最后的X个提交一起压缩为一个提交? #1楼 根据克里斯·约翰森的回答 , 从bash添加全局" squash"别名:(或Windows上的Git Bash) git ...

  4. 使用git和github进行协同开发流程

    目录 前言 仓库(Repository) 源仓库 开发者仓库 分支(Branch) 永久性分支 暂时性分支 工作流(workflow) 总结 参考资料 前言 (本文假设各位已经对基本git的基本概念. ...

  5. 使用 vs code 与 git 命令行 进行团队开发

    使用 vs code 与 git 命令行 进行团队开发 一. 将拉取项目到本地 首先在 git 编辑器上使用 git clone https://gitee.com/xx.git (码云/github ...

  6. git从master转到开发分支

    本文翻译自:git pull from master into the development branch I have a branch called dmgr2 (development) an ...

  7. git stash 强制恢复_开发中必须要掌握的 Git 技巧

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:你喜欢吃青椒么 juejin.im/post/5d157bf3f265da1bcc1 ...

  8. git 修改分支名字_开发中必须要掌握的 Git 技巧

    前言 本文是参考杜老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考.因为水平有限,难免会有出错的地方,欢迎指正. ...

  9. Git仓库初始化_企业级开发原则

    Git仓库初始化_企业级开发原则 文章目录 1. 在远程github创建仓库 2. 在本地创建README.md测试WIKI文件 3. 创建.gitignore文件 4. 初始化git仓库 5. 工作 ...

  10. Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支

    1.背景 想拷贝代码到内网开发环境,因为网速很慢,所以希望Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支.因为我直接拷贝压缩一个项目居然有1G的内容, 2.重要步骤 复制一个项目,拷贝粘贴 3. ...

最新文章

  1. dubbo被阿里放弃原因_中间件小姐姐直播“带货”——阿里程序员必知的插件
  2. 支付系统高可用架构设计实战,可用性高达99.999!
  3. Ext JS 4.1 RC2 Released发布
  4. 解决JS浮点数(小数)计算加减乘除的BUG
  5. [SQL]LeetCode180. 连续出现的数字 | Consecutive Numbers
  6. Oracle中用于发送邮件的存储过程
  7. InnoDB在MySQL默认隔离级别下解决幻读
  8. (转)数字货币平台的交易风险
  9. oracle中的存储过程和存储函数的区别
  10. Android 开发工具一键下载
  11. 微信小程序源码分享合集-1
  12. css 背景渐变详解
  13. 【io】io等待为什么引发cpu过高?
  14. 很有意思的几个考验知识广度的问题
  15. 国产化服务器兼容系统,必须兼容中国芯,国产操作系统再迎来发展机遇?
  16. 欢迎来到wxWindows
  17. CStdioFile 一些基本用法
  18. 软件测试流程有哪些?
  19. DOS命令dir是否能查看隐藏文件夹
  20. 二. 征服C指针:C如何使用内存

热门文章

  1. esxi - 加装vmware titan xp显卡配置
  2. 深挖用户需求,只需要这三步就够了!
  3. 数据分析(商业数据分析师理论认知之二商业分析师入门指南)
  4. socket编程c++
  5. SuperMap系列——GIS数据之地图瓦片
  6. Tomcat的appBase,docBase,path关系
  7. 苹果输了官司,iPad会改名吗?
  8. 电脑公司 GHOST XP SP3 特别版1308
  9. CNN应用之性别、年龄识别
  10. python描述对象静态特性的数据为_要设置单选按钮,应使用的控件是:_学小易找答案...