index
开局一张图
🌟 常用操作
git add # 操作时,有时会误添加一些不想提交的文件,如何解决?
# 误add单个文件
git reset HEAD 将file退回到unstage区
# 误add多个文件,只撤销部分文件
git reset HEAD # 将file退回到unstage区
git rm 与 git reset的区别
git rm:用于从工作区和索引中删除文件
git reset:用于将当前HEAD复位到指定状态。一般用于撤消之前的一些操作(如:git add,git commit等)。
git rm file_path 删除暂存区和分支上的文件,同时工作区也不需要
git rm --cached file_path 删除暂存区或分支上的文件, 但工作区需要使用, 只是不希望被版本控制(适用于已经被git add,但是又想撤销的情况)
# 撤销
git reset HEAD 回退暂存区里的文件
📦 仓库管理
init
# 初始化一个git仓库
git init
clone
克隆仓库,克隆一个远程仓库也是很有技巧的,往往新手会一股脑的整个仓库克隆下来,新项目还好,如果该项目是维护已久那么大概率该仓库是非常大的,根本没必要整个克隆
# 基础使用
git clone {仓库地址} {本地目录}
# 无需密码
git clone git@gitee.com:capsion/sublime-testt.git
# 需要账号密码
git clone https://gitee.com/capsion/sublime-testt.git
# 【推荐】仅克隆最近一次提交的内容
git clone --depth=1 git@gitee.com:capsion/sublime-testt.git
# 【推荐】克隆指定分支,且指定提交次数
git clone --depth 3 -b develop --single-branch ssh://gerrit@192.168.8.2/test
rm
删除经过add的文件,既在暂存区的文件
# 删除指定文件
git rm {filename}
config
语法:git config --global {关键字.关键属性} {值}
# 显示当前设置
git config -l
# 设置换行
# 开启自动将回车替换成换行+回车 linux
git config --global core.autocrlf true
# 修改配置文件
git config --global --edit 直接修改配置文件
git config --global i18n.logoutputencoding utf-8
# 删除配置
git config --glabal --unset xxx.xxx - 删除配置
fsck
# 找回一些被reset清理掉,但之前追踪过修改的(add)版本
git fsck --lost-found
# 恢复近60次add过的文件
find .git/objects -type f | xargs ls -lt | sed 60q
📁 暂存区管理
add
创建指令,一般用来创建文件到工作区(暂存区),但不提交
# 添加所以文件
git add .
# 添加指定文件
git add "xxx/xxx/xx"
# 指定添加某些文件
git add "*.bat"
commit
将当前存在暂存区的修进行一次提交,无论之前add了多少次,都会合并到一次提交内
# 将当前的修改提交到分支
git commit -m "本次提交的说明"
或
git cm "本次提交的说明"
log
查看当前分支的提交历史记录,结构等信息
# 查看当前分支结构
git log
# 详细分支结构树状图
git log --graph
# 简明结构树状图
git log --graph --pretty=oneline --abbrev-commit
# 查看最近6条的记录
git log -6
查看最近一次发布变动
#
git log <last tag> HEAD --pretty=format:%s
过滤某些commit(比如文档改动),便于快速查找信息
# 只看 feature
git log <last release> HEAD --grep feature
以视图的方式展示
git log -6 --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
reflog
查看每次提交(commit)的版本id和记录
git reflog
status
查看当前分支状态:什么文件在缓存区,什么文件没有被追踪
# 查看缓存区
git status
stash
它帮你把手头未完成还不好提交(提交必然牵扯 commit-hook,又是运行单元测试又是静态检查的)的活收拢到一个暂存区,等新任务完成了可以再 git stash pop
恢复之前的工作。
# 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别
git stash save "save message"
# 查看stash了哪些存储
git stash list
# 显示做了哪些改动,默认show第一个存储,
git stash show
# stash@{$num} 显示与第二个存储的区别
git stash show stash@{1}
# 显示第一个存储的改动,如果想显示其他存存储
# 命令:git stash show stash@{$num} -p
git stash show -p
# 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储
# git stash apply stash@{$num} 要使用其他
git stash apply
# 令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下
git stash pop
# 丢弃stash@{$num}存储,从列表中删除这个存储
git stash drop
# 删除所有缓存的stash
git stash clear
git add
和git stash
没有必然的关系,但是执行git stash
能正确存储的前提是文件必须在git 版本控制中,即被add后追踪的文件
add 那些你不想备份的文件(例如: git add file1.js, file2.js)
调用 git stash –keep-index。只会备份那些没有被add的文件。
调用 git reset 取消已经add的文件的备份,继续自己的工作。
参考资料
应用场景
📝 分支管理
branch
# 列出所有分支
git branch
# 创建分支
git branch {分支名}
# [-d]参数 删除分支
git branch -d {分支名}
# 关联远程分支
git branch --set-upstream-to=origin/dev dev - 关联远程分支
switch
>=2.3
# 切换到分支
git switch {分支名}
# 创建并切换到该分支
git switch -c {分支名}
checkout
# 切换到分支
git checkout {分支名}
# [-b] 参数就是创建分支功能, 并切换到对应分支相当于
git checkout -b {分支名}
show
查看带tag的分支
# 查看对应标签的信息
git show <tagname>
tag
基础使用
# 列出所有标签
git tag
# 列出指定版本的 tag
git tag -l 'v0.0.*'
# 查看指定标签信息
# git show v0.9
git show <tagname>
创建标签
# 创建带说明的标签
# git tag -a <tagName> -m <msg> <commitId>
git tag -a v0.0.1 -m "项目初始化" 1094abd
# 在当前分支上创建一个 v1.0.0 标签
git tag v1.0.0
# 在当前分支上创建标签
git tag -m "xxxx" <tagname>
# 在指定分支上创建标签
# git tag v0.9 f52c633
git tag <tagname> commit-id
# -m 同时添加说明
git tag -m "标签说明" <tagname> commit-id
# 移除当前分支上标签
git tag -d <tagname>
# 推送tag到远程仓库
git push <remote> <tag>
# 推送所有Tag到远端
git push <remote> --tags
diff
# 查看文件变化
git diff
或
git diff "xxx/xxx"
# 查看与某个版本对应的区别
git diff head{^|1-100}
merge
将当前分支与指定的分支合并
# 自动合并,默认是快速合并,不会留下分支和记录
git merge {要合并的分支名}
# 普通合并模式,留下记录并创建新分支
git merge --no-ff -m "xxx" {要合并的分支名}
reset
# 重置到不同的提交
# 重置到最后一次提交的
git reset --hard
# 删除所有没有被add过得文件
git clean -d -fx
# 重置到上一个版本
git reset --hard^
# 重置到上上一个版本
git reset --hard^^
# 或者指定的版本id
git reset --hard 1094adb
# 重置到上5个版本
git reset --hard~5
反面教材
cherry-pick
# 复制提交
# 对应提交的代号,切换到分支然后可以复制提交
git cherry-pick {分支名}
☁ 远程管理
fetch
remote
管理远程仓库
# 查看当前所有远程仓库信息
git remote
# 查看更详细的信息
git remote -v
# 创建关联的远程仓库
git remote add <name> <repo>
git remote add origin ssh/https/svn.git
# 删除远程库
git remote rm <name>
添加远程分支
语法:
git push <远程仓库名> <本地分支名称>:<需关联的远程分支名称>
# 首先在本地创建一个空分支
git checkout -b develop
git push origin develop:devlop
删除远程分支
语法:
git push <远程仓库名> :<需关联的远程分支名称>
git push --delete <远程仓库名>
# 方式1 将空分覆盖到指定远程分支,相当于将远程分支清空
git push origin :develop
# 方式2 使用 --delete
git push origin --delete develop
pull
push
🎁 打包发布
archive
语法:
git archive -flag <param>
git archive --format=<zip|tar> --output=</path/file.ext> <tagName>|<cinnutId>|<checkoutName>
-o
|--output=
:指定打包后的文件位置和名称格式
# 首先, 查看当前支持的打包格式
git archive --list
# 打包最新的版本库
git archive -o ../output.zip HEAD
# 打包指定的分支
git archive -o ../output/git-0.0.1.tar 5514zaa
# 打包指定的目录 比如我要打包 Docs 目录
git archive -o ../output.zip HEAD:Docs/
# 导出 tar.gz 格式
git archive HEAD:Docs/ | gzip > ../output.tar.gz
# 打包最近一次修改过的文件
git archive -o ../updated.zip HEAD $(git diff --name-only HEAD^)
# 将 master 分支 以 zip 格式打包到指定位置
git archive --format=zip --output=/path/file.zip master|<tag|head
# 导出指定 tag名称的所有相关文件
# git archive --format=zip --output=</path/file.zip> <tagName>
git archive --format=zip --output=v1.0.zip v1.0