Git如何保留两地并行开发的提交

12 篇文章 1 订阅

1 问题描述

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

2 基本过程

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

2.1 分支管理

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

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

lenovo@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 repositories

SYNOPSIS
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.git

lenovo@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于北四环中路海友酒店学院桥店
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值