在git库中有一个index(stage)的区域称之为 缓存区 ,有一个指针为HEAD,
每次创建一个分支就相当于创建了一个指针,该指针指向这次提交,然后HEAD指向分支指针
例如 创建分支 dev 相当于创建了一个 dev指针指向了这次的提交点,然后将HEAD指针指向dev指针
git基本操作
git config —global user.name '':设置git全局用户名
git config —global userl.email '':设置git全局email
git init :目录变成Git可以管理的仓库:
git add file :将工作区修改的文件添加到缓存区
git add . :将工作区修改的所有文件添加到缓存区
git commit -m ‘xxx’:将缓存区的内容提交到head中
git status :查看工作区文件状态
代码回滚
- 向前回滚
git log :查看所有的提交日志
git log —pretty=oneline:所有的提交日志按照一行的形式展示
git reset —hard HEAD^:将版本库回滚到上一次提交的点
git reset —hard HEAD^^:将版本库回滚到上上一次提交的点
git reset —hard commit_id:将版本库回滚到某一次提交的点
向前回滚之后git log不会再看到当前版本之后的信息
- 向后回滚
--- 向前回滚之后又想回到后面的版本
git reflog:查看所有提交到HEAD的commit_id
git reset —hard commit_id:回滚到任意版本的版本库
文件比较
git diff :比较工作区域和缓存区的区别
git diff —cached:比较缓存区和HEAD的区别
git diff HEAD:比较工作区和HEAD的区别
放弃修改:
- 放弃工作区的修改(没有add和commit)
git checkout — file:放弃工作区file的修改
git checkout .:放弃工作区所有修改
-
已经add,将修改添加到缓存区
放弃缓存区的修改文件
git reset HEAD file:放弃缓存区文件file的修改
放弃工作区文件的修改
git checkout — file:放弃工作区文件file的修改
已经add到缓存区,并且已经commit到HEAD中
使用版本回去的方式修改
git log
git reset —hard commit_id
- 删除文件
当在工作区添加一个文件,通过add+commit之后把文件添加到HEAD中
-
需要删除工作区文件和HEAD的文件
删除工作区文件
rm file
删除HEAD文件
git rm file(此时git rm file 相当于执行了 git add . 操作)
git commit -m 'xxx'
误操作需要恢复工作区删除的文件
git checkout — file
远程分支
- 基本操作
git remote:查看远程仓库名称
git remote -v:查看远程仓库详细信息
git remote add origin git@github.com/xxx:关联远程仓库
git push -u origin master:将本地分支推送到远程仓库 -u代表将本地分支关联到远程分支
git remote set-url origin git@example.com:xxx/xxx.git 修改远程仓库
- 本地创建分支同时切换到创建分支
git checkout -b local_branch:创建本地分支并且切换到创建的分支
git checkout -b local_branch origin/remote_branch:创建本地分支关联远程已经存在的分支(远程分支已经存在)
git push -u origin local_branch:推送当前分支到远程分支(远程分支跟本地分支名称相同,-u表示同时建立关联,只有第一次提供分支的时候才会加-u,一旦建立关联之后提交都不用加-u)
git branch —set-upstream-to=origin/<remote_branch> local_branch:本地分支跟远程分支建立关联(本地分支和远程分支都存在但是没有建立关联时可以使用,比如第一次推送本地分支到远程仓库的时候没有加-u之后把本地分支推送到远程仓库,但是并没有建立关联)
git branch —set-upstream local_branch origin/<remote_branch> :本地分支跟远程分支建立关联(本地分支和远程分支都存在)
git pull :拉取远程分支的代码到本地对应的分支(如果提示 “no tracking information”则需要建立本地分支与远程分支的关联)
git push origin local_branch:推送本地分支到对应的远程分支(如果本地分支已经跟远程分支建立关联可以直接使用 git push)
- 删除分支git
git branch -d the_branch:删除本地分支the_branch
git branch -D the_branch:强行删除本地分支the_branch(当从某一个分支创建一个新分支之后,如果新的分支没有merge到派生的分支时是不允许删除的)
git branch push origin :the_branch:删除远程分支the_branch(注意origin之后有空格)
git push origin --delete <BranchName>
- 合并分支
git merge name:合并name分支到当前分支
关于git merge:git merge name 之后 实际是将当前分支的指针指向了name分支(Fast-forward模式),然后HEAD再指向当前分支
使用Fast-forward模式时是没有merge信息的,在查看log时没有merge信息,所有尽量避免使用这种模式合并
git merge —no-ff -m ‘xxx’ name:使用普通模式合并分支顺便带上合并信息
git log —graph :查看分支合并图
git stash:将当前工作’现场’存储起来,等以后恢复现场后继续工作
使用场景:在自己分支工作,工作只做到一半,但是在短时间内无法完成任务,此时有bug需要立刻修复,此时就可以使用该命令暂时将当前工作存储起来去修复bug了,等bug修复完成之后回到该分支恢复工作现场
- 恢复stash有两种方式:
git stash list:首先查看所有的stash:
-
恢复stash方式一
git stash apply stash_id:恢复stash
git stash drop stash_id:删除stash内容
-
恢复stash方式二
git stash pop:恢复stash同时删除了stash内容
分支管理策略:
master:(主分支)也是稳定分支;所有的发布版本都是从master分支发布
dev:(开发分支)在多人协作开发的时候开发分支是一个不稳定分支,每一个开发人员都有自己的开发分支,平时个人都是在自己的开发分支开发功能,然后等功能开发完毕了合并到dev分支;当所有的功能都开发完了再把dev分支合并到master分支
bug:(零时修复bug分支)当在某一个分支有bug的时候在有bug的分支创建一个bug的零时分支(一般命名为issue_001),等bug修复结束之后合并到有bug的分支,然后删除掉这个零时分支issue_001
feature:(新功能分支)当需要开发一个新功能时,在dev分支新建一个分支(feature-volue),等新功能开发完毕之后将新功能分支合并到dev分支,然后删除feature-volue
注意:远程分支一般只有master和dev还有一些个人分支,bug分支只是在本地的零时分支,等bug修复完merge到相应的分支就可以,feature分支看情况,如果是合作开发功能的话可以推到远程分支
- git中的标签就是一个让人容易记住的有意义的名字,它跟某个commit绑定在一起的
git tag tag_name :打标签(默认标签是打在最新提交的commit_id上的)
git tag tag_name commit_id:在指定的commit上打一个标签
git tag <-a> tag_name -m ‘xxxx’ commit_id:创建带有说明的标签-a(可以省略):指定标签名 -m:指定说明文字
git tag :显示所有标签
git show tag_name :查看标签信息
git push origin tag_name:推送一个本地分支到远程(打标签默认只是在本地存在,需要推送到远程)
git push origin —tags:推送全部未推送的本地标签
git tag -d tag_name:删除本地标签
git push origin :refs/tags/tag_name:删除远程标签
.gitignore 文件:
git add -f file:
git check-ignore -v file:
- git 清除分支缓存
git remote prune origin
git fetch -p(效果更好)
- git清除缓存(针对.gitignore不能忽略问题)
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git可能会遇到的问题
git pull origin master --allow-unrelated-histories
2020年11月13日更新
git统计
- 统计git提交次数: 所有人的所有提交次数,会展示所有的提交人 提交次数详情
git log | grep "^Author: " | awk '{print $2}' | sort | uniq -c | sort -k1,1nr
- 统计时间内提交次数
git log --author=yourname --since="2017-08-01" --no-merges | grep -e 'commit [a-zA-Z0-9]*' | wc -l
- 统计提交行数:根据1展示出详情,可以填入username。将展示该用户增加行数,删减行数,剩余行数。
git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -