git 特点
-
分布式版本控制系统
-
直接存储快照,而不是像SVN存储差异
-
几乎所有操作在本地执行(如查看历史记录直接读取本地数据库)
git三种状态
-
已修改,修改了文件没有保存到数据库中
-
已暂存,对已修改的文件的当前版本做了标记,使之包含在下次提交的快照中
-
已提交,数据已安全保存到数据库
git 命令
基本命令
# 创建git仓库
git init
# 克隆远程仓库
git clone
# 提交文件到暂存区
git add <file或者.>
# 提交文件 -a会将已跟踪未add进暂存区的内容直接提交
git commit <-a> -m "msg"
# 查看状态 -s 缩写 文件前AM表示暂存区、工作区状态
git status
# 查看修改内容 默认查看未暂存的 查看暂存 --staged或者--cached
git diff
# 删除文件 如果文件保留在磁盘 --cached
git rm <file>
# 移动文件(重命名) 等于三个命令 mv(系统重命名) rm add
git mv file1 file2
# 日志 --stat 简要提交信息
# --pretty=oneline 一个提交一行,其他选项:short full fuller
# --pretty=format:"%h - %an, %ar : %s"
# %h-提交的简写哈希值 %an-作者名字 %ar-作者修订日期,按多久以前显示
# %s-提交说明
# oneline或者format结合--graph使用查看分支、合并历史
# 限制输出的选项
# --<n> 最近n条记录
# --since,--after 指定时间之后的提交
# --until,--before 指定时间之前的提交
# --author 指定作者的提交
# --committer 指定提交者的提交
# --grep 提交说明包含制定字符串
# -S <str> 添加或删除包含制定字符串的提交
# --no-merges 不包含合并的提交
# 如果看指定文件或者目录 最后加上path 在path前面加 -- 隔离
git log --pretty=oneline --no-merges -- a.txt
# 覆盖上一次提交(提交完了之后发现少提交了后再次提交)
git commit --amend
# 从暂存区撤销
git restore --staged <file>
# 撤销本地修改
git restore <file>
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add <shortname> <url>
# 拉取
git fetch <remote>
# 推送
git push origin master
# 查看远程仓库
git remote show <remote>
# git别名 git config --global alias.<name> <commit>
git config --global alias.last 'log -1 HEAD'
标签
# 列出标签 -l "v1.0*" 列出想要找到的标签
git tag
# 附注标签(建议使用) -a -m "msg"
git tag -a v1.4 -m "version 1.4"
# 查看标签信息
git show v1.4
# 轻量标签
git tag v1.4-lw
# 给历史提交打标签
git tag -a v1.2 0adbae2
# 推送标签 推送所有标签 git push origin --tags
git push origin v1.2
# 删除标签 -d <tagname>
git tag -d v1.4-lw
# 删除远程标签
git push origin :refs/tags/v1.4-lw
git push origin --delete v1.2
gitignore文件
# 忽略~结尾的文件
*~
# 忽略.a或者.o结尾的文件
*.[oa]
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
分支
# 创建分支
git branch <name>
# 分支日志
git log --oneline --decorate --graph --all
# 切换分支 -b 创建去且切换
git checkout <branch>
# 合并 切换到分支后再合并需要的分支
git merge <branch>
# 删除分支
git branch -d <branch>
# 查看分支 -v 每个分支最后一次提交的信息
# --no-merged 未合并到当前的分支 --merged 已合并到当前的分支
# --no-merged --merged <branch> 过滤未合并/已合并到指定分支的分支
git branch
git branch --no-merged master
# 远程分支引用查看
git ls-remote <name>
# 推送远程分支
# 需要远程分支不同名字的话 push origin <branch>:<otherName>
git push origin <branch>
git push -u origin featureA
# 设置本地分支跟踪远程分支 -u 或者 --set-upstream-to=origin/<branch> <lcoalb>
git branch -u origin/dev
# 查看所有跟踪分支 如果看最新的领先落后数据先运行 git fetch --all
git branch -vv
# 拉去git pull = git fetch + merge
# git fetch origin 只会拉去服务器数据,不会更改目录内容 需要手动
# 合并 eg:git merge origin/dev
git pull
# 删除远程分支
git push origin --delete <branch>
# rebase 合并 提交历史简洁 --onto 仅当前分支的修改rebase
# 风险:提交在仓库之外(如不是本地分支,而是远程分支),其他人还要在这些提交上进行开发,
# 这种情况不要用rebase
git checkout experiment
git rebase master
git checkout master
git merge experiment
# 不切换分支rebase命令 git rebase <base> <topicbranch>
git rebase master experiment
其他命令
# 提交前检查 是否有空白
git diff --check