一、分支
#查看分支,输出master前带*
$ git log --oneline --graph
#建立分支
$ git branch 分支名(这里举例,分支名为dev)
#删除分支
$ git branch -d 分支名
# 查看当前分支,* 代表了当前的 HEAD 所在的分支
$ git branch
#把 HEAD 切换到dev 分支,此时dev前带*
$ git checkout dev
#直接创建和切换到新建的分支
$ git checkout -b dev
# "-am": add 所有改变 并直接 commit。***文件必须在git管理库中,新文件不能使用***
$ git commit -am "change 3 in dev"
# 切换至 master 才能把其他分支合并过来,****切换很重要****
$ git checkout master
# 将 dev merge 到 master 中,确定回到master上(查看:master上带信号)
$ git merge dev
#注意:直接 git merge dev,log 中也不会有分支的图案.采取 --no-ff 这种方式保留 merge 的 commit 信息.
$ git merge --no-ff -m "keep merge info" dev # 保留 merge 信息
#查看分支
$ git log --oneline --graph
二、merge 分支冲突
主分支和分支上都有改变,git 发现在 master 和 dev 上的版本是不同的, 所以提示 merge 有冲突. 具体的冲突, 打开 master上的文件就能看到。我们需要手动修改CONFLICT 的部分,然后commint.
$ git commit -am "solve conflict"
三、rebase 分支冲突
!!! 只能在自己的分支中使用 rebase, 和别人共享的部分是不能用 !!!, 如果用了, master 的历史会被 rebase 改变, master 当中别人提交的 内容就被无情地修改掉了。如果你不小心弄错了。 用在 reset 这一节 提到的 reflog 恢复原来的样子。
错误示范:rebase了主分支
$ git rebase dev #主分支基于dev分支进行修改
$ git add demo.txt
$ git rebase --continue
#再来看看 master 的 log:
$ git log --oneline --graph
# 输出
* c844cb1 change 4 in master # 这条 commit 原本的id=3d7796e, 所以 master 的历史被修改
* f7d2e3a change 3 in dev # rebase 过来的 dev commit
四、临时修改 (stash)
$ git checkout dev #假设现在在 dev 分支上改代码
$ git stash #将这些改变暂时放一边,没有提交
$ git checkout -b boss #建立另一个 branch 用来完成老板的任务
#提交任务到master
$ git commit -am "job from boss"
$ git checkout master
$ git merge --no-ff -m "merged boss job" boss #可能有冲突解决,因为boss分支是从dev分支中分出来的,手动在文件中将dev的部分删掉
#提交修改冲突后的文件,查看master的log
$ git commit -am "solve conflict"
$ git log --oneline --graph
#拿回缓存区的文件
$ git checkout dev
$ git branch -D boss #任务完成,可以删除boss分支
$ git stash list # 查看在 stash 中的缓存
$ git stash pop #拿回缓存区文件