Git基础使用
首先,我们这里选用
GitHub
作为代码存储仓库,git bash
是我们常用的git操作窗口(cmd也可以,建议用git bash)。GitHub:https://github.com/
注册GitHub账号并安装好git就可以在项目目录下右键打开git bash了。
设置/查看git用户名和邮箱:
1
2
3
4
5
6
7# 设置用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
# 查看用户名和邮箱:
git config user.name
git config user.email接下来就要连接仓库了,这时候就需要SSH Key添加到项目owner(项目拥有者)的GitHub上。
创建SSH Key
在项目主目录或者系统的目录(
C:\Users\[账号,默认是Administrator]\.ssh
)下,看看有没有.ssh
目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果有,跳到下一步。如果没有,打开Shell(或者Git Bash),创建SSH Key:1
ssh-keygen -t rsa -C "[youremail@example].com"
这里的
youremail@example.com
是GitHub的注册邮箱。如果一切顺利的话,可以在项目主目录或者(C:\Users\[账号,默认是Administrator]\.ssh
)里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人,所以大胆地把id_rsa.pub
告诉我吧。
owner根据你的GitHub账号(注册邮箱)和id_rsa.pub就能将你拉入项目组里面了,然后团队开发的环境就建立起来了。
接下来描述一下团队开发方式。
第一步:若本地没有从GitHub上下载过代码,那么请在一个文件夹下打开git bash ,直接使用下面命令拿取代码到当前目录:
1
git clone git@github.com:Cheerfulion/scut-v2.0.git
git clone 命令后面的
git@github.com:Cheerfulion/scut-v2.0.git
这么一串是项目的git地址,可以在任何一个git的托管平台项目上看到,而且不需要建立链接(即不需要添加你的ssh key到他的项目上)就能下载代码。GitHub的git地址显示位置如下:第二步:在项目上创建新的分支,在新的分支上进行代码调整,调整完成后到第三步。
第三步:提交前担心有冲突可以先git pull同步下代码,然后add并且commit提交本次修改。(git pull就是git fetch和git merge的集合)
第四步:最后使用git push提交当前分支到远程仓库就完成。(注意:一般在正式项目上是不允许提交的当前分支是dev或者master分支的,这两个分支提交到远程也是对应远程的dev和master分支,而这两个分支通常都是要保证绝对无误的,也就是要测试部门测试通过才能合并。)
Git 基础命令
查看分支:git branch
前面带*号的是远程分支。默认是查看本地分支,带上参数 -r是查看远程分支,-a是远程和本地的所有分支
创建分支:git branch
1 | # 示例1 从本地某一分支继承代码创建新分支 |
切换分支:git checkout <branch-name>
创建并切换分支:git checkout -b <new_branch_name>
删除分支:git branch -d <branch_name>
查看两个版本的差异:
查看两个提交版本的修改记录差异:git diff [commit-id1] [commit-id2]
查看两个提交版本修改文件差异:git diff [commit-id1] [commit-id2] --stat
若你的代码不是从远程克隆(git clone)下来的,提交代码到远程时就会因为没有关联到远程库而失败,关联远程库使用下面命令(后面的依旧是git地址,和git clone倒是很相似):git remote add origin git@[server-name]:[path]/[repo-name].git;
之后就可以使用 git push -u origin
备注:今天这样子执行遇到一个问题,如下:
解决方法来自:https://jingyan.baidu.com/article/f3e34a12a25bc8f5ea65354a.html
今天(2019-06-06 23:38)又遇到了上面这个问题,无法使用git pull –rebase origin master 解决。
解决方法:
参考:https://blog.csdn.net/u012145252/article/details/80628451
git三种回退类型和两种回退方式
回退的三种类型:soft mixed(默认) hard
在本地git会分三个区:工作区、暂存区、本地库。
hard
①移动本地库HEAD指针②重置暂存区
③重置工作区
意思就是,回滚后,工作区和你回退版本的代码是一致的。
soft
①移动本地库HEAD指针意思就是,回滚后,仅仅是把本地库的指针移动了,而暂存区和你本地的代码是没有做任何改变的。
mixed
①移动本地库HEAD指针②重置暂存区
意思就是,回滚后,不仅移动了本地库的指针,同时暂存区的东西也没了。
回退的两种方式 HEAD~n commitID
HEAD~n
回退到倒数第n个版本,如强制回退到上个版本是:
1
git reset --hard HEAD~1
commitID
回退到指定版本
1
2
3
4# 通过 git log 或者 git reflog 拿到 commitID
git log
# commit 8a56a0d19766c237328c2941794769219053cf5f (HEAD -> master, origin/master)
git reset --hard 8a56a0d19766c237328c2941794769219053cf5f
window下配置.gitignore
在仓库目录下打开GitBash,输入命令
touch .gitignore
常用的.gitignore配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34.mvn
.iml
mvnw
mvnw.cmd
target/
help.md
.cache
.project
.settings
.classpath
*.log
logs/
.idea
.idea/
# dependencies
node_modules/
# production
build/
dist/
# misc
.idea/
.happypack
.DS_Store
npm-debug.log*
yarn-debug.log*
yarn-error.log*
application.properties保存,提交到本地仓库
配置无效几种情况
命令格式错误
在配置语句的前后面添加空格、Tab、注释等,会导致当前行的配置语句失效
配置语句对已经add、commit或者远程仓库存在的文件无效
.gitignore只能忽略原来没有被追踪的文件,如已被纳入了版本管理中,则修改.gitignore是无效的
对于提交到了远程仓库的文件,解决方法参考这里:https://segmentfault.com/q/1010000000430426
这里提供对于已经关联git的文件忽略的处理方法,比较难以理解的就是用上面最后一点文章里面提到的 “删除本地缓存” 的方法,即:
1
2
3
4 # . 可以改成不希望关联的文件
git rm -r --cached .
git add .
git commit -m 'update .gitignore'我通常使用的最直接暴力的方法,备份文件,删除文件,重新提交并push到远程后(让文件不再被track),再复制备份文件回来
1
2
3
4
5
6 mv node_modules /var/backup/node_modules
rm -rf node_modules
git add .
git commit -m "rm node_modules"
git push
mv /var/backup/node_modules node_modules
Git删除工作区或暂存区或版本库中的文件
原文链接:https://www.cnblogs.com/cposture/p/git.html, 略做补充修改。
基础说明:
我们知道Git有三大区(工作区、暂存区、版本库)以及几个状态(untracked、unstaged、uncommited),下面只是简述下Git的大概工作流程,详细的可以参见本博客的其他有关Git的文章【链接】。
打开你的项目文件夹,除了隐藏的.git文件夹,其他项目文件位于的地方便是工作区,工作区的文件需要添加到Git的暂存区(git add),随后再提交到Git的版本库(git commit)。
首次新建的文件都是untracked状态(未跟踪),此时需要git add到暂存区,Git便会在暂存区中生成一个该文件的索引,文件此时处于uncommited状态,需要git commit生成版本库。添加到了版本库之后,再对文件进行修改,那么文件的状态会变为unstaged状态。
简单的认识了Git的工作流程,接下来便可以看看如何删除错误添加到暂存区或版本库里的文件了!
删除修改错误的工作区文件
1 | # 单个文件没有add过的修改撤销 |
删除错误添加到暂存区的文件
有时你在工作区新建了文件TestFile,并且已经将它添加到了暂存区,git会告知,现有有一个文件未提交到版本库,如下图:
仅仅删除暂存区里的文件
git rm --cache 文件名
上面的命令仅仅删除暂存区的文件而已,不会影响工作区的文件,此时输入
git status
,git会告知有一个未跟踪的文件。删除暂存区和工作区的文件
git rm -f 文件名
删除错误提交的commit
有时,不仅添加到了暂存区,而且commit到了版本库,这个时候就不能使用git rm
了,需要使用git reset
命令。
错误提交到了版本库,此时无论工作区、暂存区,还是版本库,这三者的内容都是一样的,所以在这种情况下,只是删除了工作区和暂存区的文件,下一次用该版本库回滚那个误添加的文件还会重新生成。
这个时候,我们必须撤销版本库的修改才能解决问题!
git reset有三个选项,--hard、--mixed、--soft
。
1 | # 仅仅只是撤销已提交的版本库,不会修改暂存区和工作区 |
1 | # 仅仅只是撤销已提交的版本库和暂存区,不会修改工作区 |
1 | # 彻底将工作区、暂存区和版本库记录恢复到指定的版本库 |
那我们到底应该用哪个选项好呢?
(1)如果你是在提交了后,对工作区的代码做了修改,并且想保留这些修改,那么可以使用git reset –mixed 版本库ID,注意这个版本库ID应该不是你刚刚提交的版本库ID,而是刚刚提交版本库的上一个版本库。如下图:
(2)如果不想保留这些修改,可以直接使用彻底的恢复命令,git reset –hard 版本库ID。
(3)为什么不使用–soft呢,因为它只是恢复了版本库,暂存区仍然存在你错误提交的文件索引,还需要进一步使用上一节的删除错误添加到暂存区的文件,详细见上文。
nano如何使用?
git的默认编辑器是nano,使用方法见下文。
http://www.vpser.net/manage/nano.html
在gitlab创建项目仓库后提示记录
1 | ## Git global setup |
Conventional Commits 规范
Commit 规范有助于团队成员更好地理解每次提交所做的更改,方便项目的维护和管理。
Conventional Commits 规范 是目前最流行的 Commit 规范,它的格式如下:
1 | <类型>[可选 范围]: <描述> |
- 类型(Type):描述提交的性质,常用类型如下:
feat
:新增功能。fix
:修复 bug。docs
:文档相关的修改,如 README、注释等。style
:不影响代码逻辑的格式调整,如空格、缩进、分号等。refactor
:代码重构,既不是新增功能也不是修复 bug。perf
:性能优化。test
:添加或修改测试代码。chore
:构建过程或辅助工具的变动,如更新依赖、配置文件等。
- 范围(Scope):可选字段,用于说明本次提交影响的范围,比如某个模块、功能或文件。
- 描述(Description):对提交内容的简短描述,应使用祈使句,首字母小写,结尾不要加句号。
- 正文(Body):可选字段,对本次提交进行更详细的说明,可包含修改的原因、背景等。
- 脚注(Footer):可选字段,可用于关联 issue、Breaking Changes 等信息。
示例
1 | feat(user-module): add user registration feature |
关于如何在项目中约束提交,可见:开发者必看!在团队中我是这样实现 Git 提交规范化的
Git使用场景处理方法
删除untracked files(略)
1 | ## 删除 untracked files |
危险操作,了解即可
放弃本地全部修改,将远端库强制覆盖到本地
1 | git fetch --all |
有时候同一个分支,远程的和本地的都被修改的面目全非了,这时候想要把本地的替换成远程的用该方式非常方便
忘记切换分支,误将代码提交到了别的远程分支
1 | # 回滚提交 reset |
如何快速关联/修改Git远程仓库地址
方法一(最推荐): 把修改旧Git地址,添加新的Git远程仓库地址
1
2
3
4
5
6git remote rename origin old-origin
git remote add origin git@gitlab.xxx.cn:xxx/xxx.git
git push -u origin --all
git push -u origin --tags
# 查看结果
git remote -v方法二:删除本地仓库当前关联的无效远程地址,再为本地仓库添加新的远程仓库地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 查看git对应的远程仓库地址
git remote -v
# 删除关联对应的远程仓库地址
git remote rm origin
# 查看是否删除成功,如果没有任何返回结果,表示OK
git remote -v
# 重新关联git远程仓库地址
# 这里需要注意,关联https的话部署秘钥是无效的,还是要通过账号密码去拉取代码。
# 如果一定要关联https的路径的话,可以百度下缓存账号密码的方式
git remote add origin git@gitlab.xxx.cn:xxx/xxx.git
# 测试是否可以连接到远程仓库,如果没有welcome,需要配置秘钥(参考上面的ssh key生成)
ssh -T git@gitlab.xxx.cn
# 设置关联,这里是关联本地master分支和远程master分支
git branch --set-upstream-to=origin/master master方法三:直接修改本地仓库所关联的远程仓库的地址
1
2
3
4
5
6# 查看远程仓库名称:origin
git remote
# 查看远程仓库地址
git remote get-url origin
# 如果未设置ssh-key,此处仓库地址为 http://... 开头
git remote set-url origin https://github.com/developers-youcong/Metronic_Template.git方法四:修改 .git 配置文件
1
2
3
4# 进入.git目录
cd .git
# 修改config配置文件,快速找到remote "origin"下面的url并替换即可实现快速关联和修改
vim config
撤回远程仓库里面的提交记录(略)
git log 查看要回退到的版本号
git reset [–soft| –mixed | –hard] <版本号>
git push –force
因gitlab的提交历史在本地的前面,需要加上–force强制推送,需要注意的是对于保护分支依旧会报错,这时需要管理员暂时取消分支保护。
当然这种做法不可取,但是如果你不小心在远程仓库的提交信息里面写了老板的坏话的话还是用该方法保命吧,哈!一般来说,分支的合并会有专人审核,所以基本上该方法不会使用到,但是了解总归没错的。
去除gitlab对分支的保护(略)
有时候对master分支进行强制push【git push -f】时会报错
这是因为master分支受保护,处理方式是去掉这个保护。解决方法如下:
找到Branches—-project setting –Protected Branches–点击master的unprotect即可。
解决 git pull/push 每次都要输入用户名密码的问题
首先明确一点:出现这种问题的原因都是因为使用 http 的方式拉取代码才出现的,如下图所示:
第一种解决方法(windows)
出现上面这种情况 先按提示输入用户名和密码,接着执行 git config –global credential.helper store
这句命令的意义是在本地生成包含 git 账号和密码的文件,具体操作如下图:
检验方式:C:\Users\你的电脑名; 这个文件夹(如下)下面是否能找到.git-credentials文件,如果文件的内容是有关你的gitlab的设置,格式为:http://{用户名}:{密码}@{git 网址}
再次执行 git pull 操作就不需要再输入用户名和密码了
第二种解决方法(通用)
切换 git 的拉取方式,将 http 改为 ssh 的方式
1、查看clone 地址:git remote -v
2、移除 http 的方式:git remote rm origin
移除完之后再次查看拉取方式会发现为空,此时我们需要添加 ssh 的拉取方式
3、换成 ssh方式: git remote add origin [git 地址]
此时通过 git remote -v 查看会发现成功的从 http 拉取方式切换为 ssh 拉取方式了
大功告成!
Git命令行中文乱码
git默认是不能识别中文的。需要在终端修改能识别中文。
1 | git config --global core.quotepath false |
core.quotepath
设为false
的话,就不会对0x80
以上的字符进行编码。中文显示正常。
本地Git仓库关联多个远程仓库的两种方法
背景
通常情况下,一个本地Git仓库对应一个远程仓库,每次pull
和push
仅涉及本地仓库和该远程仓库的同步;然而,在一些情况下,一个本地仓库需要同时关联多个远程仓库,比如:同时将一个项目发布在Github和Coding上,以兼顾国内外的访客。
那么,如何让一个本地仓库同时关联多个远程仓库呢?
方法1:每次push
、pull
时需分开操作
首先,查看本地仓库所关联的远程仓库:(假定最初仅关联了一个远程仓库)
1 | $ git remote -v |
然后,用git remote add <name> <url>
添加一个远程仓库,其中name
可以任意指定(对应上面的origin
部分),比如:
1 | $ git remote add coding.net git@git.coding.net:KeithNull/keithnull.github.io.git |
再次查看本地仓库所关联的远程仓库,可以发现成功关联了两个远程仓库:
1 | $ git remote -v |
此后,若需进行push
操作,则需要指定目标仓库,git push <repo> <branch>
,对这两个远程仓库分别操作:
1 | $ git push origin master |
同理,pull
操作也需要指定从哪个远程仓库拉取,git pull <repo> <branch>
,从这两个仓库中选择其一:
1 | $ git pull origin master |
方法2:push
和pull
无需额外操作
在方法1中,由于我们添加了多个远程仓库,在push
和pull
时便面临了仓库的选择问题。诚然如此较为严谨,但是在许多情况下,我们只需要保持远程仓库完全一致,而不需要进行区分,因而这样的区分便显得有些“多余”。
同样地,先查看已有的远程仓库:(假定最初仅关联了一个远程仓库)
1 | $ git remote -v |
然后,不额外添加远程仓库,而是给现有的远程仓库添加额外的URL。使用git remote set-url -add <name> <url>
,给已有的名为name
的远程仓库添加一个远程地址,比如:
1 | $ git remote set-url --add origin git@git.coding.net:KeithNull/keithnull.github.io.git |
再次查看所关联的远程仓库:
1 | $ git remote -v |
可以看到,我们并没有如方法1一般增加远程仓库的数目,而是给一个远程仓库赋予了多个地址(或者准确地说,多个用于push
的地址)。
因此,这样设置后的push
和pull
操作与最初的操作完全一致,不需要进行调整。
总结
以上是给一个本地仓库关联多个远程仓库的两种方法,二者各有优劣,不过出于简便考虑,我最终采用了方法2。
此外,上述内容中涉及到的Git指令略去了许多不常用的参数,如需更加详细的说明,可以查阅Git文档,或者直接在命令行运行git remote --help
。
统一项目的换行符
ps:如果提交的代码diff的时候显示一些没有修改的地方也修改了,而且还是几乎整个文件的时候,就可以检查是否是换行符的问题了。这个在IDE的diff时候也有提示,只是不太明显。
格式化与空白是许多开发人员在协作时,特别是在跨平台情况下,遇到的令人头疼的细小问题。由于编辑器的不同或者Windows程序员在跨平台项目中的文件行尾加入了回车换行符,一些细微的空格变化会不经意地进入大家合作的工作或提交的补丁中。不用怕,Git 的一些配置选项会帮助你解决这些问题。
core.autocrlf概念
Git可以在你提交时自动地把行结束符CRLF转换成LF,而在签出代码时把LF转换成CRLF。用core.autocrlf来打开此项功能,如果是在Windows系统上,把它设置成true,这样当签出代码时,LF会被转换成CRLF:
$ git config --global core.autocrlf true
表示要求git在提交时将crlf转换为lf,而在检出时将crlf转换为lf。
Linux或Mac系统使用LF作为行结束符,因此你不想 Git 在签出文件时进行自动的转换;当一个以CRLF为行结束符的文件不小心被引入时你肯定想进行修正,把core.autocrlf设置成input来告诉 Git 在提交时把CRLF转换成LF,签出时不转换:
$ git config --global core.autocrlf input
表示在提交时将crlf转换为lf,而检出时不转换 。
这样会在Windows系统上的签出文件中保留CRLF,会在Mac和Linux系统上,包括仓库中保留LF。
如果你是Windows程序员,且正在开发仅运行在Windows上的项目,可以设置false取消此功能,把回车符记录在库中:
$ git config --global core.autocrlf false
表示提交和检出代码时均不进行转换
实际项目处理建议:
如果项目中没有对源文件的换行符作出规定,在Mac/Linux上设置 autocrlf = input, 在Windows上设置autocrlf = true(默认值);
这样的话,- Windows:(true)
提交时,将CRLF 转成 LF再提交;
切出时,自动将LF 转为 CRLF; - MAC/Linux: (input)
提交时, 将CRLF 转成 LF再提交;
切出时,保持LF即可;
即可保证仓库中永远都是LF. 而且在Windows工作空间都是CRLF, 在Mac/Linux工作空间都是LF.
- Windows:(true)
. 如果项目对源文件的换行符作出强制规定,比如在.editorconfig文件中设置
end_of_line = lf
:
那么就没必要autocrlf = true;因为此时工作区代码会因为上面这个设置换行符作了强制规定为LF,如果autocrlf 再设为true就会有冲突了;
此种情况autocrlf = input即可。文件的换行符类型可以在编辑器(如VSCODE,IDEA等)的右下角查看。
注意:当修改了autocrlf的值后,项目代码最好删除再重新clone,不然本地文件换行符不会自动变的。
名词解释
- CR:Carriage Return,对应ASCII中转义字符\r,表示回车
- LF:Linefeed,对应ASCII中转义字符\n,表示换行
- CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
众所周知,
- Windows操作系统采用两个字符来进行换行,即CRLF;
- Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;
- 另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。
交互式rebase
案例1: 修改提交信息
当我们项目的git commit message需要修改时,可以使用git rebase -i 进行修改
1 | # git rebase到需要修改message的那个commit的前1个commit,这里假设commit id是32e0a87f |
交互式rebase的其他操作有:
1 | reword:修改提交说明 |
git worktree
团队的一个痛点:在maint版本和feature版本交集阶段,在feature版本分支开发新特性过程中,当有maint版本的Bug时,需要切换到maint版本分支修复Bug——由于2个版本分支的工程依赖环境差异较大,导致每次切换分支后,工程都都需要重新安装依赖以及做全量编译——这无疑增加了编译时间,导致开发效率下降。
针对这个痛点,目前发现 git worktree 这个方案有助解决。
git worktree方案可以概括为:通过创建共享版本仓库的多个工作区,实现多分支并行开发,从而实现多个工程环境的缓存,达到提升开发效率的目的。具体地:
可为一个分支创建一个工作区
每个工作区的工程环境独立运行
每个工作区共享同一个版本仓库信息
相比通过git clone方式创建多个独立工程环境的工作区,git worktree的优点在于:
- 更节省硬盘空间
git clone方式下,每个工作区都有一个版本仓库
git worktree方式下,每个工作区共享同一个版本仓库,节省了n-1/n(n为工作区数量)的硬盘空间 - 各个工作区之间的更新同步更快
git clone方式下,A工作区和B工作区同步更新的路径:A工作区commit - A工作区push - B工作区pull
git worktree方式下,A工作区只要本地提交更新后,其他工作区就能立即收到(因为它们共享同一个版本仓库)
git worktree的使用示例如下:
- 为maint_branch分支创建一个工作区maint_branch_worktree
1 | # maint_proj 工程目录 |
如果需要拉取一个不存在的分支,可加-b参数,在拉取worktree的同时创建新分支
1 | git worktree add ../new-dir -b a-not-existing-branch |
- 进入工作区maint_worktree上完成修复Bug工作
1 | # ios 工程目录 |
- 在工作区maint_worktree上完成修复Bug工作后,清理工作区maint_worktree
1 | # maint_proj 工程目录 |
worktree指令汇总:
1 | # 添加worktree |
补充:在工程项目中,存在不关联版本库的依赖文件,这些文件也会占据不小的空间。因此可以使用软链接的方式,将相同的依赖文件“拷贝”到工作目录
1
2 # 下面以windows下链接node_modules为例,将master分支的工作目录下的依赖库链接到5DCV2这个工作目录(管理员权限执行)
mklink /d "E:\project\mysite\5DCV2\node_modules" "E:\project\mysite\master\node_modules"
生成配置多个ssh key
和正常生成ssh key步骤基本一致,下面只说明需要做的不同操作
在
C:\Users\ion\.ssh
目录打开 git Bash输入命令生成ssh key(注意文件命名为id_rsa_gitlab)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22ion@ionluo MINGW64 ~/.ssh
$ ssh-keygen -t rsa -C "xxx@xxx.cn"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/ion/.ssh/id_rsa): id_rsa_gitlab
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_gitlab.
Your public key has been saved in id_rsa_gitlab.pub.
The key fingerprint is:
SHA256:vj5yEob7adQDENEltqHSfY3qO4GQLkws4qthzPR/j0Y xxx@xxx.cn
The key's randomart image is:
+---[RSA 2048]----+
| o+=o+. |
| o +o+o. |
|.. . +. |
|=o . . |
|Bo o . oS |
|=+o + +Eo |
|o+.. *.... |
|.o = +++. |
|o ==*+o |
+----[SHA256]-----+添加私钥
1
2# 由于ssh-agent默认只识别id_rsa,因此还需要添加秘钥id_rsa_gitlab,如下:
ssh-add ~/.ssh/id_rsa_gitlab报错:unable to start ssh-agent service, error :1058
使用管理员权限运行 Power Shell,然后执行
Set-Service -Name ssh-agent -StartupType automatic
*这里是把 ssh-agent 的启动类型设置为自动方式
配置 config 文件
在.ssh文件夹中手动创建config文件或者输入命令
touch config
生成,并按下面的模板填写,该文件用于配置私钥对应的服务器。1
2
3
4
5# gitlab
Host gitlab.xxx.com
HostName gitlab.xxx.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gitlab配置说明:
Host:自定义别名,会影响git相关命令
HostName:真实的服务器地址(域名)
User:之前配置的用户名可以省略(xxx@xxx.com)
PreferredAuthentications:权限认证(publickey,password publickey,keyboard-interactive)一般直接设为publickey
IdentityFile:rsa文件地址添加生成的id_rsa_gitlab.pub到远程git仓库后,通过下面命令验证是否成功
1
ssh -T git@gitlab.xxx.com
设置仓库的账号邮箱和用户名(默认用的是全局的)
1
2
3
4
5
6
7# 全局设置
# git config --global user.email “xxxx@xx.com”
# git config --global user.name “xxxx”
# 单独设置每个repo 用户名/邮箱
git config user.email “xxxx@xx.com”
git config user.name “xxxx”设置好后就可以git commit 验证下提交的代码用户是否正常,git push确认是否可以提交远程
差异比较
显示 branchA 中存在,branchB 中不存在的提交
1 | git log --oneline branchA ^branchB |
显示 branchA 和 branchB 差异的文件名
1 | git diff --name-only branchA branchB |
显示 branchA 和 branchB 差异的哈希
1 | git rev-list branchA ^branchB |
显示 commitA 和 commitB 的差异
1 | git diff commitA commitB |
参考:https://www.leevii.com/2023/05/compare-commit-diffs-in-git.html
https://www.techiedelight.com/zh/find-differences-between-two-commits-git/
不同仓库间的cherry-pick
有的时候项目过于复杂会需要将仓库拆成2个仓库进行维护,如客户仓库和产品仓库。当产品仓库迭代的时候,客户仓库也需要可以拉取产品仓库的提交。
1 | step 1: |
git alias
通过命令设置 alias
1 | git config --global alias.a add |
通过 git 配置文件设置 alias
1 | # Linux下是 ~/.gitconfig 文件,Window下是 |
之前的都是我们自己配置的一些 git alias,当然有别人给我们配好了的可以从 gitalias 获取。
1 | npm i -g git-alias |
报错处理
fatal: Authentication failed for 'https://xxx.git/
报错原因:使用https验证的git仓库,同步代码需要输入账号密码,而window系统输入一次账密后是保存在window凭据中的,下次执行拉取代码会自行使用Window中的凭据
解决方法:删除git的window凭据,重新拉取输入正确的账号密码
fatal: Out of memory, malloc failed (tried to allocate 2000000000 bytes)
原因:因用了其他博客的解决方案使用了下面命令导致,修改成正常大小即可。
解决:git config --global http.postBuffer 125000
error: object file .git/objects/xx/xxxxx is empty
- 备份.git目录
1 | cp -a .git .git-old |
- 根据修复提示删除空对象文件。根据最早的空文件提示也删除那个文件。
1 | git fsck --full |
- 删除后再次查看修复提示,说明Head commit无效。
1 | git fsck --full |
- 找到当前分支Head的前两条数据。
1 | tail -n 2 .git/logs/refs/heads/master |
- 第一条Head是无效的。我们需要确认第二条是我们的上次失败的commit的前一个提交。
1 | git show ed41eac57be18e8d112ca5bb898dd77c3b120321 |
- 设置确认的commit为HEAD commit
1 | git update-ref HEAD ed41eac57be18e8d112ca5bb898dd77c3b120321 |
- 再次使用 git status 和 git reflog 看看功能是否正常了。如果还不行。重启下电脑。
https://stackoverflow.com/questions/11706215/how-to-fix-git-error-object-file-is-empty
4. There are too many unreachable loose objects; run 'git prune' to remove them.
此处是git仓库太大导致的报错,关于git的清理(gc),目前了解不多,可以参考下面方式处理,代深入了解后再整理归纳说明。
1 | (web) ion@ubuntu:~/projects/web/app/static$ git pull |
fatal: unable to access ‘https://github.com/getsentry/onpremise.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
原因查找:我这里发现是这个仓库的链接国内无法访问,因此要设置git代理来访问(需要搭梯子)。
1
2
3
4
5
6
7
8
9
10
11#设置socks5代理或者http代理(任选一种)
git config --global http.proxy 'socks5://172.20.0.62:8388'
git config --global https.proxy 'socks5://172.20.0.62:8388'
git config --global http.proxy 'http://127.0.0.1:45077'
git config --global https.proxy 'http://127.0.0.1:45077'
# 这时候就可以克隆了
# 如果之后要删除代理,使用如下命令
git config --global --unset http.proxy
git config --global --unset https.proxy
本文链接: http://www.ionluo.cn/blog/posts/6b82922c.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!