确认当前所在分支
进行分支操作前,请先确认当前工作分支,避免出现误操作。
- 使用 git branch 命令,见下文
- souretree 左侧边栏 BRANCHES 下,加粗的是当前分支
rebase 与 merge
- merge 是直接将两个分支汇合。
- rebase 是将当前分支在要合并的分支上重新演化。工作流程如下:
- 先找到当前分支与要合并分支的分叉点
- 对分叉点后的每个提交,计算它与前一点的差异代码, 在要合并分支上应用并提交(这一步有可能产生冲突)
- 删除当前分支的到分叉点的所有记录
- 将当前分支指针指向第2步得到的演化结果
合并前的状态
git merge origin/master
git rebase origin/master。算出 b1 到 a1的 差异代码,应用到 a2 上,master 指针指向新的 b1,删除旧的 b1。
远程分支
$ git pull
如果设置了某个分支用于跟踪某个远程仓库的分支,此命令可拉取数据,并自动合并对应分支。
默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支
使用git pull 时,请加上 –rebase,保持线性历史记录
pull 前的状态
git pull 等价于 git merge origin/master,执行后产生了分叉
git pull –rebase,等价于 git rebase origin/master,前当前所有提交记录在 origin/master 上重演,保持线性历史。
$ git fetch [remote-name]
从远程仓库抓取数据到本地。不指定远程仓库名时默认为origin。此命令仅拉取数据,并不自动合并。
$ git push [remote-name] [branch-name]
将本地分支推送到远程仓库。
如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。
$ git push origin serverfix
推送本地serverfix分支到远程仓库origin的serverfix分支。
$ git push origin serverfix:awesomebranch
推送本地serverfix分支到远程仓库origin的awesomebranch。
$ git push origin :serverfix
删除远程仓库serverfix分支。
$ git branch
列出所有分支。* 所指的是 HEAD 所指向的分支,即当前工作分支。
$ git checkout -b serverfix origin/serverfix
根据远程仓库origin的serverfix分支新建本地serverfix分支。
$ git checkout --track origin/serverfix
效果同上。
$ git branch testing
在当前 commit 对象上新建一个分支指针。仅建立分支,但不切换。
HEAD指针总是指向当前正在工作的分支。
$ git checkout testing
切换到testing分支。
$ git checkout -b iss53
新建iss53分支,并切换到此分支,相当于:
$ git branch iss53
$ git checkout iss53
$ git branch -d hotfix
删除hotfix分支。-D为强制删除。
Git使用流程建议
Git 新建、切换分支速度很快,可以同时建多个分支进行不同功能的开发,调试。
何时使用 rebase 何时使用 merge?
- git pull 使用–rebase。本地分支操作用 merge。当master上有很多 commit 时,rebase 冲突的概率会很大,应当避免这种情况。这种情况更合理的做法是切换到一个新的分支,在新的分支开发。
- 使用 sourcetree 进行本地分支的 merge 时,不要选择 Rebase instead of merge (最后一项)
什么时候需要新建分支?
- 需要多次提交时,或者改动较多时,新建分支开发。
- 简单的 Bug 修复,或者只需要一两次提交小功能点,可以直接在本地的主干上开发。
同步流程
- 本地没有更新时,直接 git pull –rebase 即可与远程分支同步。
- 在本地主干上开发,commit 到本地后,git pull –rebase 与远程分支同步,最后 push。
- 在新分支上开发结束,要提交到远程分支时,先将 master 同步到最新,再将新分支 merge 到 master,最后 push。
- 在新建的分支开发,需要与最新代码同步时,可以git merge origin/master。这种情况会造成较混乱提交历史记录,少用。