[cs] git
git
初始化设置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
在单独仓库账户不同时,应该单独设置
$ git config --local user.name "Your Name"
$ git config --local user.email "email@example.com"
全局配置
加上--global是针对当前用户起作用的,不加只针对当前的仓库起作用。
配置写在.git/config文件中(一般在用户文件里)。
$ git config --global
$ git config --global color.ui true #颜色
# 命令别名
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1'
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" #这个超胖的
查看配置
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global --list
#查看当前仓库配置信息
git config --local --list
创建仓库
创建Git版本库时,Git自动创建唯一一个master分支,默认情况下git commit
就是往master分支上提交更改。
$ git init
添加文件进仓库
//Unix的哲学是“没有消息就是好消息”,说明添加成功。
实际上就是把文件修改添加到暂存区。
git add <file>
$ git add readme.txt
提交文件到仓库
-m
后面输入的是本次提交的说明。
实际上就是把暂存区的所有内容提交到当前分支。
#commit之前add的文件(包括多次add的)
$ git commit -m "wrote a readme file"
#commit指定的文件
$ git commit <file> -m "wrote a readme file"
#绕过hook的检验
$ git commit --no-verify
查看仓库当前的状态
$ git status
查看difference
$ git diff
#查看工作区和版本库里面最新版本的区别
$ git diff HEAD -- readme.txt
查看提交日志
最近到最远
$ git log
$查看分支合并图
git log --graph
前面的是commit id
$ git log --pretty=oneline
b4b35dfff84fd9b3d79fe50f14d765db090d23f7 222222222222
2f39faf4dbaa37c21cb907f37ca90f787726f0ca 11111111111
e68636ba7d5fa96993725f3bda5f68dae7b620fa change 1
5b0ba7a76eaf8ef867cb2fb5711232069bace743 wrote a readme file
回滚版本
HEAD表示当前版本,
上一个版本就是HEAD^,
上上一个版本就是HEAD^^,
往上100个版本HEAD~100。
$ git reset --hard commit_id
# 回滚到上个版本
$ git reset --hard HEAD^
# 回滚到远程仓库dev分支的版本
$ git reset --hard origin/dev
每一次操作的记录
主要用于找commit id
$ git reflog
丢弃工作区的修改
恢复本地删除的文件
git checkout -- file
$ git checkout -- readme.txt
把暂存区的修改撤销掉(unstage)
git reset HEAD file
$ git reset HEAD readme.txt
#撤销某个远程提交
$ git reset --hard origin/dev
图
删除文件
执行后需要commit
$ git rm test.txt
创建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
把邮件地址换成自己的邮件地址,然后一路回车,使用默认值即可,可以不设置密码。
然后可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,id_rsa.pub是公钥。
Add SSH Key就是增加id_rsa.pub文件的内容(公钥)。
查看SSH Key
cd ~/.ssh
cat id_rsa.pub
enable ssh key
eval "$(ssh-agent -s)"
add ssh key
ssh-add ~/.ssh/id_rsa
关联远程库
先有本地库然后关联远程库
git remote add origin git@server-name:path/repo-name.git
$ git remote add origin git@github.com:qingmingsang/learngit.git
远程库的名字是origin,这是Git默认的叫法.
推送修改至远程库
#第一次推送master分支的所有内容,需要用-u命令
$ git push -u origin master
#推送最新修改至master(主)分支
$ git push origin master
推送分支到远程库
$ git push origin dev
一般来说有四种分支
master分支、dev分支、bug分支、feature分支
克隆远程库
本地没有库,从远程克隆内容到本地库。
$ git clone git@github.com:qingmingsang/learngit.git
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
克隆远程库分支
$ git checkout -b dev origin/dev
创建分支
# 创建分支
git branch <name>
# -b参数表示创建并切换
$ git checkout -b dev
#上面一条相当于以下两条命令
$ git branch dev
$ git checkout dev
查看分支
git branch命令会列出所有分支,当前分支前面会标一个*号
$ git branch
切换分支
$ git checkout master
合并分支
合并指定分支到当前分支
git merge <name>
$ git merge dev
删除分支
删除一个已被终止的分支
如果需要删除的分支不是当前正在打开的分支,使用branch -d直接删除
git branch -d <name>
$ git branch -d dev
删除一个正打开的分支
如果试图删除一个分支时自己还没转移到另外的分支上,Git就会给出一个警告,并拒绝该删除操作。
如果坚持要删除该分支的话,就需要在命令中使用-D
选项。
git branch -D <name>
恢复被删除的分支
先通过git reflog
获取所有commit
git branch <branch_name> <hash_val>
$ git branch dev HEAD@{4}
解决分支合并冲突
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容.
一般没有冲突会进入 Fast-forward “快进模式”,
但这种模式下,删除分支后,会丢掉分支信息。
提交也没有分支提交信息。。。
禁用Fast forward,并产生一次commit
$ git merge --no-ff -m "merge with no-ff" dev
“储藏”工作现场
用于紧急切换到别的分支工作
$ git stash
# 查看储藏了的工作
$ git stash list
#恢复指定工作现场(这种方式不会把工作现场删除)
$ git stash apply stash@{0}
#删除指定工作现场
$ git stash drop
#恢复并删除指定工作现场
$ git stash pop
查看远程库信息
$ git remote
#更详细
$ git remote -v
fetch 代表抓取权限
push 代表推送权限
拉取远程更新
$ git pull
如果提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name origin/branch-name
$ git branch --set-upstream dev origin/dev
#建立本地分支和远程分支的关联
标签
创建标签
git tag <name>
$ git tag v1.0
给指定commit id创建tag
git tag <name> <commit id>
$ git tag v1.0 6224937
创建带有说明的标签
用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 3628164
可以通过-s用私钥签名一个标签
签名采用PGP签名,必须先安装gpg(GnuPG)
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a
查看所有标签
git tag
查看标签信息
git show <tagname>
删除标签
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
$ git tag -d v0.1
推送某个标签到远程
git push origin <tagname>
$ git push origin v1.0
一次性推送全部尚未推送到远程的本地标签
$ git push origin --tags
删除远程
#先从本地删除
$ git tag -d v0.9
#再从远程删除。删除命令也是push
$ git push origin :refs/tags/v0.9
.gitignore
A collection of .gitignore templates
# 可以使用shell所使用的正则表达式来进行模式匹配
?:代表任意的一个字符
*:代表任意数目的字符
{!ab}:必须不是此类型
{ab,bb,cx}:代表ab,bb,cx中任一类型即可
[abc]:代表a,b,c中任一字符即可
[ ^abc]:代表必须不是a,b,c中任一字符
# 以'#'开始的行,被视为注释.
# 忽略掉所有文件名是 foo.txt的文件.
foo.txt
# 忽略所有生成的 html文件,
*.html
# foo.html是手工维护的,所以例外.
!foo.html
# 忽略所有.o和 .a文件.
*.[oa]
# 匹配模式最后跟"/"说明要忽略的是目录
/tmp
# 忽略tmp文件夹所有文件
tmp/*
# 忽略所有tmp文件夹
tmp
忽略.gitignore强制添加
$ git add -f App.class
检查.gitignore规则
$ git check-ignore -v App.class