以下是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”是 NOT ,与“hg update”类似。以下提交在哪里?
答案 0 :(得分:7)
hg update -r 3
正在为您提供一个自动分支头,您可以继续提交。在git中,checkout
会将您带到正确的提交,但不会为您提供新的分支头。如果你想要,你可以说
git checkout -b new_branch_name 724a493
当然使用你喜欢的任何名称。如果您不使用-b
,就像在您的问题中一样,您将进入分离的HEAD的状态...这正是hg update -r 3
和git 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
答案 1 :(得分:2)
简而言之,57bb375
提交在您运行git checkout 724a493
时没有进入任何地方。您所看到的行为只是git log
仅显示作为签出提交的祖先的提交。
在Mercurial术语中,git log
与
$ hg log -r ::.
表示“向我显示.
的祖先提交,即工作副本父修订”。要在Git中获得等效的hg log
,只需运行
$ git log --all
这个微小差别是Git的关键功能,因为它允许您从许多其他存储库中提取提交而不会默认看到它们。只有当您签出一个分支(或您的案例中的提交)时,您才会看到已下载到存储库中的提交。
答案 2 :(得分:0)
另一种解决方案变体: 添加
[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