赞
踩
在实际分⽀合并的时候,有时候可能会遇到代码冲突的问题,例如:
dev
分支在写一部分代码,而master
分支也没闲着,也在写着同一份代码commit
了,此时再合并分支,就会出现问题$ git merge dev
Auto-merging dev.txt
CONFLICT (content): Merge conflict in dev.txt
Automatic merge failed; fix conflicts and then commit the result.
解决方案:在发生冲突的文件内手动调整解决,并进行一次 修改 && 提交 操作
<<<<<<<, =======, >>>>>>>
来标记出不同分支的冲突内容$ cat dev.txt
I'm in dev_branch :P
<<<<<<< HEAD
From master_branch
=======
From dev_branch
>>>>>>> dev
git add, git commit
$ git add .
$ git commit -m "chose the master version"
[master ab30dfd] chose the master version
git log
添加--graph --abbrev-commit
参数可以看到分支的合并情况
通常合并分⽀时,如果可能,Git会采⽤Fast forward
模式
Fast forward
模式但是如果采用Fast forward
模式之后,形成的合并结果是怎样的呢?
Fast forward
模式下,删除dev
分支后,查看分支历史时,会丢失分支信息merge
进来的还是正常提交的$ git log
commit 23bed4ed226e91a17d6c7fd09303c9a152057f42 (HEAD -> master, dev)
Author: DieSnowK <1752351098@qq.com>
Date: Wed Jul 24 15:19:38 2024 +0800
md dev.txt
在合并冲突时,通过手动调整解决冲突,会再进行一次 修改 && 提交 操作
Fast forward
模式了dev
分支,但是仍然可以看到master
是由其他分支合并得到的$ git log
commit 7d05eb48eccc9ca23297791d5ee41b2e1862ab5e (HEAD -> master)
Merge: 23bed4e 923a843
Author: DieSnowK <1752351098@qq.com>
Date: Wed Jul 24 15:30:16 2024 +0800
merge dev with no-ff
Git支持用户强制禁用Fast forward
模式,那么就会在merge
时生成一个新的commit
git merge --no-ff branch_name
--no-ff
参数表示禁用Fast forward
模式Fast forward
模式后合并会创建一个新的commit
,所以还需要加上-m
参数git merge --no-ff -m "msg" branch_name
总结:
--no-ff
参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾经做过合并Fast forward
合并就看不出来曾经做过合并master
分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活dev
分⽀上,也就是说,dev
分⽀是不稳定的,
dev
分⽀合并到master
上,在master
分⽀发布该版本dev
分⽀上⼲活,每个⼈都有⾃⼰的分⽀,时不时地往dev
分⽀上合并就可以了dev2
分⽀上进⾏开发,开发到⼀半,突然发现master
分⽀上⾯有bug,需要解决,可现在dev
的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?
git stash
命令,将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来
$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: SnowK.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash
Saved working directory and index state WIP on dev: 2c93d33 Done
$ git status
On branch dev
nothing to commit, working tree clean
master
分支,新建并切换至fix_bug
分支,修复bug,重新add, commit
$ git checkout master
$ git checkout -b fix_bug
Switched to a new branch 'fix_bug'
# Fix bugs
$ git add SnowK.txt
$ git commit -m "Bugs Fix Done"
[fix_bug 8b8fe09] Bugs Fix Done
1 file changed, 1 insertion(+), 1 deletion(-)
master
分支,完成合并,最后删除fix_bug
分支$ git checkout master
Switched to branch 'master'
$ git merge --no-ff -m "merge stable branch from fix_bug" fix_bug
Merge made by the 'ort' strategy.
SnowK.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
dev
分支进行开发,恢复之前的开发现场
git stash list
stash
:git stash pop
git stash apply
也可以恢复现场stash
内容并不会删除,需要用git stash drop
来手动删除$ git checkout dev Switched to branch 'dev' $ cat SnowK.txt Hey I'm SnowK :P May be bug? $ git stash list stash@{0}: WIP on dev: 2c93d33 Done $ git stash pop On branch dev Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: SnowK.txt no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (122edfbb91bc4a378c38cb7b5bde9dcdf8a1cd61) $ cat SnowK.txt Hey I'm SnowK :P May be bug? dev: I'm codeing...
master
分支的bug修复后,修复后的代码在此时的dev
分支里是没有的
dev
里留存的是master
上一版的代码最终目的是要让master
合并dev
分支,正常情况下肯定是切回master
分支直接合并
master
上解决)master
上解决以上问题的⼀个好的建议:
最好先在⾃⼰的分⽀上合并下master
,再让master
去合并dev
这样做的⽬的是有冲突可以在本地分⽀解决并进⾏测试,⽽不影响master
feature
分支feature
分⽀feature
分支上开发了一半,被产品经理突然叫停,停止该新功能的开发
feature
分支就必须就地销毁,留着无用git branch -d branch_name
命令删除分支是行不通的
merge
到master
分支或者其他分支上merge
的分支git branch -D branch_name
$ git branch -d dev
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.
$ git branch -D dev
Deleted branch dev (was d009d1d).
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。