我有一些遥控器,以及github的起源。我在一个遥控器上做了几次提交(A),我把它推到了原点但没有拉到另一个遥控器(B)。
即。远程A和原点都在C3:
C1->C2->C3
远程B在C1。我希望每个人都回到C1,所以提交链看起来像:
C1->C2->C3->C1
现在我想使用revert
将所有内容恢复到状态B在(C3)。但要做到这一点,我需要提交代码或哈希或其他任何调用。我尝试了git show-ref
和git for-each-ref
,但是它们显示了一些非常长的哈希值,而不是我认为表示每次提交的短代码,我会在还原时使用它?
如何在B上找到最新本地提交的代码,以便我可以将其用于还原,然后推送到原点?
根据我的理解,我应该能够在B处git fetch
更新我的远程跟踪分支。然后我应该能够做一个恢复并推送到原点,然后在我的其他遥控器上pull
以使所有内容都在同一页面上。正确?
答案 0 :(得分:1)
很难遵循,所以我希望我能正确理解这个问题。
首先 - 短和长哈希是相同的,都代表一个提交。短哈希只是长哈希的前几个字母。 从统计上来说,短哈希是唯一足以区分提交的。
你甚至可以使用较短的哈希值(我认为4个字符是最小长度)。只要只有一个长哈希匹配它。
我只使用一次提交创建的测试存储库示例:
git log --oneline
8ade0365763ae62667cbbf3aeb3c1753ac956450 Test
git show 8ade
在我看来,你的建议方式是正确的。
B上的 fetch
和rebase
revert
所有最后的更改。你不需要git show-ref
一个简单的git log --oneline
就足够了。
push
更改回原点。
B机器上的完整流程:
git fetch
git rebase origin/master
git log --oneline
git revert <hashs you want to revert>
git push origin master
另一个选择是强制将B
存储库推送到远程存储库:
git push origin master --force
这将从远程存储库中删除C2 / C3及其历史记录。 这种推动有点风险。 我建议在做之前先阅读一下: Force "git push" to overwrite remote files
答案 1 :(得分:0)
似乎存在术语混淆。如果分支A和B位于本地计算机上,则它们不会被称为遥控器。我对你的情况的解释:你有一个远程回购和两个本地分支:A和B.如果是这样,那么
git checkout A
git log
// find the commit you want to revert and copy it's hash
// format is like:
// commit commit_sha <- that's what you need to copy
// Author: ...
// Date:
//
// Commit name here
git revert commit_sha
git push
git checkout B
git pull
在您的情况下,您需要在执行push
步骤之前还原2次提交:C2和C3
答案 2 :(得分:0)
首先,短和长可以用作同一件事。所以你使用它并不重要。
似乎你想在c3之后添加一个提交来将代码恢复到c1的状态。
我个人会查看c1的代码
git checkout c1 -- .
检查c1中的代码,然后可以提交结果而不重写历史记录