如果我 git 在我的本地机器上重置 --hard,github 上的 repo 是否也会被重置?
If I git reset --hard on my local machine, will the repo on github also be resetted?
有 2 个提交:
提交 1:本地(未推送到 github),分支 "testing",大约 3 分钟前提交,特征文件上次编辑是 5 天前
提交 2:在我的 github 回购中在线(大约 2.5 小时前推送到测试),分支 "testing",大约 3 小时前提交,上次编辑功能文件3 小时前
我只是从在线存储库中提取更新的文件,并将它们基本上合并到我的本地文件中。但是我想 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
时,您:
重置您的工作树。
您的工作树是您的 Git 放置您可以查看和使用的文件的地方。 Git 不直接使用它们。这实际上是 git reset --hard
的 最后 步。如果您使用 git reset --mixed
或 git reset --soft
,Git 将跳过此步骤。
重置您的索引。
您的 Git 在其索引中保留了所有当前文件的副本。 Git 也将索引称为 暂存区 — 这是同一事物的两个术语。做一个 git reset --hard
告诉你的 Git:使文件的所有索引副本与提交副本匹配。 这实际上是 第二个 步骤 git reset --hard
。如果您使用 git reset --soft
,Git 将跳过此步骤。
更改由当前分支名称标识的提交。
这是任何此类 git reset
的第一步。您当前的分支名称,例如 master
或 testing
,当前标识 一个特定的提交 。分支上的所有其他提交都可以通过在这一提交处开始 1 并向后工作来找到。
当您使用 git reset --soft
、git reset --mixed
或 git reset --hard
时,您可以选择 任何 提交,任何地方在您的存储库中。使用 git log --all --decorate --oneline --graph
获取存储库中每个提交的真正大视图,包括它们的缩短哈希 ID。您现在可以选择您喜欢的任何提交,使用鼠标剪切并粘贴其 ID,并使用 git reset
使您当前的分支名称 成为一个特定的提交 。那个提交你之前命名的分支?好吧,那个不再重要:分支名称现在命名您选择的提交。 Git 将从那里开始并通过时间向后工作以找到所有较早的提交。 在之后的任何提交都不再在你的分支上。
您可以选择分支已经命名的提交!如果您在 master
上,并且 master
名称提交 deadcab
,并且您 git reset --hard deadcab
,git 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 fetch
是git 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..!这应该有助于解决您可能遇到的其他相关问题。
有 2 个提交:
提交 1:本地(未推送到 github),分支 "testing",大约 3 分钟前提交,特征文件上次编辑是 5 天前
提交 2:在我的 github 回购中在线(大约 2.5 小时前推送到测试),分支 "testing",大约 3 小时前提交,上次编辑功能文件3 小时前
我只是从在线存储库中提取更新的文件,并将它们基本上合并到我的本地文件中。但是我想 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
时,您:
重置您的工作树。
您的工作树是您的 Git 放置您可以查看和使用的文件的地方。 Git 不直接使用它们。这实际上是
git reset --hard
的 最后 步。如果您使用git reset --mixed
或git reset --soft
,Git 将跳过此步骤。重置您的索引。
您的 Git 在其索引中保留了所有当前文件的副本。 Git 也将索引称为 暂存区 — 这是同一事物的两个术语。做一个
git reset --hard
告诉你的 Git:使文件的所有索引副本与提交副本匹配。 这实际上是 第二个 步骤git reset --hard
。如果您使用git reset --soft
,Git 将跳过此步骤。更改由当前分支名称标识的提交。
这是任何此类
git reset
的第一步。您当前的分支名称,例如master
或testing
,当前标识 一个特定的提交 。分支上的所有其他提交都可以通过在这一提交处开始 1 并向后工作来找到。当您使用
git reset --soft
、git reset --mixed
或git reset --hard
时,您可以选择 任何 提交,任何地方在您的存储库中。使用git log --all --decorate --oneline --graph
获取存储库中每个提交的真正大视图,包括它们的缩短哈希 ID。您现在可以选择您喜欢的任何提交,使用鼠标剪切并粘贴其 ID,并使用git reset
使您当前的分支名称 成为一个特定的提交 。那个提交你之前命名的分支?好吧,那个不再重要:分支名称现在命名您选择的提交。 Git 将从那里开始并通过时间向后工作以找到所有较早的提交。 在之后的任何提交都不再在你的分支上。您可以选择分支已经命名的提交!如果您在
master
上,并且master
名称提交deadcab
,并且您git reset --hard deadcab
,git 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 fetch
是git 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..!这应该有助于解决您可能遇到的其他相关问题。