晴明的博客园 GitHub      CodePen      CodeWars     

[cs] git

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
posted @ 2017-02-21 00:23  晴明桑  阅读(219)  评论(0编辑  收藏  举报