关于git:回到存储库中的特定修订版后提交并推送更改?

Commit and push changes after going back to a particular revision in the repository?

我们需要回到一个特定的承诺。对master做了一些意外的更改。试图恢复它挖得太深,所以主人是在一个坏的状态。我们现在想让大师回到66ADA4CC61D62AFC。

根据Git,恢复到特定的提交:

1
2
$ git reset --hard 66ada4cc61d62afc
HEAD is now at 66ada4c Updated documentation

然后,尝试提交:

1
2
3
4
5
6
7
$ git add *.h *.cpp
$ git commit -m"Go back to Commit 66ada4cc61d62afc"
On branch master
Your branch is behind 'origin/master' by 16 commits, and can be fast-forwarded.
  (use"git pull" to update your local branch)

nothing to commit, working directory clean

最后:

1
2
3
4
5
6
7
8
$ git push
To https://github.com/weidai11/cryptopp.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/weidai11/cryptopp.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

现在,一切都在我想要的地方。我不知道为什么Git有麻烦,也不知道Git在说什么。如果吉特照他说的去做肯定会很好。但是,唉,吉特让每一个简单的任务都变得困难,它会造成不适当的痛苦和痛苦。

如何提交和推动更改?


快速解决方案:git push -f

这将强制推送并覆盖远程历史记录。如果有其他人正在使用此远程存储库:不要这样做!

从远程存储库中提取数据的其他人将遇到问题,因为他们的历史不再是存储库历史的子集。大多数项目禁止强制推送。

更好的解决方案是为您的更改创建一个新的提交。要么

  • git revert hashes
  • 埃多克斯1〔5〕

然后,在历史记录的基础上创建一个新的提交,描述返回到所需版本所需的更改。


git reset不会恢复您的更改。它只会回到旧的状态。因为最新的提交已经在远程中,并且您没有进行任何本地更改,所以您将无法推送。

使用git revert git revert ..。这将创建一个新的提交,该提交将还原您指定的提交的更改。然后按代码。


为了避免简单地将一组错误替换为另一组错误的部分解决方案,我执行了以下操作:

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/weidai11/cryptopp.git cryptopp-old
git clone https://github.com/weidai11/cryptopp.git cryptopp-new

cd cryptopp-old
git checkout 66ada4cc61d62afc

cd ../cryptopp-new
cp ../cryptopp-old/*.h ../cryptopp-old/*.cpp .

git commit -am"Go back to Commit 66ada4cc61d62afc"