Git相当于hg更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git相当于hg更新相关的知识,希望对你有一定的参考价值。

以下是Mercurial的一个小例子,与Git类似。我无法理解如何使用Git制作hg update

我有一个小的Mercurial设置,有4个提交 - 我退后一个提交

hg init
echo "1" > a.txt; hg commit -A -m "1. commit" a.txt
echo "2" >> a.txt; hg commit -m "2. commit" a.txt
echo "3" >> a.txt; hg commit -m "3. commit" a.txt
echo "4" >> a.txt; hg commit -m "4. commit" a.txt
hg update -r 3
thg # or hg view`

这给了这张照片

请注意,我看到所有四个提交 - 即前历史和后续提交

让我尝试使用Git做同样的例子

git init
echo "1" > a.txt; git add a.txt; git commit  -m "1. commit" a.txt
echo "2" >> a.txt; git commit -m "2. commit" a.txt
echo "3" >> a.txt; git commit -m "3. commit" a.txt
echo "4" >> a.txt; git commit -m "4. commit" a.txt # gives for me [master 57bb375]

让我看看提交:

git log --graph --pretty=format:'%h -%d %s (%cr) <%an>' 

 * 57bb375 - (HEAD, master) 4. commit (14 minutes ago) <Peter Toft>
 * 724a493 - 3. commit (14 minutes ago) <Peter Toft>
 * bb38732 - 2. commit (14 minutes ago) <Peter Toft>
 * 879c593 - 1. commit (15 minutes ago) <Peter Toft>

好 - 按预期四次提交。让我回去一次提交(类似于hg更新)

git checkout 724a493

现在git日志怎么样?

git log --graph --pretty=format:'%h -%d %s (%cr) <%an>' 

 * 724a493 - (HEAD) 3. commit (19 minutes ago) <Peter Toft>
 * bb38732 - 2. commit (19 minutes ago) <Peter Toft>
 * 879c593 - 1. commit (19 minutes ago) <Peter Toft>

gitk还会显示前3个提交?

所以“git checkout”不仅仅与“hg update”类似。以下提交在哪里?

答案

hg update -r 3正在为您提供一个自动分支头,您可以继续提交。在git中,checkout将您带到正确的提交,但不会给你一个新的分支头。如果你想要,你可以说

git checkout -b new_branch_name 724a493

当然使用你喜欢的任何名称。如果你不使用-b,就像你的问题一样,你会进入一个独立的HEAD的状态......这正是hg update -r 3git checkout 724a493之间的区别。注意结帐时Git打印的消息(从我运行你的例子):

Note: checking out '2ffb5e0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2ffb5e0... 3. commit
另一答案

简单地说,当你运行57bb375时,git checkout 724a493提交没有去任何地方。您所看到的行为只是git log只显示作为签出提交的祖先的提交。

在Mercurial术语中,git log

$ hg log -r ::.

这意味着“告诉我作为.的祖先的承诺,即工作副本父母修订”。要在Git中获得相当于hg log的信息,只需运行即可

$ git log --all

这个小差异是Git的一个关键特性,因为它允许您从许多其他存储库中提取提交,而不会默认情况下看到它们。只有当您签出分支(或您的案例中的提交)时,您才会看到已下载到存储库中的提交。

另一答案

另一种解决方案:添加

[alias]
    restore = "!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep ^D | cut -f 2); }; f"

那么“git restore”会让我向后移动一个提交,而不需要我做一个人工分支。

如果我想返回主分支

git checkout master

以上是关于Git相当于hg更新的主要内容,如果未能解决你的问题,请参考以下文章

“git log --graph”或“hg graphlog”如何工作?

合并:Hg/Git 与 SVN

CTF常见源码泄漏总结

hg命令

从Hg迁移到Git

hg和git命令对照表