一. 常用命令
alias配置别名
- 命令列表
shell
git config --global alias.l log #设置别名, 如果命令含有很多特殊字符用双引号引起来
git config --global --unset alias.l #删除别名
git config --list #查看设置的别名,以alias开头的
- 常用别名
shell
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功能,示例:
shell
alias "git_cmA"='git add -A ; git commit -m '
add/commit添加提交
- add
shell
git add -u #添加改动的文件,但新文件不会添加
git add -A #添加所有文件,包含新文件
- commit
shell
git commit -C commitId #提交并复用指定commitId的comment
git -am 'comment' #相当于执行了git add -u和git commit -m 'comment'
branch分支管理
- 删除分支
shell
git branch -d branchName #删除本地分支
git push origin --delete branchName #删除远程分支
- 和远程分支关联
shell
git push -set-upstream origin branchName #推送当前分支到远端, 并创建分支关联
git branch --set-upstream-to origin/branchName #将当前分支关联到某远程(已存在)分支
git diff 差异对比
- 工作区和暂存区对比
shell
git diff #对比所有文件
git diff --path #对比指定文件
- 暂存区和某次commit对比
shell
git diff --cached #暂存区和HEAD对比
git diff --cached commitId #暂存区和某次提交对比
git diff --cached commitId -- path #暂存区和某次提交对比仅某个文件
- 工作区和某次commit对比
shell
git diff commitId #对比所有文件
git diff commitId -- path #对比指定文件
git stash
a. 命令列表:
- 保存到stash
将工作区内容存到stash, 同时恢复工作区和index区到HEAD (相当于原来的index区会直接被抹除)
shell
git stash #将工作区暂存到stash,同时恢复工作区和index区到HEAD
git stash save -m 'comment' # 带注释
git stash --keep-index #stash时,index保持原样不被抹除
- 查看stash
shell
git stash list #查看stash列表
git stash stash@{0} #根据引用查看stash改动点(stash@{0}最近保存的stash)
- 恢复stash
shell
git stash pop <stash@{n}> #恢复到某stash, 同时在stash列表中删除,如果省略即为stash@{0},下同
git stash apply <stash@{n}> #恢复到某stash,但不删除该stash
git stash branch branchName <stash@{n}> #基于指定stash创建分支
- 直接删除stash
shell
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指向的指针
git checkout commitId . #从指定commitId检出所有文件并覆盖
git checkout commitId --path #从HEAD检出指定文件并覆盖
- git reset
修改.git/ref/HEAD指向的分支的内容, 即.git/ref/heads/branchName内容的修改
shell
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
- 合并本地的提交
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
- 查看对象
shell
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
shell
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 终止编辑切换到变基前的分支
扩展:
shell
git rebase -i #交互式选择
使用场景:
- 本地分支未push至远端, 用来合并多次提交
- 将个人分支合并到公共分支?
二. 常用场景
1. 仅看某文件的修改记录
shell
git log -p path #查看某文件的每次提交及修改点
git log --oneline --graph -- path #查看修改某文件的提交
2. 将某文件回撤到某commitId
shell
git ckot commitId --path
3. 查看指定commitId某文件的内容
shell
git cat-file -p HEAD:a.txt
git show commitId:path/file.txt