Git 总结篇
Git有三大区(工作区、暂存区、版本库)以及几个状态(untracked、unstaged、uncommited)
创建版本库、绑定远程版本库
git init
首次使用可以进行全局设置:
git config --global user.name "用户名"
git config --global user.email "邮箱地址"
创建 git 仓库:
mkdir githubgitee
cd githubgitee
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:TangHanF/githubgitee.git
git push -u origin master
如果已经有了仓库,需要和远程仓库进行绑定,需要:
git remote add origin git@gitee.com:TangHanF/githubgitee.git
git push -u origin master
纳入版本库控制
在要纳入的目录下输入:
git init
进行初始化
添加要控制的文件,利用:git add [参数] 文件1 文件2 文件3 文件夹...,例如
git add readme.md libs/
如果有很多文件需要进行add,一个一个手动添加太麻烦 可以
git add .
然后提交即可:
git commit -m "提交说明信息"
创建公钥、私钥
开发者向码云版本库写入最常用到的协议是 SSH 协议,因为 SSH 协议使用公钥认证,可以实现无口令访问,而若使用 HTTPS 协议每次身份认证时都需要提供口令。使用 SSH 公钥认证,就涉及到公钥的管理。
1.如何生成ssh公钥
你可以按如下命令来生成sshkey:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key
查看你的 public key,并把他添加到码云(Gitee.com) SSH key添加地址
cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
添加后,在终端(Terminal)中输入
ssh -T git@git.oschina.net
若返回
Welcome to Git@OSC, yourname!
则证明添加成功。
2.怎么添加用户ssh key?
提交修改的文件
- 点击右上角的标志,进入个人中心,然后点击左侧的ssh公钥后在下图位置填写你的ssh公钥。
- 点击确定,然后验证密码(即你的注册账号密码)就完成了ssh公钥添加。
3.项目的 ssh key 和用户的 ssh key 两处地方有什么不同?
项目的 ssh key 只针对项目,且我们仅对项目提供了部署公钥,即
项目下的公钥仅能拉取项目
,这通常用于生产服务器拉取仓库的代码。 而用户的 key 则是针对用户的,用户添加了 key 就对用户名下的项目和用户参加了的项目具有权限,一般而言,用户的 key 具有推送和拉取的权限,而项目的 key 则只具有拉取权限
首先查看一下状态,使用:
git status
返回结果:
说明有一个文件更改了,然后加入到提交更改:
git add -u
然后再看一下状态:
git status
发现颜色变了,然后开始提交
git commit -m "修改说明"
get push
Git撤销修改等
git checkout .
#本地所有修改的。没有的提交的,都返回到原来的状态
git stash
#把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH
#返回到某个节点,不保留修改。
git reset --soft HASH
#返回到某个节点。保留修改
git rm --cached --force "文件名"
# 将添加到暂存区的文件删除
git 绑定GitHub和Gitee(码云)
github因为服务端在国外,从我们大天朝访问比较慢,真好我们本土有个gitee,访问速度没啥问题,现在需要将代码同步到这两个平台,如何做呢?
首先我们分别在两个平台新建一个远程仓库,名称都叫做“githubgitee”吧
在GitHub上创建一个repository
在码云上创建一个repository:
然后在本地磁盘创建一个本地库:
创建文件夹:I:\tmp\git
使用git初始化
git init
结果:
我们先将GitHub与本地仓库进行绑定
git remote add github https://github.com/TangHanF/githubgitee.git
注意:如果只绑定一个库的话,默认应该是:git remote add originhttps://github.com/TangHanF/githubgitee.git 我们为了区分起了一个别名而已
然后我们使用 git remote -v 命令查看一下绑定情况
此时GitHub绑定完毕,我们接着绑定码云:
git remote add gitee git@gitee.com:TangHanF/githubgitee.git
然后查看一下绑定情况:
到此为止,两个托管平台绑定完毕,我们先pull一下
# 从GitHub下载一份吧
git pull github master
下载完毕
我们新建一个测试文件 test1.txt 然后提交到两个平台
执行如下命令:
# 首先查看一下当前状态
git status
# 添加新建的文件
git add test.txt
# 提交到stage区
git commit -m "提交test.txt文件,测试演示"
# 提交到github的master主干
git push github master
# 提交到gitee的master主干
git push gitee master
git 删除远程库绑定
# 库名可以使用 git remote -v 查询
git remote remove 库名
git 查看某一版本提交的具体内容
# --name-only 只显示文件名
git log --name-only -1
# --pretty=format:"" 格式化commit message 这里什么都不显示
git log --pretty=format:"" -1
# 最终
git log --pretty=format:"" --name-only -1
可以参考:https://segmentfault.com/q/1010000006760132?_ea=1125366
git恢复删除的文件
git checkout 提交的记录ID 文件名称(路径)
例如:
git checkout dd1f0db src/main/java/com/gh/test/dao/CameraInfoManageDaoI.java
git 配置参数的别名
比如每次输入git status很麻烦,我们可以简化为git st,怎么操作?
git config --global alias.st status
即可
配置一个git last
,让其显示最后一次提交信息:
$ git config --global alias.last 'log -1'
这样,用git last
就能显示最近一次的提交:
$ git last
commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2
Merge: bd6ae48 291bea8
Author: Michael Liao <askxuefeng@gmail.com>
Date: Thu Aug 22 22:49:22 2013 +0800
merge & fix hello.py
可以再配置一个美化日志输出的
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"
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config
文件中:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
别名就在[alias]
后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中:
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
git 创建分支(branch)
用到的命令:
- git checkout -b <分支(创建分支 -b表示创建并切换,想到执行了git branch <分支名称>和git checkout <分支名称> 两条命令)
- git branch (查看分支,当前分支前面有个“*”进行标识)
- git checkout<分支名称> (切换分支)
- git mergee <分支名称> (合并分支)
- git branch -d <分支名称> (删除分支)
- git push <库名> 分支名 (将新建的分支同步到远程库)
- git push <库名> :分支名称 或 git branch -r -d <库名>/分支名称 (将删除的分支提交到远程库,与本地同步)
例如现在创建一个名称为 dev 的分支:
1、git checkout -b dev
2、查看一下分支情况,git branch
说明当前分支在 dev上
3、然后我们修改一下文件并提交
同步到远程库:git push gitee dev
远程库同步之前:
提交之后:
现在我们在dev分支下修改一下内容提交:
分支合并
提交之后只有dev的文件变动了,master相同文件内容没有改变,现在我们合并分支,将dev与master进行合并:首先切换到master分支,然后git merge dev
提交,同步到远程库:
这样的话我们就可以大胆的删除dev分支了
然后同步到远程库:
git 创建标签
为什么要创建标签?首先,我们知道,git的版本号和svn的版本号不一样,svn的版本号是一次递增的数字,很好记忆,但是git的版本号是一个很长的ID,在svn我们一般说把版本23的打包一下,很自然,但是在git上我们说把版本2de3dffd3342add...的打包一下,是不是感觉很别扭。为了好区分,在git上我们可以使用tag,相当于一个快照,实际上是指向某个commit的指针,有点类似分支,但是和分支又有不同,分支可以移动,标签不能移动。
相关命令:
- 命令
git tag <name>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; git tag -a <tagname> -m "标签信息的描述文字"
可以指定标签信息;git tag -s <tagname> -m "标签信息的描述文字"
可以用PGP签名标签;git tag -d
可以删除tag标签 命令
git tag
可以查看所有标签。命令
git push <库名称> <标签名称>
可以将标签同步到远程库。命令 git push <库名称> --tags
可以
一次性推送全部尚未推送到远程的本地标签
创建tag
首先创建一个tag,名称:v0.5 注意要先切换到要打tag的分支上
git tag v0.5
然后查看一下tag:
git tag
如果说我们还有一个v0.3需要打tag,但是现在错过了打tag的时间要求,现在要新增这么一个tag怎么处理,命令格式:
git tag <tag名称> <版本号>
首先先查看一下历史,git lg是简化的自定义的
例如我们把 3a3cfb5 - 新增src 打一个v0.3的tag:
git tag v0.3 3a3cfb5
这样就新增了一个v0.3的tag
查看标签信息
可以使用 git show
当然了,还可以创建带有描述信息的标签,格式:git tag -a
-a:指定标签名
-m:标签描述信息
最后我们将标签同步到远程库:
删除tag标签
将删除的tag同步到远程
这个操作相对比较麻烦,需要执行:git push <库名> :refs/tags/
git log 美化
但最有意思的是 format
,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
表 2-1 列出了常用的格式占位符写法及其代表的意义。
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
问题解决类
解决Git Bash中文乱码问题
中文出现形如:\123\213\234\212\212,输入以下命令:
git config --global core.quotepath false