关于git:如何使用TortoiseGit和SourceTree完成相同的TortoiseHg HgWorkbench更新

How to do the equivalent of TortoiseHg HgWorkbench Update using TortoiseGit and SourceTree

在Tortoise HGWorkbench中,我可以右键单击存储集并选择更新…这允许我强制我的工作区将其内容设置为与该存储集匹配。我必须选中复选框"放弃本地更改"。我现在使用的是TortoiseGit,也使用了SourceTree和Git。对分支中的前一个节点进行更新的等效命令是什么?实际上,我希望暂时将我的工作区还原为以前的修订版,放弃当前其中的所有内容,但不丢失以前的任何提交,然后将我的工作区返回到最近的提交。


要恢复到以前的版本并放弃随后的本地更改,请打开日志,右键单击相应的版本并选择Reset master to this

如果要在不影响已提交的更改的情况下恢复到以前的修订,请打开日志,右键单击相应的修订并选择Switch/checkout to this

Switch/checkout image

与TortoiseHg类似,活动修订以粗体突出显示:氧化镁

要再次返回到最新版本的master,只需右键单击它并选择Switch/Checkout to"master":氧化镁

创建的临时分支也可以通过右键单击其日志条目并选择Delete refs/head/tmp_branch来删除。

要打开日志,右键单击包含存储库的文件夹(它将有一个名为.git的隐藏子文件夹),然后选择TortoiseGit -> Show log。日志与上下文相关。如果这样,您将看到当前分支的完整修订历史记录。但是,也可以打开子文件夹或单个文件的日志,只查看它们的修订历史记录。


现在,随着对git分支的更好理解,当我问这个问题时,我理解了我的困惑。所以我会把它分享给其他人,比如我自己,来自于Mercurial,第一次尝试使用Git。

我根本不理解的是Git所称的分支实际上只是指向特定提交节点(变更集)的指针或引用。它不是(顾名思义)一组连接的提交或节点。另一个基本的困惑是提交可能存在于Git中,而没有分支(节点引用)。与mercurial不同,在git中,如果将当前分支指针移回前一个节点,并且没有其他分支指针引用任何子节点,那么这些节点将不再可访问,并且实际上会丢失。在Mercurial中进行提交时,常用用例的提交树是静态的。也就是说,如果我使用前面提交的节点3重新加载我的工作区,那么这三个后续节点不仅仍然可以访问,而且在图形树上也可见。但是对于git,必须有一个指向节点或其子节点的指针,才能在图形上显示它。这意味着当我将当前分支指针移动到其他地方时,我将丢失所有最近的后代提交。这完全不是我想要的。为了测试的目的,我只想临时用以前的提交重新加载当前工作区,而不想更改或丢失以前的任何提交。那么我该如何处理Git呢?最简单的方法是首先提交我的工作区中任何未完成的更改,然后将祖先节点签出到一个新的分支名称,如gresstest。(就像前面提到的@malice)然后我可以使用regresstest在整个树中加载任何提交,以进行测试。完成后,我可以删除regresstest分支指针,然后再次签出当前分支。删除gresstest不会丢失任何提交,因为它们已经被一个或多个其他分支指针引用。

@malice的回答对我来说不清楚的原因是我不明白为什么我需要创建一个tmp_分支,因为我不明白如果没有对提交节点的引用,git将失去对这些未引用节点的访问权,或者有效地删除这些未引用节点。这是一个外来的概念。

添加了12-27-2016,我现在也了解到,未保留的节点实际上没有被删除,但仍在存储库中,可以通过提交ID和分支日志访问,但不像它们出现在图上那样容易。