004[补] git使用指南
git简介
git与svn
svn

git

- svn是集中式,git是分布式
- svn是记录的文件,git记录的是行
预备知识
协议
git clone git@github.com:h2o1k/gitskills.git ssh协议,速度快
git clone https://github.com/h2o1k/gitskills.git https协议
Linux下生成ssh-keygen
ssh-keygen -t rsa -C "clzbgl@gmail.com"
cat ~/.ssh/id_rsa.pub
~/.ssh/id_rsa 这是私钥
~/.ssh/id_rea.pub 这是公钥
验证
ssh -T git@git.oschina.net
Windows下生成ssh-keygen
1.安装Git
2.打开Git Bash
3.输入 ssh-keygen -t rsa -C "clzbgl@gmail.com"
安装
CentOS
yum install git -y
配置
查看配置
git config --list
全局配置
# 全局配置加--global参数
git config --global user.name "clzbgl"
git config --global user.email "clzbgl@gmail.com"
为每个仓库配置命令
git config user.name "yysue"
git config user.email "ch001ao@qq.com"
# 查看
git config user.name
git config user.email
配置文件
# 全局的配置文件:~/.gitconfig
# 每个仓库的配置文件:repository/.git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = git@gitee.com:yysue/tutorials-java.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = clzbgl
email = clzbgl@gmail.com
配置别名
# 设置别名
# 友好的查看日志格式
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之后没有自动补全功能,可以按如下操作来添加补全功能,记得需要重新登录一下。
wget -O /etc/profile.d/git-completion.sh https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
快速使用:场景
新建仓库
mkdir daily-work
cd daily-work
# 把当前目录变成git可以管理的仓库
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:okokabcd/daily-work.git
git push -u origin master
远程仓库
# 本地仓库与远程仓库作关联
cd existing_git_repo
git remote add origin git@gitee.com:xiniuds/daily-work.git
git remote add other_name git@github.com:username/test.git
git push -u origin master
# 查看远程仓库
git remote
git remote -v
# 在本地删除远程仓库地址
git remote rm origin
# 把远程仓库抓取到本地
git pull origin master
一次提交到多个远程仓库
git clone git@github.com:chenzhiwei/linux.git
cd linux
vim .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:chenzhiwei/linux.git
url = git@gitshell.com:chenzhiwei/linux.git
url = git@bitbucket.org:chenzhiwei/linux.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
# 第一次提交时执行
git push -u origin master
# 以后提交执行git push就可以了
关于git push
注意:在 Git 2.0 将会更改默认的push动作为『只 push 当前 branch 到远端仓库』。
如果想继续使用git push both命令需要手动设置一下git push的默认动作
git config --global push.default matching。
push.default有几个简单动作,这里介绍matching和simple,二者意思分别是 push 本地所有的分支到远端仓库和 push 本地当前分支到上游分支。这个解释貌似还不够精确,可以man git-config来查看详细说明。
提交单个分支到远程仓库
git push命令默认是将所有分支(branch)都提交到git仓库,有时你只想提交某个分支到远端仓库,那么就就需要使用git push origin HEAD。当然也可以使用git config --global push.default tracking命令来改变git push的默认操作,意思是执行git push时默认只提交当前分支到远端git仓库。
克隆仓库
# 直接将远程仓库克隆下来
git clone --depth 1 xxxx
--depth 用于指定克隆深度,为1即表示只克隆最近一次commit
# 这种方法克隆的项目只包含最近一次commit的一个分支,体积很小,可解决项目过大导致的Timeout问题,但会产生另一个问题,它只会把默认分支clone下来,其他远程分支并不在本地所以这种情况下,需要用如下方法摘取其他分支
git clone --depth 1 https://github.com/dogescript/xxxxxxx.git
git remote set-branches origin 'remote_branch_name'
git fetch --depth 1 origin remote_branch_name
git checkout remote_branch_name
分支操作
# 列出所有分支,当前分支前面会标一个*号
git branch
# 创建分支
git branch dev
# 切换分支
git checkout master
git checkout dev // 切换到分支dev
# 创建并切换分支
git checkout -b dev
# 相当于下面这两条命令
git branch dev
git checkout dev
# 把dev分支合并到当前分支上(master分支)
git merge dev
# 删除分支dev
git merge -d dev // 如果分支有未提交的这样删除不了
git merge -D dev // 强制删除
# 查看分支合并情况
git log --pretty=oneline --graph --abbrev-commit
创建孤儿分支
# master转gh-pages 创建一个没有父节点的分支gh-pages
git checkout --orphan gh-pages
git clone git@github.com:chenzhiwei/test.git
cd test
git checkout --orphan new_branch
Switched to a new branch 'new_branch'
git rm -rf . # 删除旧工作目录树中所有文件
rm .gitignore # 如果有该文件的话就删除
echo "orphan branch" > README.mkd
git add .
git commit -m "add README.mkd file"
git push origin new_branch
远程分支
# 查看所有远程分支
git branch -r
# 拉取远程分支
git checkout -b 本地分支名x origin/远程分支名x
git fetch origin 远程分支名x:本地分支名x
标签操作
# 创建带有说明的标签
git tag -a myblog-2.0.1 -m “version 2.0.1 released” 3628164
-a参数指定标签名
-m参数指定说明文字
# 对commit_id为6224937的提交打标签
git tag myblog-1.0.0 6224937
# 查看标签,标签不是按时间顺序列出,而是按字母排序的
git show myblog-1.0.1
# 通过-s用私钥签名一个标签
git tag -s v0.2 -m “signed version 0.2 released” rec145a
# 签名采用PGP签名,因此,必须首先安装gpg(GnuPG)
# 如果没有找到gpg,或者没有gpg密钥对,就会报错
# 创建的标签都只存储在本地,不会自动推送到远程
git tag -d v0.1
# 推送某个标签到远程
git push origin v1.0
# 一次性推送全部尚未推送到远程的本地标签
git push origin --tags
# 删除标签:先从本地删除,再用push命令从远程删除
git tag -d v0.9
git push origin :refs/tags/v0.9
版本回退


# 使用reset,默认mixed
git reset [--soft|mixed|hard] [HEAD|v2]
git reset HEAD覆盖暂存区,git reset --mixed HEAD
git reset --soft v2 v2指向HEAD
git reset --mixed v2 v2指向HEAD,HEAD覆盖暂存区(默认为mixed)
git reset --hard v2 v2指向HEAD,HEAD覆盖暂存区,暂存区覆盖工作区
# 使用checkout
git checkout -- file 暂存区覆盖工作区
# 单独修改暂存区
git rm --cached .project
git rm -r --cached .idea
HEAD表示当前版本,HEAD^表示上一个版本,HEAD~100表示上100个版本
回退到上一个版本
git reset --hard HEAD^
git checkout -- readme.txt这条命令的含义
让readme.txt这个文件回到最后一次git commit或git add时的状态
版本比较
git diff readme.txt
和指定版本进行比较
git diff HEAD^ - - readme.txt
基本命令
配置
git config
查看状态
git status
查看日志
查看执行的历史命令
git reflog
git log
git log --pretty=oneline //简化日志信息
添加
# 添加一个文件到暂存区
git add readme.txt
回退
git reset .
提交
# 将文件提交给HEAD
git commit -m 'my first commit'
commit之后发现少添加了一个文件
git commit -m'msg'
git add forget_file
git commit --amend
推送
git push -u origin master
-u参数,不但会把本地master分支推送到远程master分支,还会把本地master分支与远程master分支相关联
第一次推送用-u,以后用就可以不用了
git push origin master
推送到远程分支后,后悔了
git clone git@github.com:chenzhiwei/test.git
cd test
git reset HEAD^
git push -f master
删除
# 将文件从git中删除
# 删除索引和当时工作目录中的文件。
git rm readme.txt
-f 强制
-r 递归
清理
git clean -nd
git clean -fd
git clean -fX