[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

  1. cd ~/.ssh : 查看用户根目录是否有 ssh 文件

  2. 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 –amend

  • post-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 -5git log --pretty=format:"%cn %s" -8 格式化输出commit的前8条 git log -10 --grep=查询内容git log --author=Warren --pretty=format:"%cn %s" -8git 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             #清空本地暂存栈信息
Last Updated:
Contributors: Warren, Warren