首先有一个主分支master
创建一个dev分支。从现在开始,对工作区的修改和提交就是针对dev分支了。比如新的一次提交后,dev指针往前移动一步,而master指针不变。
当你在dev上的工作完成了,就可以把dev分支合并到master上,可以直接把master指向dev的当前提交,就完成了合并。合并完成后,甚至可以删除dev分支。
过程:
$git checkout -b dev
$git add a.file
$git commit -m "D"
$git checkout master
$git merge dev //用于合并指定分支到当前分支
$git branch -d dev //删除本地dev分支。
这里涉及到了合并模式:fast-forward:直接把master指向dev的当前提交,所以合并速度很快。但是删除分支后,会丢失分支信息。
git是鼓励大量使用分支的。
查看分支:git branch
创建分支:git branch <分支名>
切换分支:git checkout <分支名>
创建+切换分支:git checkout -b <分支名>
合并某分支到当前分支:git merge <分支名>
删除分支:git branch -d<分支名>
分支冲突:
在上述情况下,假设切换了分支后,master和dev分别各自有了新的提交,在这种情况下,git无法执行“快速合并”,并且可能会有冲突。这种情况下,就要解决冲突在合并。
–no-ff模式
合并分支时,加上上面参数就可以使用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
简单的说:就是–no-ff模式进行了一次新的git commit操作。
bug分支:
场景:软件开发中,bug需要修改。当你在dev分支进行的工作没有提交,但此时有个bug需要你处理时。 git stash命令可以解决这个问题。
他可以把当前工作现场保存起来,等以后恢复现场后继续工作。
假设现在有master dev分支,现在需要在master上修改bug
$git stash //保存现场
$git checkout master
$git checkout -b issue-1
$git add/ git commit
$git checkout master
$git merge -no-ff -m "merge bug fix issue-1"
$git branch -d issue-1
$git checkout dev //回到dev分支干活
$git status //此时会发现工作区是干净的
$git stash list//该命令可以查看被存起来的stash
此时,恢复有2个办法
1,
$git stash apply//恢复,但是不删除stash内容。你需要git stash drop删除
$git stash pop 恢复的同时把stash的内容也删了。
总结:修改bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,可以先git stash一下,然后去修改bug,修改后,在git stash pop回到现场工作。
多人协作
当你从远程仓库克隆时,实际上GIT自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库默认名称是origin。
要查看远程仓库的信息,用git remote,或者用git remote -v查看更详细的信息:
$git remote -v
origin url(fetch)
origin url(push)
上面显示了你可以抓取和推送的origin地址。如果没有推送权限,就看不到push的地址。
git remote shou <主机名> 可以查看该主机的详细信息。
git remote add <主机名> <网址> 用于添加远程主机。
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上:
gitpushoriginmaster如果要推送其它分支,比如dev
git push origin dev
但是,并不是一定要把本地分支往远程分支推送。
master分支是主分支,因此与远程同步
其它的可以看情况。总之,当你明白每条命令是干嘛的,你就不会犯错。 只要不犯错,其它的可以慢慢来。