在Git中,如何从远程存储库中签出或更新到最新版本?

时间:2014-02-20 15:56:10

标签: git github mercurial

我想创建一个简单的脚本来克隆Github存储库,将存储库的工作目录更新为最新的版本它可能在上的任何一个分支,然后运行它的测试。

要在Mercurial中执行此操作,我可以使用以下步骤:

hg clone https://hghub.com/user/my-repo my-repo
cd my-repo
hg update tip

Git等同于hg update tip

2 个答案:

答案 0 :(得分:3)

没有一个。在Mercurial中,“提示”只是编号最高的修订版(使用相对转数,它可以在那里工作,因为提交总是“添加到堆中”,就像它一样)。

(也就是说,在任何给定的repo 中都有一个绝对的提交编号。但是,当两个不同的已经分歧的repos重新同步时,特定提交的相对数量可能不匹配例如,假设Joe和我从每个“hg clone”开始 - 一个包含6个提交的repo。我将更改作为rev 7,它已经准备好了,但是在我推送之前,Joe提交了一个更改为他的 rev 7并推送到我们共享的中央仓库。现在我拉动他的改变,这是我的转速8;我合并我的7和8并且提交9;我将我的7和9推到中央repo,他们分别成为8和9的转速。[我的rev 8没有任何反应,中央回购已经作为提交7了。]我现在拥有作为我的第8版,变换集是Joe's-and-central-repo的rev 7;并且我将rev 9作为合并。如果他现在提取我的更改并合并,他将我的更改作为他的rev 8,并且合并为9.因此此时相对数字不再匹配。但是当你做你的初始cl一,这没关系:你正在复制其他的回购,并且在这个过程中你也要复制它的编号。)

如果你能掌握对方的git reflogs(在这种情况下,github上的分支历史记录),你可以看看哪个分支最近是前进的。这将代表最新的提交。或者,github可能会跟踪这些内容并允许每个人访问它们(我不太了解github)。

(您还可以查看提交时间戳,但它们不一定按提交添加到存储库的顺序排列。)

答案 1 :(得分:1)

正如torek所说,没有内置方式,因为这不是git的工作方式。

但是,你可以在某种程度上推广自己的方法,虽然它有点涉及。

你可以采用一种天真的方法,以<commit time> <full hash>样式列出所有提交,以数字方式对它们进行排序(%ct是Unix纪元格式的提交时间,这是1970年以来的秒数,所以他们很好地排序),采取最后一个,只删除哈希,并检查出:

$ git checkout `git log --all --format='%ct %H' | sort -n | tail -1 | cut -d' ' -f2`

然而,这会让你处于一个分离的头部状态,因为你是通过哈希检查,而不是通过引用。

稍微不那么天真,而且更长的方法是获得所有已知的分支,也就是分支头,并通过类似的过程运行它们,最后切掉分支引用并检查出来:< / p>

$ git checkout $(for b in `git br | sed 's/..//'`; do echo `git log -1 $b --format='%ct %H'` $b; done | sort -n | tail -1 | cut -d' ' -f3)

可能是边缘情况,但我不知道它们。提交时间应该处于良好状态,因为创建提交的所有内容,包括commitcherry-pickrebasecommit --amend,等,都更新了他们正在复制的提交的提交时间。换句话说,您不能将无序日期插入分支的中间。如果你在分支机构中挑选一些内容,那么它会在最新的提交时间内完成。如果您进行rebase,则每个提交都是从下到上按顺序进行的,因此它们也将按顺序进行。

也就是说,rebase操作通常会以大于每秒1次的间隔创建提交,在这种情况下,您将提交具有完全相同的提交时间的提交,并且它不会比这更精细。 (我有时希望它这样做),所以这里的排序操作很可能会混淆提交顺序和匹配的时间戳。您可以尝试在此时使用作者时间来帮助解决问题,但这开始变得更复杂,并且不再是一个相当简单的shell管道。而且,我不确定总是如此正确。可能会有疯狂的边缘情况。