不小心使用 git 强制 push 推送了代码, 希望回退到 push 前的状态

如果不小心使用 git 强制 push 推送了代码,还可以回退到 push 前的状态。主要可以通过以下两种方式:

  1. 使用 git reflog 查找回退到 push 前的 commit

git reflog 会记录最近的操作和 commit 记录,找到 push 前的提交点。

然后使用 git reset --hard <commit> 回退到那个提交点即可。

  1. 如果进行了多次 push,reflog 记录很乱,可以回退到某个知道的良好版本

例如回退到版本 v1.2:

1
git reset --hard v1.2

然后使用 git push -f 强制推送来覆盖之前的错误提交。

当然最好的方式还是在推送前使用 git stash 暂存变更,或新建分支进行操作。

但强制 push 后的恢复还是可以的,主要是使用 git 提供的回退机制来撤销错误的提交。

git通过ssh认证拉取代码失败,需要手动输入密码:

  • 解决方法

eval ssh-agent -s #启动ssh-agent
ssh-add "私钥文件地址" # 添加私钥到agent 如:ssh-add "c:/Users/xxx/.ssh/id_rsa"

  • 第二步提示: Could not open a connection to your authentication agent

执行ssh-agent bash

ssh-agent是用于管理SSH private keys的, 目的就是对解密的私钥进行高速缓存。ssh-add提示并将用户的使用的私钥添加到由ssh-agent维护的列表中;git拉取代码的时候,直接使用这里的ssh私钥和远端库中的公钥做认证,不用手动再输入密码。
windows下打开git bash后,将上面两行命令加入到/etc/bash.bashrc中可以解决每次打开git bash都需要手动执行ssh-agent和ssh-add的不便

提示Key is invalid

此时我们可以使用私钥,也就是生成秘钥对时的两个文件之一 :id_rsa,我们将id_rsa复制一份,命名为id_rsa.ppk作为私钥。 id_rsa里面的内容是私钥,但文件格式不是私钥,只保留备份即可,如下。

除此之外我们需要一个非常小巧的秘钥生成工具puttygen,下载链接 https://www.puttygen.com/download-putty 找到 puttygen.exe 选择32或64位版本,下载

首先我们确保秘钥类型是RSA, 字节数默认是2048, 对应ssh-keygen -b接的参数

下面是选择私钥:可以选择Generate,生成一个秘钥对(公钥和私钥)然后保存为.ppk文件,

        也可以使用ssh自己生成的那个私钥,也就是我们刚刚复制命名为 id_rsa.ppk 的私钥文件(这里我使用复制的id_rsa.ppk)

准备好私钥后,点击load,载入私钥, 选择你私钥(我选择我们的id_rsa.ppk)

此时点击Save private key 将新的私钥保存为.ppk文件。配置git的remote时使用此私钥

fetch-pack: unexpected disconnect while reading sideband packet

  • 一般是因为项目分支过多,导致你要下载的东西太多,从而引起这个问题;
  • 引起这个问题的根源是文件过多,所以我们可以分批次下载文件,先下载一部分,再下载剩下的。

关闭 core.compression

1
git config --global core.compression 0

使用depth下载最近一次提交
注:--depth 后的是 数字 1;url是项目ssh地址

1
git clone --depth 1 url

获取完整库

1
git fetch --unshallow

解决问题

  • Could not resolve host: github.com

直接修改/etc/hosts文件,windows系统应该也一样,直接修改host文件即可,在底部添加:
192.30.253.112 github.com

  • git pull出错:error: failed to push some refs to/git pull origin master --allow-unrelated-histories
1
git pull origin master --allow-unrelated-histories
  • Git Clone错误解决:GnuTLS recv error (-110): The TLS connection was non-properly terminated.
1
2
3
apt install apt-transport-https gnutls-bin -y
git config --global http.sslVerify false
git config --global http.postBuffer 1048576000
  • Ubuntu: gnutls_handshake() failed: Error in the pull/push function.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1. apt install -y build-essential fakeroot dpkg-dev
2. apt -y build-dep git
3. apt install -y libcurl4-openssl-dev
4. mkdir -p ~/git-openssl
5. cd ~/git-openssl
# 获取源码包
6. apt source git
7. cd git-*
# 修改 git 安装包配置文件
# 将 libcurl4-gnutls-dev 替换为 libcurl4-openssl-dev
8. sed -i -e 's/libcurl4-gnutls-dev/libcurl4-openssl-dev/g' ./debian/control
# 删除 TEST=test,缩短安装包构建时间
9. sed -i -- '/TEST\s*=\s*test/d' ./debian/rules
# 构建安装包
10. dpkg-buildpackage -rfakeroot -b --no-sign
# 安装,git 版本号可能不一致
11. cd ../
12. dpkg -i git_2.17.1-1ubuntu0.8_amd64.deb
# 清理
13. cd ../../
14. rm -rf git-openssl

1.如果第二部出现问题E: You must put some ‘source’ URIs in your sources.list”

执行如下

  • sudo sed -i -- 's/#deb-src/deb-src/g' /etc/apt/sources.list && sudo sed -i -- 's/# deb-src/deb-src/g' /etc/apt/sources.list
  • sudo apt-get update

2.如果下载时候报错,可以多执行几遍