@FunC
2017-08-10T08:55:37.000000Z
字数 2475
阅读 2205
版本管理
概览:git能做的:时光机(历史版本、未来版本)、撤销修改(缓存区、工作区)、git分支记录、保留现场
就是普通的文件目录
即工作区下的隐藏目录.git
(不属于工作区)
里面有:
- stage(暂存区)
- HEAD(指向当前版本)
- master...(分支)
git add
添加进缓存区
git commit
从缓存区提交上分支
切换分支本质: 更改HEAD指针指向
git status
git add
git commit
git diff
: 比较差异
git log
: 从近到远打印提交日志,含id
git log --graph
分支合并图
git log --pretty=oneline
: 只含commit id 和commit message
git reset --hard commit_id
: 历史版本穿梭
其中commit_id可以是id,也可以是HEAD
(当前版本),HEAD^
(当前版本的上一个版本),HEAD~100
(上100个版本)
git reflog
: 命令历史(能够回来未来版本)
以下命令git status会提示
git checkout -- file
丢弃工作区修改(实质是用版本库的版本替换工作区版本)
git reset HEAD file
丢弃暂存区内容
git rm
从版本库里删除文件(同时删除工作区的)
但是只要commit过就能恢复
git tag
查看标签
git tag <tagName> [commit_id]
创建本地标签(加上-d
删除)
git tag -a <tagname> -m "blablabla..."
创建标签并附上信息
git push origin <tagname>
推送一个本地标签(改用--tags
则推送全部未推送过的本地标签)
git check-ignore
检查.gitignore
规则
git remote add origin master [url]
其中,origin是给远程库的自定义名称,master是远程库对应的分支
git push -u origin master
首次push上远程库,-u
是关联远程和本地的文件
git branch
查看分支
git branch <name>
新建名为name的分支
git checkout <name>
切换至分支name
git checkout -b <name>
创建并切换至name分支
git branch -d <name>
删除分支
git branch -D <name>
强制删除未提交过的分支
git merge <name>
将name分支与当前分支合并(默认使用fast forward
模式,当提交分支领先于被合并分支时且不落后时,会丢弃分支信息,看不出合并过(直接移动HEAD指针到头部))
git merge --no-ff -m 'commit_msg' <name>
不使用fast forward模式,留下分支信息,能看出合并过
git push origin brach-name
git pull
git pull
需要本地分支与远程分支对应,git checkout -b branch-name origin/brach-name
git branch --set-upstream branch-name origin/branch-name
git pull
,并解决冲突git stash
保留当前工作区信息
git stash apply
恢复stash
git stash pop
恢复并删除该stash
git stash drop
删除stash
e.g:在dev分支开发时需切换到master修改bug
概览:master合并merge解决好的bug后,不要先把dev解印,先合并master,获取里面的bug方案后,在解印。解印时会有提示冲突,需手动改一次文件。
1:在 dev 下正常开发中,说有1个bug要解决,首先我需要把dev分支封存stash
2:在master下新建一个issue-101分支,解决bug,成功后
3:在master下合并issue-101
4:在 dev 下合并master, 这样才同步了里面的bug解决方案
5:解开dev封印stash pop,系统自动合并 & 提示有冲突,因为封存前dev写了东西,此时去文件里手动改冲突
6:继续开发dev,最后add,commit
7:在master下合并最后完成的dev
代码过程如下:
1: $ git stash
2: $ git checkout master
$ git checkout -b issue-101
//去文件里修bug
$ git add README.md
$ git commit -m "fix-issue-101"
3: $ git checkout master
$ git merge --no-ff -m "m-merge-issue-101" issue-101
$ git branch -d issue-101
4: $ git checkout dev
$ git merge --no-ff -m "dev-merge-m" master
5: $ git stash pop
//提示冲突,去文件手动改正
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
6: //继续开发 ... ... ,完成后一并提交
$ git add README.md
$ git commit -m "fixconflict & append something"
7: $ git checkout master
$ git merge --no-ff -m "m-merge-dev" dev
$ git branch -d dev
rebase(修改分支痕迹,别人有copy时不易使用): 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
尽量使用fetch+merge而不是pull:
1. 能知道拉下来了什么内容,再进行合并
2. fetch的内容放在了.git/FETCH_HEAD中
git diff [commitId]^ [commitId]