[关闭]
@FunC 2017-08-10T00:55:37.000000Z 字数 2475 阅读 2020

git笔记

版本管理


概览:git能做的:时光机(历史版本、未来版本)、撤销修改(缓存区、工作区)、git分支记录、保留现场

基本概念

工作区

就是普通的文件目录

版本库(Respository)

即工作区下的隐藏目录.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模式,留下分支信息,能看出合并过

多人协作

  1. clone后默认只可见master
  2. 尝试git push origin brach-name
  3. 失败则git pull
  4. git pull需要本地分支与远程分支对应,git checkout -b branch-name origin/brach-name
  5. 建立关联git branch --set-upstream branch-name origin/branch-name
  6. 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. 1 $ git stash
  2. 2 $ git checkout master
  3. $ git checkout -b issue-101
  4. //去文件里修bug
  5. $ git add README.md
  6. $ git commit -m "fix-issue-101"
  7. 3 $ git checkout master
  8. $ git merge --no-ff -m "m-merge-issue-101" issue-101
  9. $ git branch -d issue-101
  10. 4 $ git checkout dev
  11. $ git merge --no-ff -m "dev-merge-m" master
  12. 5 $ git stash pop
  13. //提示冲突,去文件手动改正
  14. Auto-merging README.md
  15. CONFLICT (content): Merge conflict in README.md
  16. 6 //继续开发 ... ... ,完成后一并提交
  17. $ git add README.md
  18. $ git commit -m "fixconflict & append something"
  19. 7 $ git checkout master
  20. $ git merge --no-ff -m "m-merge-dev" dev
  21. $ git branch -d dev

rebase(修改分支痕迹,别人有copy时不易使用): 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。

尽量使用fetch+merge而不是pull:
1. 能知道拉下来了什么内容,再进行合并
2. fetch的内容放在了.git/FETCH_HEAD中

git diff [commitId]^ [commitId]

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注