URL
type
status
date
slug
summary
tags
category
icon
password
Git 常用命令
一. Git 工作机制
工作区->暂存区->本地库->代码托管中心(远程库)
二. 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文件
六. 工作流程梳理
- git 先初始化用户名和邮箱,没有公钥的先生成公钥,在 github 里添加公钥。
- 创建一个 git
工程,使用
git init
或者git clone
。同时 github 中新建一个仓库。
- 当文件修改好了需要提交的时候,先
git add .
到暂存区,再git commit -m "日志信息" .
到本地库。
- 复制 github
仓库链接,用
remote add 别名 链接
添加库的别名,方便后续使用。
- 用
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:
仓库的key:
总结:
这次问题主要是电脑本地的这个key,被添加到了一个仓库上,而我push到的是另一个仓库。而我的账户是没有添加ssh key的,因此提示我push的那个仓库没有deploy key。
我将原本那个仓库的key删除后,添加到账户上,就可以了。