如何使用 TortoiseGit 和 SourceTree 执行与 TortoiseHg HgWorkbench 更新等效的操作

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

在 Tortoise HgWorkbench 中,我可以右键单击一个保存集并 select 更新...这允许我强制我的工作区设置其内容以匹配该保存集。我必须 select 复选框到 "Discard local changes"。我现在正在使用 TortoiseGit 以及带有 Git 的 SourceTree。对分支中的前一个节点进行更新的等效命令是什么?实际上,我想暂时将我的工作区恢复到以前的修订版,丢弃其中当前的所有内容,但不会丢失我以前的任何提交,然后 return 我的工作区恢复到我最近的提交。

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

如果您想恢复到以前的版本而不影响 已提交的更改,请打开日志,右键单击相应的版本并选择Switch/checkout to this

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

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

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

要打开日志,请右键单击包含存储库的文件夹(它将有一个名为 .git 的隐藏子文件夹)并选择 TortoiseGit -> Show loglog 是上下文相关的。如果你那么你将看到当前分支的完整修订历史。然而,也可以打开子文件夹或单个文件的日志以仅查看它们的修订历史。

现在对 Git 分支有了更好的理解,我理解了我问这个问题时的困惑。所以我将它分享给像我这样来自 Mercurial 并第一次尝试使用 Git 的人。

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

@Malice 的回答对我来说不清楚的原因是我不明白为什么我需要创建一个 tmp_branch 因为我不明白没有引用提交节点 Git 将无法访问或有效删除那些未引用的节点。来自 Mercurial,这是一个外国概念。

2016 年 12 月 27 日添加我现在还了解到,未引用的节点实际上并未删除,但仍在存储库中,可以通过提交 ID 和分支日志访问,但不像它们出现在图表上那样容易。