Git常用命令
2022-12-8
| 2024-2-25
0  |  Read Time 0 min
URL
type
status
date
slug
summary
tags
category
icon
password

Git 常用命令

一. Git 工作机制

工作区->暂存区->本地库->代码托管中心(远程库)
notion image

二. Git 操作

1.设置签名

C:\.gitconfig 用户配置文件

2.git 命令

左键选中+中键: 直接复制粘贴
shift + ins : 同上
命令
作用
git init
初始化工作区(创建仓库)
git status
查看工作区状态(哪个分支,哪个文件,提交状态)
git add 文件名
将文件加入暂存区(删除了文件也要add)
git rm 文件名
将文件从工作区和暂存区中删除
git rm --cached 文件名
将文件从暂存区移除
git commit -m "日志信息" 文件名
将文件提交到本地库
git reflog
查看简化版本信息
git log
查看完整版本信息
git reset --hard 版本号
穿梭到哪个版本(丢弃暂存区和工作区内容)
git reset --mixed 版本号
穿梭到哪个版本(丢弃暂存区,保留工作区内容)
git reset --soft 版本号
穿梭到哪个版本(保留暂存区和工作区内容)
git ls -files
查看暂存区中的内容

3.git 分支

命令
作用
git branch -v
查看分支
git branch 分支名
创建分支
git checkout 分支名
切换到指定分支
git merge 分支名
将指定分支合并到当前分支
git branch -d 分支名
删除分支,分支包含更改未提交会被-d 阻止,可以用-D 强制删除
git diff
比较工作区和暂存区差异
git diff HEAD
比较工作区和版本库的差异
git diff --cached
比较暂存区和版本库的差异
git diff id1 id2
比较两个版本之间的差异
git diff 当前版本id HEAD
比较当前版本与第二个版本
git diff HEAD~ HEAD
HEAD~ 表示上一个版本
git diff HEAD^ HEAD
HEAD^ 也表示上一个版本
git diff HEAD~2 HEAD
HEAD~2 表示head之前的两个版本
git diff HEAD~2 HEAD filename
查看指定文件的差异内容
冲突合并:==同一个文件的同一个位置==有两种不同的修改
文件中会出现冲突信息
自己手动修改,选取要保留的部分,删掉多余代码
重新 add 和 commit
==注意:commit 不能后不能带文件名否则会报错==
成功合并后只会修改当前的分支,不会修改拿来合并的那个另一个分支

四. github 的使用

ssh-keygen -t rsa -b 4096 用 git 生成公钥,放入 github 实现免密登录,秘钥在 用户名/.ssh/id_rsa.pub 文件中
注意:之前生成过秘钥可能会导致被覆盖,可以指定新的文件名称
在这里添加秘钥:
关联本地仓库和远程仓库
git remote -v 查看远程连接的库
git remote add 自定义名字 远程库链接 新建远程库的连接
git push 名字/链接 本地分支名 推送分支
git pull 名字/链接 远程分支名 拉取分支
git pull 仓库名字/链接 --allow-unrelated-histories 强行拉取合并(当远程库有本地库没有的文件时)
拉取分支会自动合并,如果有冲突会合并失败,需手动解决冲突再合并
git fetch 只获取修改内容,不会自动合并,需手动合并
git clone 名字/链接 克隆仓库
git clone 分支名 名字/链接 克隆仓库
小贴士:git推送分支的完整写法是
git push origin 本地分支名:远程分支名
我们通常会省略远程分支名,这样GitHub会自动创建一个同名的分支,我们也可以指定这个需要推送到的远程分支名。

五. gitignore 文件的使用

在 git 工程下面可以创建一个.gitignore文件,里面可以设置,提交到暂存区时忽略哪些文件,即哪些文件不传到暂存区
.gitignore文件生效有个条件,不能先添加到版本库,再使用gitignore文件

六. 工作流程梳理

  1. git 先初始化用户名和邮箱,没有公钥的先生成公钥,在 github 里添加公钥。
  1. 创建一个 git 工程,使用git init或者git clone。同时 github 中新建一个仓库。
  1. 当文件修改好了需要提交的时候,先git add .到暂存区,再git commit -m "日志信息" . 到本地库。
  1. 复制 github 仓库链接,用remote add 别名 链接添加库的别名,方便后续使用。
  1. git push 别名/链接 本地分支来把指定分支的代码推送到 github 仓库。
 

七. git进阶命令

1. git stash

功能:把暂存区中的代码放入一个栈中
命令:
git stash 入栈
git stash save '注释' 入栈(带一个签名备注)
git stash pop 出栈,弹出栈顶到当前分支
git stash apply stashname恢复指定贮藏代码到工作区和缓存区,不会弹出栈
git stash list 查看,不能看到变动
git stash show 栈索引 查看指定栈索引记录的变动
git stash drop 栈索引 删除指定栈
git stash clear 清空栈
使用场景:
  • 工作区中开发到一半,放入暂存区了,但是还不能提交。这时需要切换分支改bug,由于没有提交,因此git不让切换分支。这时可以用git stash把暂存区的代码存到一个栈中
  • 远端代码已经更改,需要先pull到本地,但是本地代码还没提交

八、git hooks

git勾子类似框架中的一些回调函数,会在git特定动作发生后执行特定的脚本。

hooks种类

勾子分为服务端和客户端,它们提供不同的功能

hooks位置

.git/hooks
里面有一堆.simple示例脚本,去掉.simple才可以生效

脚本语言

脚本是shell或者perl脚本,第一行的 #!/bin/sh 指定用哪种脚本解释器 比如指定为python,就可以用python来执行这个脚本

hooks成功执行的前提

  • 单一命名,没有前缀后缀
  • 有可执行的权限
  • 任何可执行文件都可以

最常用的hook

Git Hook
调用时机
说明
pre-commit
git commit 执行前它不接受任何参数,并且在获取提交日志消息并进行提交之前被调用。脚本git commit 以非零状态退出会导致命令在创建提交之前中止。
可以用git commit --no-verify 绕过
commit-msg
git commit 执行前可用于将消息规范化为某种项目标准格式。还可用于在检查消息文件后拒绝提交。
可以用git commit --no-verify 绕过

全部勾子

Git Hook
调用时机
说明
pre-applypatch
git am 执行前
applypatch-msg
git am 执行前
post-applypatch
git am 执行后
不影响git am 的结果
pre-commit
git commit 执行前
可以用git commit --no-verify 绕过
commit-msg
git commit 执行前
可以用git commit --no-verify 绕过
post-commit
git commit 执行后
不影响git commit 的结果
pre-merge-commit
git merge 执行前
可以用git merge --no-verify 绕过。
prepare-commit-msg
git commit 执行后,编辑器打开之前
pre-rebase
git rebase 执行前
post-checkout
git checkout git switch 执行后
如果不使用--no-checkout 参数,则在git clone 之后也会执行。
post-merge
git commit 执行后
在执行git pull 时也会被调用
pre-push
git push 执行前
pre-receive
git-receive-pack 执行前
update
post-receive
git-receive-pack 执行后
不影响git-receive-pack 的结果
post-update
git-receive-pack git push 作出反应并更新仓库中的引用时
push-to-checkout
当``git-receive-pack git push做出反应并更新仓库中的引用时,以及当推送试图更新当前被签出的分支且 receive.denyCurrentBranch配置被设置为 updateInstead`时
pre-auto-gc
git gc --auto 执行前
post-rewrite
执行git commit --amend git rebase
sendemail-validate
git send-email 执行前
fsmonitor-watchman
配置core.fsmonitor 被设置为.git/hooks/fsmonitor-watchman .git/hooks/fsmonitor-watchmanv2
p4-pre-submit
git-p4 submit 执行前
可以用git-p4 submit --no-verify 绕过
p4-prepare-changelist
git-p4 submit 执行后,编辑器启动前
可以用git-p4 submit --no-verify 绕过
p4-changelist
git-p4 submit 执行并编辑完changelist message
可以用git-p4 submit --no-verify 绕过
p4-post-changelist
git-p4 submit 执行后
post-index-change
索引被写入到read-cache.c do_write_locked_index

勾子的返回值

勾子返回0,就会终止后续操作。

跳过勾子

执行命令时添加 --no-verify
 

## 踩坑记录

1、push没有许可,deploy key问题

在push的时候遇到了如下报错
ERROR: Permission to xxx denied to deploy key fatal: Could not read from remote repository.
在翻阅github官方文档后了解到,github每个仓库有单独的 deploy key。并且学习了一些关于ssh中秘钥管理的技巧。
 
开启ssh代理
生成公钥时候,要使用公钥,还需要:
  • 开启 ssh-agent
  • 将SSH 私钥添加到 ssh-agent: ssh-add c:/Users/YOU/.ssh/id_ed25519
 
测试ssh连接
  • 在git bash中输入 ssh -T git@github.com
  • 查看公钥指纹是否符合
  • 输入yes
  • 查看是否有问题
 
账户的key和仓库的key
  • 账户可以设置一个统一的key,该账户下的每一个仓库都可以使用这个key进行验证
  • 每个仓库可以设置自己的deploy key,这是这个仓库专用的key,其他仓库不能用
  • 每一个生成的key,只能给唯一的账户或仓库使用,一个仓库使用后,其他仓库或账户便无法添加这个key。
账户的key:
notion image
 
仓库的key:
notion image
 
总结:
这次问题主要是电脑本地的这个key,被添加到了一个仓库上,而我push到的是另一个仓库。而我的账户是没有添加ssh key的,因此提示我push的那个仓库没有deploy key。
我将原本那个仓库的key删除后,添加到账户上,就可以了。
 
Relate Posts :
  • 版本管理
  • git
  • github
  • Shell编程入门每周学习总结03
    Catalog