Git手册
记录一些常用的Git命令方便使用时查询,以及简单交代对应的原理,便于操作时理解实际意义。
本地
创建并切换到新分支newBranchName
git checkout -b bugFix
git branch bugFix
git checkout bugFix
使用指定分支创建分支,并切换
git checkout -b special master
提交版本
git commit
假设在master上要合并回bugFix的提交版本
git merge bugFix
与上一个指令同等效果,分支结构会更清晰的变基(在bugFix上进行,但因安全性和可跟踪性问题而建议少用。指令可以解读为“变基到xx分支上“,后可带一个可选参数,表示使用哪个分支进行变基)
git rebase master
查看当前HEAD指向的引用,一般的指向是HEAD->master->versionHash
git symbolic-ref HEAD
查看提交记录的哈希值
git log
相对引用切换,切换到master的上一次(如果上一次有两个父节点,可添加数字指定)和前3次的提交记录,或指定hash(支持只输入前4位),还可以链式操作
git checkout master^
git checkout master~3
git checkout f2e1
git checkout HEAD~^2~2
强制变更分支指向的提交(相对引用方式)
git branch -f master HEAD~3
回退版本,改写本地历史
git reset HEAD~1
撤销远端的更改,还原版本
git revert HEAD
复制版本,控制顺序
git cherry-pick C2 C4
交互式的rebase,在不清楚版本hash时又想用cherry-pick按顺序复制版本时使用(会在vi编辑文件下配置要复制的版本的顺序,利用参数–interactive或-i)
git rebase -i branch/HEAD~4
若漏掉了文件没有加,或者提交信息写错了,想要撤消刚才的提交操作,可以使用 –amend 选项重新提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明
git commit --amend
永久指向提交版本的Tag
git tag tagV1 verC1
查找最近的标签,输出样式,<tag>_<numCommits>_g<hash>
(hash是下面ref的哈希值)
git describe <ref>
强制变更分支指向
git branch -f feature C2
远程
克隆本地路径时是真正的拷贝,克隆远端时是复制远端的版本到本地形成关联。而且克隆后,本地会自动将远端分支命名为origin/master,origin是远端仓库的默认名称,所以本地的master分支并不是项目的真正master分支,若尝试手动切换到origin/master,只会产生与其相同引用的分离HEAD状态,因为Git不允许直接在远端项目上操作。
git clone git_url
从远程仓库获取数据(下载缺失的提交记录,并更新本地的远程分支指针。但不会改动本地仓库的状态,因为怕你还没完成本地的版本)
git fetch
git fetch origin foo
抓取远程仓库的更新并合并到本地分支新建一个版本提交记录(=fetch + merge)。如果不想用合并的方式,可以在后面加上参数–rebase,将本地当前的提交记录变基到远端的偏离历史的提交记录上,这样的提交轨迹线会相对清晰。
git pull
git pull --rebase
将本地变更上传到指定的远程仓库。若使用指定source和destination的方式时 (比较少用到),需要遵循下面的格式,使用冒号分隔,destination是指需更新的远端分支名称,但不需加origin/前缀标识,而原来已经在跟踪该远端的同名本地分支不会有所变动,source则可以是任何一个提交记录。
git push
git push <remote> <place>
git push origin master
git push origin <source>:<destination>
追踪远程分支(下面指令意思是创建分支foo,并通过参数-u设置跟踪origin/master,如果当前就在foo上还可以省略掉foo)
git branch -u origin/master foo
删除远端分支;创建本地分支。
git push origin :foo
git fetch origin :bar
列出远程主机 (如 origin)
git remote
git remote -v
关联远程分支(默认master)
git remote add origin url.git
等等
Fork
Github或一些git管理工具,远程仓库是不允许代码贡献者直接push的(作者自己的本地则没有限制),而是发起一个pull request,让项目作者自己fetch&merge/pull贡献者代码(像是反过来一样,要合并外部的代码时,外部的代码视作一个远端仓库,而它则是贡献者在开发前期进行fork所创建,fork类似clone)。
关于 rebase 的优缺点
优点:Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
缺点:Rebase 修改了提交树的历史(比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。)
如果喜欢保留提交历史,可以选用merge代替。
其它一些pull的使用例子
(复杂版的fetch + merge)
git pull origin foo = git fetch origin foo; git merge o/foo
git pull origin bar~1:bugFix = git fetch origin bar~1:bugFix; git merge bugFix
永久记住密码+查询用户信息
git config --global credential.helper store
git config user.name
git config user.email
删除密码,只要在仓库的.git/config文件中删除[credential] helper = store
这行内容即可,这样每次对git源提交记录版本时都需要输入密码。修改密码则是先删除该项,然后操作一次git源,再补回该项,这样下次输的新密码就被记录起来了。
sparse checkout(稀疏检出)
$ git init <project>
$ cd <project>
$ git remote add origin ssh://<user>@<repository's url>
$ git config core.sparsecheckout true
$ echo "path1/" >> .git/info/sparse-checkout
$ echo "path2/" >> .git/info/sparse-checkout
$ git pull origin master
修改了 .git/info/sparse-checkout,增加或删除部分目录后,则
$ git checkout master
# 或者
$ git read-tree -mu HEAD
sparse-checkout
可使用通配符,如
包含法:
docs/
index.
*.gif
排除法:
/*
!/docs/
角色权限
Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
- Guest:可以创建issue、发表评论,不能读写版本库
- Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
- Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限
- Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限
Gitlab中的组和项目有三种访问权限:Private、Internal、Public
Private:只有组成员才能看到
Internal:只要登录的用户就能看到
Public:所有人都能看到
开源项目和组设置的是Internal
Ref
感谢这个Git实操练习网站
还有一峰大的Git远程操作详解
Git Book
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com
文章标题:Git手册
文章字数:1.8k
本文作者:Mingfung
发布时间:2019-01-28, 21:35:00
最后更新:2019-11-29, 22:26:52
原始链接:http://blog.ifungfay.com/工具/Git手册/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。