Git学习04-----廖雪峰课程

Git学习03—分支管理

创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支.

创建与合并分支
  1. 创建分支:git branch name
  2. 切换分支:
    git checkout name
    git switch name
  3. 创建分支加切换分支:
    git checkout -b name
    git switch -c name
  4. 查看分支:git branch
  5. 合并某分支到当前分支:git merge name
  6. 删除分支:git branch -d
解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交,合并完成。
用git log --graph命令可以看到分支合并图:

$ git log --graph --pretty=oneline --abbrev-commit
分支管理策略
  1. 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
  1. 在实际开发中,我们应该按照几个基本原则进行分支管理:
    首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
    其次,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    所以,大家每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
Bug分支
  1. 当手头工作没有完成时,Git提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
  1. 然后去修复bug,首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master分支创建新的bug分支进行修复,然后合并,最后删除;
$ git checkout master

$ git checkout -b issue-101
Switched to a new branch 'issue-101'


$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 5 commits.
  (use "git push" to publish your local commits)
$ git merge issue-101
Updating 5e60244..51a3d2e
Fast-forward
 readme.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-101
  1. 修复后,接着回到dev分支干活了!刚才的工作现场存到哪去了?用git stash list命令看看,回到工作现场:
$ git checkout dev
Previous HEAD position was 51a3d2e bug
Switched to branch 'dev'
$ git status
On branch dev
nothing to commit, working tree clean
$ git stash list
stash@{0}: WIP on dev: 5e60244 conflict fixed

  1. Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
    一是用 git stash apply 恢复,但是恢复后,stash内容并不删除,你需要用 git stash drop 来删除;
    另一种方式是用 git stash pop ,恢复的同时把stash内容也删了:
  2. 当有多个的工作现场被储存时,可以恢复指定的stash,用命令:$ git stash apply stash@{0}
  3. 在master分支上修复的bug,想要合并到当前dev分支,可以用 git cherry-pick commit_id 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
$ git branch
* dev
  master
$ git cherry-pick 4c805e2

$ git stash apply stash@{0}
Feature分支
  1. 每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
  1. 如果要丢弃一个没有被合并过的分支,可以通过git branch -D name 强行删除。
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).
多人协作

查看远程库的信息

$ git remote
origin

$ git remote -v
origin  git@github.com:xiaoxiaomingjie/learngit.git (fetch)
origin  git@github.com:xiaoxiaomingjie/learngit.git (push)
  1. 推送分支:就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支。
$ git push origin master

$ git push origin dev

注意:

  • master分支是主分支,因此要时刻与远程同步;
  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
  1. 抓取分支:用git pull把最新的提交从origin/dev抓下来。
    创建远程origin的dev分支到本地: $ git checkout -b dev origin/dev
多人协作的工作模式:
  1. 试图用 git push origin branch-name推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
$ git push origin dev
To github.com:michaelliao/learngit.git
 ! [rejected]        dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> dev
  1. 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to branch-name origin/branch-name。
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
  1. 如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
Automatic merge failed; fix conflicts and then commit the result.
$ git commit -m "fix env conflict"
[dev 57c53ab] fix env conflict

$ git push origin dev
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
   7a5e5dd..57c53ab  dev -> dev
Rebase

rebase操作可以把本地未push的分叉提交历史整理成直线。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值