如果我 git 在我的本地机器上重置 --hard,github 上的 repo 是否也会被重置?

If I git reset --hard on my local machine, will the repo on github also be resetted?

有 2 个提交:

我只是从在线存储库中提取更新的文件,并将它们基本上合并到我的本地文件中。但是我想 revert that merge 看看如何仍然可以使用提交 1 中的更改......(我猜有 git diff?)。

如果我进行硬重置,是否也会对在线存储库中的文件产生影响?

由于此刻您最想查看过去的提交,因此您可能应该只将该提交作为 "detached HEAD" 签出。在分离的 HEAD 模式下,您根本不在 no 分支上。相反,您已经检查了一些历史提交,您现在可以在您的工作树中查看和使用这些提交。

要退出 "detached HEAD" 模式,选择任何分支名称并使用 git checkout <em>name</em>。这将使您的工作树恢复到使用命名分支上的最新提交的方式,同时也将您置于命名分支上。

您还可以——随时,无论分支如何——在任何两个提交上使用git diff来比较它们.使用 git log 显示您当前的提交,包括其完整的哈希 ID,以及之前的提交,包括它们的完整哈希 ID。然后,使用鼠标剪切和粘贴哈希,因为提交哈希 ID 很难使用,否则 运行:

git diff <hash1> <hash2>

Git 将比较两个哈希指定的提交中的快照,并向您展示这两个提交快照中的不同

同时,回答您提出的问题:

So if I do a hard reset, would that also have an effect on the files in the online repo?

没有。不能立即确定,因为您的存储库是 您的 存储库,而他们的存储库(在线存储库)是 他们的 存储库。 您在存储库中所做的任何事情根本不会影响他们,直到您 Git 调用他们的 Git 并询问它或者告诉它:做一些改变.

当您在存储库中执行 git reset --hard 时,您:

  1. 重置您的工作树。

    您的工作树是您的 Git 放置您可以查看和使用的文件的地方。 Git 不直接使用它们。这实际上是 git reset --hard 最后 步。如果您使用 git reset --mixedgit reset --soft,Git 将跳过此步骤。

  2. 重置您的索引

    您的 Git 在其索引中保留了所有当前文件的副本。 Git 也将索引称为 暂存区 — 这是同一事物的两个术语。做一个 git reset --hard 告诉你的 Git:使文件的所有索引副本与提交副本匹配。 这实际上是 第二个 步骤 git reset --hard。如果您使用 git reset --soft,Git 将跳过此步骤。

  3. 更改由当前分支名称标识的提交。

    这是任何此类 git reset 的第一步。您当前的分支名称,例如 mastertesting,当前标识 一个特定的提交 。分支上的所有其他提交都可以通过在这一提交处开始 1 并向后工作来找到。

    当您使用 git reset --softgit reset --mixedgit reset --hard 时,您可以选择 任何 提交,任何地方在您的存储库中。使用 git log --all --decorate --oneline --graph 获取存储库中每个提交的真正大视图,包括它们的缩短哈希 ID。您现在可以选择您喜欢的任何提交,使用鼠标剪切并粘贴其 ID,并使用 git reset 使您当前的分支名称 成为一个特定的提交 。那个提交你之前命名的分支?好吧,那个不再重要:分支名称现在命名您选择的提交。 Git 将从那里开始并通过时间向后工作以找到所有较早的提交。 之后的任何提交都不再在你的分支上。

    可以选择分支已经命名的提交!如果您在 master 上,并且 master 名称提交 deadcab,并且您 git reset --hard deadcabgit reset 的第一步是更改 master从命名提交 deadcab 改为命名提交 deadcab。这当然没有任何改变:名称仍然标识提交 deadcab。所以唯一的 observable 效果是重置到索引,重置到工作树。

    如果您选择一些 其他 提交,但是,这会更改由分支名称标识的提交。

稍后,当您 运行 git push 时,您的 Git 会调用其他 Git。您的 Git 与另一个 Git 交谈。你的 Git 给他们任何你有但他们没有的提交(但他们需要——你的 Git 通常不会给他们他们不需要的提交),然后你的 Git会问他们Git:哎,其他Git!请更改您的一些分支名称,以便您的分支名称指定这些特定的提交哈希 ID。 您的 Git 要求他们更改的分支名称,以及您的 Git 要求的哈希 ID它们要使用,通常来自 your 分支名称,使用散列 ID your 分支名称指定。

你的Git在git push时间向另一个Git发送东西。在git fetch时——注意git fetchgit pull的第一部分——你的Git调用了他们的Git,但是在这个方向上,你的Git 从他们那里获得新的提交,然后你的 Git 更新你的 origin/* 远程跟踪名称 ,2 而不是比对你的分支做任何事情。


1一开始我把它打错了 "staring at"。是挺合适的Git 必须盯着提交看一会儿,才能找到之前的提交。然后它盯着上一个提交,寻找下一个回来。 :-) 每个提交都列出了它之前的提交的哈希 ID。这些是您会在别处看到的 父提交 ID

2这假设您只有一个遥控器,名为 origin,这通常是正确的,但实际上并不需要。

您问题的简短回答 NO 除非您执行 git push <<*remote-branch-name*>> 完整解释git reset --hard HEAD 详细解释here..!这应该有助于解决您可能遇到的其他相关问题。