一. 常用命令
git config
git配置级别level分为三层, 优先级: local > golbal > system
- local
仓库级别的配置. 配置文件的路径为$Repository/.git/config
- global
用户级别的配置. 配置文件的路径为~/.gitconfig
- system
用户级别的配置. 配置文件的路径为/etc/gitconfig (若未设置过变量则文件不会创建)
配置管理: 可以直接按配置格式修改配置文件, 也可以用命令修改, 相关命令(level取上面3个):
git config --${level} -l #查看指定配置,必须进入仓库目录. level可以取local/global/system
git config -l #查看所有的配置信息,依次是系统级别、用户级别、仓库级别. -l等价于 --list
git config --${level} -e #编辑对应配置文件
git config --${level} [--add] section.key value #添加对应级别的变量,level省略即local,--add可省略
git config --${level} --get section.key #省略level按优先级获取变量
git config --${level} --unset section.key #删除对应级别的变量
alias配置别名
- 命令列表
git config --global alias.l log #设置别名, 如果命令含有很多特殊字符用双引号引起来
git config --global --unset alias.l #删除别名
git config --list #查看设置的别名,以alias开头的
- 常用别名
alias.oglog=log --oneline --graph
alias.br=branch
alias.ckot=checkout
alias.ss=status -s
alias.cm=commit -m
alias.cma=commit -am
如果想多个命令添加为一个git命令,可以用系统的alias功能,示例:
alias "git_cmA"='git add -A ; git commit -m '
alias "git_cmC"='git add -A ; git commit -C HEAD'
add/commit添加提交
- add
git add -u #添加改动的文件,但新文件不会添加
git add -A #添加所有文件,包含新文件
- commit
git commit -C commitId #提交并复用指定commitId的comment
git -am 'comment' #相当于执行了git add -u和git commit -m 'comment'
branch分支管理
- 删除分支
git branch -d branchName #删除本地分支
git push origin --delete branchName #删除远程分支
- 和远程分支关联
git push -set-upstream origin branchName #推送当前分支到远端, 并创建分支关联
git branch --set-upstream-to origin/branchName #将当前分支关联到某远程(已存在)分支
- 其他
git branch #查看本地分支
git branch -r #查看远程分支
git branch -a #查看本地/远程分支
git diff 差异对比
- 工作区和暂存区对比
git diff #对比所有文件
git diff --path #对比指定文件
- 暂存区和某次commit对比
git diff --cached #暂存区和HEAD对比
git diff --cached commitId #暂存区和某次提交对比
git diff --cached commitId -- path #暂存区和某次提交对比仅某个文件
- 工作区和某次commit对比
git diff commitId #对比所有文件
git diff commitId -- path #对比指定文件
git diff --word-diff #逐字比较
git stash
a. 命令列表:
-
保存到stash
将工作区内容存到stash, 同时恢复工作区和index区到HEAD (相当于原来的index区会直接被抹除)
git stash #将工作区暂存到stash,同时恢复工作区和index区到HEAD
git stash save -m 'comment' # 带注释
git stash --keep-index #stash时,index保持原样不被抹除
- 查看stash
git stash list #查看stash列表
git stash stash@{0} #根据引用查看stash改动点(stash@{0}最近保存的stash)
- 恢复stash
git stash pop <stash@{n}> #恢复到某stash, 同时在stash列表中删除,如果省略即为stash@{0},下同
git stash apply <stash@{n}> #恢复到某stash,但不删除该stash
git stash branch branchName <stash@{n}> #基于指定stash创建分支
- 直接删除stash
git stash drop <stash@{n}> #删除指定stash,如果省略即为stash@{0}
git stash clear #清空stash列表
b. stash使用场景:
- 开发到一半, 需同步远程代码
git stash
git pull
git stash pop
- 开发到一半, 做别的需求
git stash
切到其他分支做其他需求
git commit #提交其他需求
git stash pop
- 只想提交部分文件
git add -- test.txt
#将已改好的文件加入index
git stash --keep-index
#将其他未改好的保存的stash测试/修改已改好的部分
git commit #提交已改好测好的部分
git stash pop
c. 注意点
- git stash对未track的文件无效, 先执行git add再stash才有效
- 默认只会恢复工作区, 若要恢复index区, 恢复时添加
--index
git checkout/git reset撤回
- git checkout
git checkout 用法有很多, 回撤只是其中一种用法:
git checkout -b newBranch #创建新的分支
gi checkout commitId #修改.git/HEAD指向的指针, 切换分支或commitId
git checkout commitId . #从指定commitId检出所有文件并覆盖, .git/HEAD指针不变
git checkout commitId --path #从HEAD检出指定文件并覆盖
- git reset
修改.git/ref/HEAD指向的分支的内容, 即.git/ref/heads/branchName内容的修改
git reset --soft commitId #将分支指向commitId,index和工作区不变
git reset --mixed commitId #将分支指向commitId,index会被commitId覆盖,工作区不变,相当于git reset
git reset --hard commitId #将分支指向commitId,index和工作区会被commitId覆盖
使用场景:
- 不想修改了, 撤回到HEAD, git reset --hard HEAD或git reset --hard
- 合并到一半不想合并了, git reset --mixed HEAD
- 合并本地多个提交为一个提交
- 撤销添加到index的文件 git reset
git对象引用
- 对象引用分类
直接hash引用
指针引用, 分为以下几类
branch引用: 通过分支名指向hash, 位于.git/refs/heads目录下
tag引用: 通过tag名称指向hash, 位于.git/refs/tags目录下
stash引用: 通过stash@{n}引用, 位于.git/logs/refs/statsh文件里
HEAD引用: 通过HEAD@{n}引用, 位于.git/logs/refs/HEAD文件
commitId^父提交: 不限次数, 如commitId^^ 表示父引用的父引用, commit^2表示第二个父引用
commitId~5: 相当于commitId^^^^^
tree引用
直接hash引用, 或者根据commitId^{tree}引用
blob引用
直接hashs引用, 或根据commitId:a.txt
index区的文件引用, 如:a.txt
- 查看对象
git cat-file -t 对象引用 #查看对象类型, 可能是blob,tree,commit,tag
git cat-file -s 对象引用 #查看对象大小/字节
git cat-file -p 对象引用 #查看对象内容
git rev-parse 对象引用 #根据对象引用查看其hashid, 如git rev-parse HEAD
git log
git log --oneline --graph #查看提交的轨迹
git log --name-status #查看每次提交涉及的文件, 任意git log命令加上--name-status都可
git merge
- 任意两个commit都能merge
- merge的本质是两棵树的合并,找到最晚公共分枝, 进行合并
- 常用git merge --no-ff commitId #将某commitId合并到当前分支
git rebase
完成格式为: git rebase [--onto <newbase>] <since> [<till>]
步骤为:
先切换到
将…(包尾不包头)所标识的提交范围写到临时文件(如果不是线性, 先since, 再till)
将分支强制充值到
将临时文件的提交按顺序逐一提交到重置之后的分支
如果提交过程有冲突
a.解决好之后, 执行git rebase --contine
b.执行git rebase --skip跳过提交
c.执行git rebase --abort 终止编辑切换到变基前的分支
扩展:
git rebase -i #交互式选择
使用场景:
- 本地分支未push至远端, 用来合并多次提交
- 将个人分支合并到公共分支?
git tag
git tag -m 'comment' tagName #打标签
git push origin refs/tags/* #将本地tag全部同步到远端
git tag -d tagName #删除本地标签
git push origin tagName #将本地指定tag同步到远端
git push origin :tagName #删除远端的指定tag
git push origin --tags #将本地tag全部同步到远端
git remote
一个本地库可以同时关联多个远程库, 通过git remote进行远程库管理.
git clone xxxx #会默认创建一个origin的远程库. url就是就是clone的地址
git remote add origin_name originUrl #添加远程库.会在.git/config里创建remote配置
git remote -v #显示所有远程库
git fetch originName #同步非(当前分支绑定库)的代码
git remote set-url originName originUrl #修改指定远程库的地址
git remote rename oldName newName #远程库重命名
git remote update #更新所有关联的远程库
git remote rm originName #删除关联的指定远程库
git push/git pull
本地分支关联远程分支后, 会为该分支关联远程库和分支设置.
配置文件为.git/config, 配置项为branch.brName.remote(远程库)和branch.brName.merge(远程分支)
- git pull
作用: fetch远程对应分支, 并尝试合并当前分支
全命令: git pull origin_name remotePathBrName:localPathBrName
简要命令: git pull 的执行逻辑:
- 如果当前分支关联了远程库: branch.brName.remote(远程库), 则相当于执行git pull originName
- 如果分支未关联远程库, 则相当于执行git pull origin
- 要获取的远程仓库地址由remote.originName.url给出(在.git/config里配置)
- 如果为远程仓库originName设置了fetch参数remote.originName.fetch, 则根据该参数执行获取操作(all分支)
- 执行git merge确定分支: 如果当前分支设置了branch.brName.merge则合并该分支, 否则报错退出
特殊场景:
git pull #从远程取回当前分支的唯一关联分支,再与本地当前分支合并。如果无追踪关系则会失败
git pull origin #从指定仓库取回当前分支的关联分支,再与本地的指定分支合并.如果该库无追踪关系则会失败
git pull origin remoteBr #取回指定仓库的指定分支,再与本地的指定分支合并
git pull -p #本地删除远程主机上已删除的对应分支
- git push
作用: 推送当前分支
全命令: git push origin_name localPathBrName:remotePathBrName
简要命令: git push 的执行逻辑:
- 如果当前分支关联了远程库: branch.brName.remote(远程库), 则相当于执行git push originName
- 如果分支未关联远程库, 则相当于执行git push origin
- 要推送的远程仓库地址由remote.originName.push给出, 如果没有取remote.originName.url
- 如果为远程仓库originName设置了push参数remote.originName.push, 则根据该参数执行推送操作(当前分支)
- 否则以":"作为推送表达式, 即进行同名推送: 所有本地和远程同名的分支进行推送
特殊场景:
git push originName brName #将本地分支push到关联的远程分支(通常同名);如果该远程分支不存在则会被新建
git push originName :brName #省略本地分支表示删除指定远程分支,等价git push origin --delete brName
git push originName #push当前分支,且当前分支与远程分支之间存在追踪关系
git push #当前分支只有一个追踪分支,那么originName也可省略
git push -u originName master #如果当前分支与仓库存在追踪关系,则可以使用-u选项指定一个仓库
其他命令
git grep '搜索内容' #全局按关键字搜索
二. 常用场景
1. 仅看某文件的修改记录
git log -p path #查看某文件的每次提交及修改点
git log --oneline --graph -- path #查看修改某文件的提交
2. 将某文件回撤到某commitId
git ckot commitId --path
3. 查看指定commitId某文件的内容
git cat-file -p HEAD:a.txt
git show commitId:path/file.txt
4. 初始化一个仓库
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:bykevin/Linux_base.git
git push -u origin master
5. 远程分支已删除本地还能看到
远程分支删除了, 但是本地git br -a还能看到. 运行修剪命令
git remote prune origin