分支
什么叫分支呢?我们之前用git进行开发的时候,都是在主分支上(master)。你可以理解为master就是我们线上的版本,假设我们现在要开发一个新功能,我们可以单独拉个分支进行开发,在这个分支上进行开发,这样就不会影响我们之前的版本了。当我们开发了一段时间之后,发现线上有一个bug,需要紧急修复。我们可以切换到master分支上,在拉一个分支,这时,这个分支是没有我们的新开发的代码的。我们可以在这个分支上修改bug,修改完bug之后,合并到master上上线。在切换到新功能的分支上进行开发,开发完之后再和master进行合并。
git branch
git branch用于查看所有的分支
我们现在master上有三个版本
查看一下分支
# git branch * master
git branch命令会列出所有分支,当前分支前面会标一个*号
创建分支
既然v3版本是我们的线上版本,我们要开发新功能肯定不能在这个分支上进行更改,我们可以新建一个dev分支,在dev分支上开发新功能
# git branch dev
在来查看一下分支
# git branch dev * master
切换分支
我们已经创建了一个dev分支,既然要在dev分支上开发新功能,那我们首先要切换到dev分支上
git checkout 分支名称
# git checkout dev
查看下我们在哪个分支上
# git branch * dev master
*表示当前在dev分支上。
上面我们创建了分支,然后切换了分支,其实我们可以一步完成
# git checkout -b dev # git checkout 命令加上-b参数表示创建并切换,相当于以下两条命令: # git branch dev # git checkout dev
切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:
# git switch -c dev
既然切换到了dev分支上,那我们就开发新功能
复制粘贴了n行代码之后。。。
发现线上有了个bug,需要我们紧急处理,我们先把我们写的新功能提交到版本库里
# git add . # git commit -m '新功能50%'
既然有bug了,我们肯定优先处理bug,肯定不能在当前分支处理,新功能可能还没开发完成。我们可以新创建一个bug分支,在那个分支上进行bug修复
首先切换到master分支,这时master上是没有我们新开发的功能代码的
# git checkout master Switched to branch 'master'
创建一个bug分支
# git branch bug
切换到bug分支
# git checkout bug Switched to branch 'bug'
既然我们已经切换到了bug分支上了,那我们修改bug,复制粘贴。。。
在提交到版本库
# git add . # git commit -m '修复bug'
合并分支
现在bug已经修改完了,我们要把修复bug的代码合并到master分支上发布上线
我们要把bug分支合并到master上,所以我们要切换到master上,这时master上是没有修复bug的代码的,也就是只有v3版本的代码
# git checkout master Switched to branch 'master'
git merge 要合并的分支
# git merge bug Updating b119263..21e1638 Fast-forward manage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
在去看代码,我们修复bug的代码都已经合并到master上了。
既然我们的bug已经解决了,那bug分支就没有用了,我们可以删掉
删除分支
git branch -d 分支名称
# git branch -d bug Deleted branch bug (was 21e1638).
这时候在使用git branch查看就没有bug分支了
解决冲突
既然bug已经解决了,那我们可以继续开发我们的新功能了,切换到dev分支上
# git checkout dev Switched to branch 'dev'
复制粘贴之后,我们的新功能也开发完成了。提交到版本库
# git add . # git commit -m '新功能完成'
既然新功能已经完成了,就要发布上线了,切换到master上
# git checkout master Switched to branch 'master'
合并分支
# git merge dev Auto-merging manage.py CONFLICT (content): Merge conflict in manage.py Automatic merge failed; fix conflicts and then commit the result.
git告诉我们合并失败了,我们打开我们的文件
可以看到这里失败了,这是因为我们之前拉了两个分支dev和bug,在bug分支上修复了bug之后合并到了master分支上,这时master的代码和dev的代码不一致,导致我们合并的时候,git不知道怎么合并,所以会失败,我们可以手动进行合并,然后再提交到版本库
# git add . # git commit -m '新功能上线'
最后在使用git log --pretty=oneline查看下版本
# git log --pretty=oneline 727f1a099b14080eedf72ebc87ee4fa501e39c15 (HEAD -> master) 新功能上线 9e645c85a404d65ff6ea2a1b2dcb8f657a29f264 (dev) 新功能完成 21e16380e4ba0dce46bb02ce530d3a82ab80dc73 修复bug 832b337fa420e2620343f59eca32780d439a39da 新功能 b119263bf20d6e9b1cc521ea3edd7e2d0cfa2274 v3版本 7eb789f8b7002c432c958c281c838b3076a779a1 v2版本 09403486af1fd13ca9f844326e1bd7c187611be8 v1
Beyond Compare
上面我们解决冲突是靠手工一行一行的解决的,如果有成百上千个文件有冲突,这样肯定是不行的。beyond compare提供这种比较,把所有冲突的文件找出来,然后我们只需要点点点就可以了
首先需要安装 官网:http://scootersoftware.com/
安装完成之后需要进行配置,执行下面的命令
# git config --local merge.tool bc3 # git config --local mergetool.path '你的compare的安装路径' # git config --local mergetool.keepBackup false
配置完成之后只需要执行下面的命令,就会打开compare软件,自动找到有冲突的文件
# git mergetool
注意:上面的--local表示只在当前目录里有效,也就是如果你还有一个文件夹也被git管理,在那个里面不会生效