Git 环境搭建

安装 Git

添加 SSH key

  1. 创建 ssh key
1$ ssh-keygen -t rsa -C "cold@google.com"
  1. 克隆代码库报错,查看调试信息
1$ ssh -vv -p 29418 [git服务器IP地址]
  • 验证 publickey 时,本地提供了私钥/home/user/.ssh/id_rsa,但是 no mutual signature algorithm 无互签名算法,尝试 ed25529 等算法但是没有匹配的认证方式。
  • 解决办法是提供 ecdsa,ed25519,dsa 等算法的公钥和私钥对。
  1. 查看当前 OpenSSH 版本:
1$ ssh -V [git服务器IP地址]

image-20230703171108847

OpenSSH 8.8 考虑到cryptographically broken,开始禁用了使用SHA-1哈希算法的RSA签名算法。 这是一个客户端限制,我们必须提供能被OpenSSH 8.8认可的密钥类型,比如 OpenSSH 推荐的Ed25519

  1. 使用 Ed25519 算法
1# 生成ed25519密钥
2$ ssh-keygen -t ed25519 -C "your_email@example.com"
3# 将私钥添加到身份验证代理
4$ ssh-add

Git 拉取远程指定分支到本地 1

  1. 将远程指定分支拉取到本地指定分支上:
1$ git pull origin 远程分支名:本地分支名
  1. 将远程指定分支拉取到本地当前分支上:
1$ git pull origin 远程分支名
  1. 将与本地当前分支同名的远程分支拉取到本地当前分支上(需先关联远程分支):
1$ git pull
  1. 将本地分支与远程同名分支相关联
1$ git push -u origin 远程分支名

Git 本地推送到远程指定分支

  1. 将本地当前分支推送到远程指定分支上(注意:pull 是远程在前本地在后,push 相反):
1$ git push origin 本地分支名:远程分支名
  1. 将本地当前分支推送到与本地当前分支同名的远程分支上
1$ git push origin 本地分支名

3.将本地当前分支 推送到 与本地当前分支同名的远程分支上(需先关联远程分支)

1$ git push

Gerrit 提交代码

1$ git commit -m "xxx"
2$ git push origin HEAD:refs/for/master

注意commit提交规范

1$ git reset --soft HEAD^   # 撤销最近一次 commit
2$ git reset --soft HEAD^2  # 撤销最近两次 commit
3$ git log                  # 查看最近提交日志

修改提交

1$ git commit --amend     # 在上次提交的基础上
2$ git push origin HEAD:refs/for/master

git pull 撤销误操作

  1. git reflog 查看历史变更记录

  2. git reset --hard HEAD@{n},(n 是你要回退到的引用位置)回退,如:

    1$ git reset --hard 911c4e90
    

git pullgit reset --soft HEAD^失败:Cannot do a soft reset in the middle of a merge

1$ git reset --merge  # 取消合并
2$ git rebase         # 将当前分支重新设置基线

git pull 冲突 (Deprecated)

冲突怕了,现在基本上都是每次写之前先 pull,写完 push 前也先 pull

可以参考:git pull 时冲突的几种解决方式

git push (Deprecated)

以前没事就 git pull,git push,在没有顺利的按照顺序 merge 就进行这些操作是非常糟糕的,导致经常出现 push 错误,现在的做法是每新增一个业务就新建代码库,直接拷贝 gerrit 上最新的代码,在此基础上进行开发,这样就避免了很多冲突,非必要的情况下不需要经常去拉取最新的代码,特别是目前你在做的有冲突的,在确认 merge 后再小心的拉取到本地。

Git 修改 Commit Message

  1. git commit --amend:修改最近一次 commit 的 message;
  2. git rebase -i:修改某次 commit 的 message。

Git 合并多次 commit

已经 commit 了一次,还 push 到远程了,修改后又 commit 了一次,且 push 了,过一段时间把第一次的 abandon 了,在合入的时候报错,因为第一次的不见了,第二次是修改和补充的内容,在我本地是没有问题的,同事在合入的时候则会出现问题。

我需要合并这两次提交,可以使用 rebase 命令

1$ git rebase -i HEAD~2

修改第二行 picksquash或者s(按提交顺序)这里的编辑器不是 vim,搞得我退不出来,这是 nano 编辑器,直接 control + x, Y 确定, 然后回车确定文件名。

pick:执行这个 commit squash:这个 commit 会合并到前一个 commit

在这里插入图片描述

注释掉不需要的 commit 描述,我选择的是注释掉旧的,因为我需要基于上一次的 change amend 一下。 保存退出后会有 successful 提示,ammend 后再次 push 就好了。

git stash

 1$ git stash save "message"
 2$ git stash list            # 查看现有stash
 3$ git stash pop             # 重新应用缓存的stash,最近的一个,恢复后删除该暂存
 4$ git stash pop stash@{n}   # 指定恢复某个stash,恢复后删除该暂存
 5$ git stash apply stash@{n} # 指定恢复某个stash,恢复后保留该暂存
 6
 7$ git stash drop n          # 移除某个stash
 8$ git stash clear           # 删除所有缓存的stash
 9
10$ git stash show stash@{1}  # 查看某个暂存的差异

git checkout 和 git cherry-pick

获取尚未 merge 的代码到本地,一般有两种选择(不包括直接修改和打补丁 patch):

1$ git checkout FETCH_HEAD       # 工作目录反射(reflect)了 X
2$ git cherry-pick FETCH_HEAD	# X 获取 Y

在第一个命令中,只是切换到远程更改,而在最后一个命令中,将远程更改应用到当前分支。

Inspired by