[toc]
- git bash 允许交互工作:
winpty vue.cmd create some-name
vscode 中用bash 直接就可以使用键盘操作
github
- 直接访问版本号前7位也是可以访问的。
github 授权
github 头像下拉 -> settings -> Developer settings -> Personal access tokens -> Generate new token
Note 提示信息随意命名
勾选 repo 全部选项
勾选 admin:public_key 全部选项
勾选 admin:repo_hook 全部选项
以上的勾选 根据不同的情况会有所区别
点击生成,记得复制保存,这里只显示一次,刷新进入后 不再显示
Travis CI
只支持 Github,不支持其他代码托管服务
contribution 没有记录
出现提交了代码 但 contribution 没有记录,同时查看 commit 记录 提交的用户也无法被 GitHub识别;证明配置的 uaer.name 和 user.email 不正确,email必须配置为GitHub上认证过的邮箱
gitlab
clone 时出现, fatal: unable to access 'http://xxxx/front-end/smart-safety-pc.git/': Could not resolve host: xxxx
其中的 xxxx 是一串表示仓库的字符 要将字符改为,当前域名
分支权限管理: settings -> Repository -> Protected Branches -> expand
人员权限管理: 最好以项目来分组,在分组中可以设置人员角色权限 没有在分组中的,可以在项目中设置权限
Guest 可以创建issue、发表评论、不能读写版本库
Reporter 可以克隆代码,不能提交,QA、PM可以赋予这个权限
Developer 可以克隆代码、开发、提交、push、RD可以赋予这个权限
Maintainer 不能对项目进行迁移、删除,其它的权限都有
Owner 可以设置项目的访问权限-Visibility Level、删除项目、迁移项目、管理组成员、开发组leader可以赋予这个权限
git
crlf: "\r\n"
, windows系统的换行方式lf: "\n"
, Linux系统的换行方式 Git提交时把行结束符CRLF转换成LF,在签出代码时把LF转换成CRLF 设置git config --global core.autocrlf true
这个也是默认设置,适用月 windows 系统 提交时把CRLF转换成LF,签出时不转换 设置git config --global core.autocrlf input
适用 linux 设置git config --global core.autocrlf false
全是windows开发init
初始化一个新本地仓库,它在工作目录下生成一个名为.git的隐藏文件夹git subtree 实现一个仓库作为其它仓库的子仓库
上传空文件夹 添加
.gitkeep
文件即可commit 与 pull 的操作顺序; 当预判本地与远程有冲突时:
commit->pull->push
预判无冲突:pull->commit->push
.gitignore 匹配规则
*.txt #忽略所有 .txt 后缀的文件
/todo #仅忽略项目根目录下的 todo 文件,不包括 src/todo
build/ #忽略 build/目录下的所有文件,过滤整个build文件夹;
hello/* #匹配hello目录下的所有目录和文件 但不忽略hello目录本身
doc/*.txt #忽略doc目录下所有 .txt 后缀的文件,但不包括doc子目录的 .txt 的文件
bin/: #忽略当前路径下的 bin 文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: #忽略根目录下的 bin 文件
/*.c: #忽略 cat.c,不忽略 build/cat.c
debug/*.obj: #忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: #忽略/foo, a/foo, a/b/foo等
a/**/b: #忽略a/b, a/x/b, a/x/y/b等
config.js: #忽略当前路径的 config.js 文件
/mtk/ #忽略整个文件夹
*.zip #忽略所有.zip文件
/mtk/do.c #忽略某个具体文件
#不忽略某个文件
src/views/xxx/*
!src/views/xxx/index.vue #目前实测是只能到文件
已经提交过的 文件 需要放弃跟踪
git rm --cached -rf folder|file
创建SSH
cd ~/.ssh
: 查看用户根目录是否有 ssh 文件ssh-keygen
: 在 Windows 上,ssh-keygen
该程序包含于 MSysGit(也就是git-for-windows) 【输入命令后,一直回撤即可】
ssh-keygen
-b:指定密钥长度
-e:读取openssh的私钥或者公钥文件
-C:添加注释
-f:指定用来保存密钥的文件名
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥
-l:显示公钥文件的指纹数据
-N:提供一个新密语
-P:提供(旧)密语
-q:静默模式
-t:指定要创建的密钥类型(rsa和dsa; 都是非对称加密算法,DSA 只能用于数字签名,而无法用于加密;RSA 即可作为数字签名,也可以作为加密算法)
Git Hooks
实例查看本项目的 pre-push 文件
在初始化git时会在
./git/hooks/
中生成钩子脚本,默认加了.sample
后缀,防止默认执行,是样本文件安装一个钩子只需要去掉.sample拓展名即可
本地钩子
pre-commit
运行git commit 时被触发,不需要任何参数,以非0状态退出时将放弃整个提交prepare-commit-msg
在pre-commit钩子在文本编辑器中生成提交信息之后被调用;用来方便地修改自动生成的squash或merge提交commit-msg
它会在用户输入提交信息之后被调用。这适合用来提醒开发者他们的提交信息不符合你团队的规范post-commit
commit-msg钩子之后立即被运行 。它无法更改git commit的结果,所以这主要用于通知用途applypatch-msg
执行git am命令时触发,常用于检查命令提取出来的提交信息是否符合特定格式pre-applypatch
git am提取出补丁并应用于当前分支后,准备提交前触发,常用于执行测试用例或检查缓冲区代码post-applypatch
git am提交后触发,常用于通知、或补丁邮件回复(此钩子不能停止git am过程)post-checkout
和post-commit钩子很像,但它在你用git checkout查看引用的时候被调用。这是用来清理你的工作目录中可能会令人困惑的生成文件pre-rebase
git rebase发生更改之前运行post-rewrite
执行会替换commit的命令时触发,比如git rebase或git commit –amendpost-merge
成功完成一次 merge行为后触发pre-push
执行git push命令时触发,可用于执行测试用例pre-auto-gc
执行垃圾回收前触发
服务器钩子
pre-receive
用git push向仓库推送代码时被执行update
在pre-receive之后被调用post-receive
post-receive
状态
- git status -s 获取简短的输出结果
A:在本地新增的文件(服务器上没有)
C:文件的一个新拷贝
D:本地删除的文件(服务器上还在)
M:文件的内容或mode被修改
R:文件名被修改
T:文件类型被修改
U:文件没有被合并(你需要完成合并才能提交)
X:未知状态
搜索:man git diff-files。
- Linux或Mac系统使用LF作为行结束符
文件冲突查看
git status -s 显示 UU 的表示有冲突
git diff --check 或 git diff --name-only --diff-filter=U
git 相关配置
配置用户名和邮件地址:可以随便改
这个与代码上传 拖取时输入的账号密码无关,
git config --global user.name 'username'
git config --global user.email 'email'
#配置当前仓库
git config user.name 'username'
git config user.email 'warrenemb@163.com'
#查看系统、当前用户、当前仓库配置:
git config --system --list
git config --global --list
git config --local --list
# 配置代理 这里的端口根据实际用途更改 这个更改只针对 git 进行代理
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy https://127.0.0.1:7890
用户信息列表:git config --global --list
修改: git config --global user.name '其它'
解决 windows 和 Linux 文件格式不一致 NTFS 这是全局设置
git config --global core.filemode false
解决 git 默认不区分文件名大小写问题
git config core.ignorecase false
git clone 会默认将本地与远程分支进行追踪
克隆时 密码输入错误,怎么修改;打开控制面板 -> 用户账户 -> Windows 凭据 -> 选中凭据展开编辑即可
当在merge时产生了冲突(branchname|Marging)
执行 git add filename|. + git commit –m 'message'
再次将工作区的更改提交到本地仓库-区,告诉Git 冲突已解决。
- git rebase
在当前分支操作 git rebase master,把当前分支(dev)的 commit 放到公共分支(matser)的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样
merge 会把公共分支和当前分支的commit 合并在一起,形成一个新的 commit 提交, rebase不会生成新的节点,是将两个分支融合成一个线性的提交
在分支上进行 git rebase master 操作,相当于让当前分支相对于 分支 master 进行变基,遇到冲突 解决后需要执行, git rebase --continue
当需要保留详细的合并信息的时候建议使用git merge,特别是需要将分支合并进入master分支时; 当频繁进行了git commit提交时,不必提交过多的信息时,可以尝试git rebase。
建议不要在公共分支使用rebase,因为公共分支的commit 一般不应放到次分支后面
变基操作的 实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。 如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟
add
将文件添加进暂存区(Stage)
git add . #提交修改+新文件
git add -u #提交修改+删除
git add -A(--all) #提交所有变化
git add .
操作后,删除的工作区的文件
怎么恢复 前提是在删除后没有 git add
操作
- git reset head 文件地址加名称
- git checkout -- 文件地址加名称
commit
- 将暂存区文件提交到当前分支
- 如果不填写注释信息会报错:
Aborting commit due to empty commit message.
舍弃本地修改
1. 没有使用过 add 操作
git checkout -- 文件地址加名称
git checkout . #但是不会删除掉刚新建的文件
2. 有过 add 操作
git reset HEAD 文件地址加名称
git reset HEAD . #操作后需要继续使用步骤1的操作
3. 已经 commit,参考如下 reset
回退
reset
删除了某个提交后的所有提交 不会产生新的提交记录,推送远程需要强制推送
git reset --soft HEAD^ #取消最近一次的commit 然后提交到远程 git push -f 建议少用
git reset --hard commit_id #完成撤销,同时将代码恢复到commit_id对应版本
git reset commit_id #完成撤销,不对代码修改进行撤销
# 完整的一次回退,修改,上线,合并操作步骤
# 已master分支为例
1. 已master为准 创建新分支 hotfix
2. 切换到 hotfix 分支
3. 执行reset到相应的提交节点
4. 修改代码,打包测试等操作,commit代码
5. 测试完成后将hotfix代码合并到master,处理冲突
6. 打tag推送
如果是直接在 master reset了代码,务必立即以此为准创建新分支,再将master 代码reset回最新的提交,否则最新的代码会丢失
master查看最新的提交记录用 git reflog
revert
撤销某个commit,再生成一个commit 不会对其它的提交产生影响 提交远程 直接 push 就好
git revert commit_id #撤销某次提交
git revert --abort #撤销过程中可以放弃撤销
如果撤销了某次的提交,后续又需要将撤销的代码加回来,只需要把 revert 新生成的那条 commit 再 revert 一下就好
注意处理冲突,一般会有 REVERTING 等提示
分支操作
新建分支时会基于当前所在分支commit的内容新建。所以新建的分支会包含所有所基于的分支内容。
git branch --set-upstream-to=origin/远程分支名 本地分支名 #设置追踪
branch #显示所有分支(*表示当前所在分支)
branch branchName #创建新分支
checkout -f branchName #强行切换分支
checkout –b branchName #创建新分支并切换到该分支
branch –d branchName #删除分支
branch -D branchName #强行删除分支
远程分支操作
- git remote add anyname url
anyname为别名; url: 远程仓库地址链接 如:https://github.com/WarrenHewitt/blog-code.git
一般 anyname 默认为 origin,当设置完成后,在推送代码时可以直接 git push anyname branchName 托送代码到指定仓库的指定分支
当用git clone时默认的anyname为origin。
- git push (-f) url branchName 根据 url 地址推送
- git push origin [localbranch | HEAD(就是当前活跃分支的游标)] : remotebranch (当远程和本地分支相同时可以简写:git push origin branchname)
这里的 origin 可以替代为 url 仓库地址
git push origin localbranch:remotebranch 创建远程分支 确保本地已有 localbranch 分支
git push origin :remotebranch 删除远程分支 || git push origin --delete remotebranch
git pull origin remotebranch:localbranch 表示获取远程分支的更新与本地分支合并.
git pull origin remotebranch 表示与当前本地分支合并; 相当于 git fetch origin 和git merge origin/remotebranch
- 查看某个作者的所有commit:
git log --author=name -5
git log --pretty=oneline -5
git log --oneline -5
git log --pretty=format:"%cn %s" -8
格式化输出commit的前8条git log -10 --grep=查询内容
git log --author=Warren --pretty=format:"%cn %s" -8
git log --author="Warren" --since="2023-01-31 00:00:00" --until="2023-12-31 00:00:00" --pretty=format:"%cn %s" -8
git branch --contains commitID
查询某个commit在哪些分支中存在
git remove prune
清理本地所有已经删掉的远程分支参照,但是不会删除本地分支
- 更新远程跟踪分支:
git fetch origin
获取远程的所有分支,不然branch -a 查看不到新的远程分支git fetch origin master
只取回特定分支的更新
- git branch命令的 -r 选项,可以用来查看远程分支,-a选项查看所有分支
- 拉取远程分支并创建本地分支
git checkout -b localBranch origin/originBranch
git fetch origin originBranchName:localBranchName
区别是不会切换到本地新分支
tag 相关操作
给仓库历史中的某一个提交打上标签
git tag -a v1.0.0 -m 'describe' #打tag
git push origin v1.0.0 #推送单个 推送后 查看tag 会有最新的 commit 的代码,
git push origin --tags #推送多个tag origin 可以省略
#如果没有push分支代码,那么在远程分支上是没有最新commit代码的,这是两个独立的过程
git tag #显示所有tag
git show v1.0.0 #显示tag详情
git fetch origin tag v1.0.0 #拉取远程tag
git tag -d v1.0.0 #删除本地标签
git push origin :refs/tags/v1.0.0 #删除远程标签
#检出某个tag版本代码
git checkout -b branchName tagName
#查看代码 提示 You are in 'detached HEAD' state 直接切换到其它分支即可 如果强行修改代码,注意commit
#再切换分支时会有提示希望创建分支来保存以上修改 按提示操作即可
git checkout tagName
存储与清理
- 不想提交脏的状态
- 新增的文件不会被存储,所以需要先 add
#将你没有提交的内容全部存储;当前分支也不会保留这部分内容,只有重新apply才会将这些内容放入当前分支
git stash
git stash save '备注信息'
git stash list #查看存储的列表,按时间降序排列
git stash apply #应用最近的存储
git stash pop #和 apply 功能一致,但会将stash列表中的信息进行删除
git stash pop stash@{值}
git stash apply stash@{值} #值: git stash list 查看
git stash drop stash@{值} #移除某个暂存 值:同上
git stash clear #清空本地暂存栈信息