git命令使用总结

一. 常用命令

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覆盖

使用场景:

  1. 不想修改了, 撤回到HEAD, git reset --hard HEAD或git reset --hard
  2. 合并到一半不想合并了, git reset --mixed HEAD
  3. 合并本地多个提交为一个提交
  4. 撤销添加到index的文件 git reset

git对象引用

  • 对象引用分类
  1. 直接hash引用

  2. 指针引用, 分为以下几类

    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^^^^^

  3. tree引用

    直接hash引用, 或者根据commitId^{tree}引用

  4. 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

  1. 任意两个commit都能merge
  2. merge的本质是两棵树的合并,找到最晚公共分枝, 进行合并
  3. 常用git merge --no-ff commitId #将某commitId合并到当前分支

git rebase

完成格式为: git rebase [--onto <newbase>] <since> [<till>]

步骤为:

  1. 先切换到

  2. 将…(包尾不包头)所标识的提交范围写到临时文件(如果不是线性, 先since, 再till)

  3. 将分支强制充值到

  4. 将临时文件的提交按顺序逐一提交到重置之后的分支

  5. 如果提交过程有冲突

    a.解决好之后, 执行git rebase --contine

    b.执行git rebase --skip跳过提交

    c.执行git rebase --abort 终止编辑切换到变基前的分支

扩展:

git rebase -i #交互式选择

使用场景:

  1. 本地分支未push至远端, 用来合并多次提交
  2. 将个人分支合并到公共分支?

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 的执行逻辑:

  1. 如果当前分支关联了远程库: branch.brName.remote(远程库), 则相当于执行git pull originName
  2. 如果分支未关联远程库, 则相当于执行git pull origin
  3. 要获取的远程仓库地址由remote.originName.url给出(在.git/config里配置)
  4. 如果为远程仓库originName设置了fetch参数remote.originName.fetch, 则根据该参数执行获取操作(all分支)
  5. 执行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 的执行逻辑:

  1. 如果当前分支关联了远程库: branch.brName.remote(远程库), 则相当于执行git push originName
  2. 如果分支未关联远程库, 则相当于执行git push origin
  3. 要推送的远程仓库地址由remote.originName.push给出, 如果没有取remote.originName.url
  4. 如果为远程仓库originName设置了push参数remote.originName.push, 则根据该参数执行推送操作(当前分支)
  5. 否则以":"作为推送表达式, 即进行同名推送: 所有本地和远程同名的分支进行推送

特殊场景:

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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值