Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Git中,如何从远程存储库签出或更新到最新版本?_Git_Github_Mercurial - Fatal编程技术网

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

在Git中,如何从远程存储库签出或更新到最新版本?,git,github,mercurial,Git,Github,Mercurial,我想创建一个简单的脚本来克隆Github存储库,将存储库的工作目录更新为最新版本,无论它位于哪个分支上,然后运行它的测试 要在Mercurial中实现这一点,我可以使用以下步骤: hg clone https://hghub.com/user/my-repo my-repo cd my-repo hg update tip Git与hg更新提示的等价物是什么?没有。在Mercurial中,“tip”只是编号最高的版本(使用相对的版本号,因为提交总是“添加到堆中”,所以在那里有效) (也就是说,

我想创建一个简单的脚本来克隆Github存储库,将存储库的工作目录更新为最新版本,无论它位于哪个分支上,然后运行它的测试

要在Mercurial中实现这一点,我可以使用以下步骤:

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

Git与hg更新提示的等价物是什么?

没有。在Mercurial中,“tip”只是编号最高的版本(使用相对的版本号,因为提交总是“添加到堆中”,所以在那里有效)

(也就是说,在任何给定的回购协议中都有绝对数量的提交。但是,当两个不同的回购协议发生分歧时,重新同步时,特定提交的相对数量可能不匹配。例如,假设Joe和我从每个“hg克隆”开始-用6次提交进行回购。我以rev 7的形式提交了一个变更,它已经准备就绪,但在我推动之前,Joe以rev 7的形式提交了一个变更,并推动我们的共享中央回购。现在,我拉动他的变更,即我的rev 8;我合并我的7和8并进行提交9;我将我的7和9推到中央回购,在那里它们分别成为rev 8和9。[我的修订版8没有发生任何变化,中央回购协议已将其作为承诺7。]我现在有我的版本8,变更集是Joe's-and-central-repo的版本7;我有版本9作为合并。如果他现在拉我的变更和合并,他有我的变更作为他的版本8,合并为9。因此,在这一点上,相对数字不再匹配。但是当你进行初始克隆时,这并不重要:你在复制另一个采购订单,在此过程中,您还复制了其编号。)

如果你能掌握另一方的git reflogs(在本例中,是github上的分支历史记录),你可以查看哪个分支最近向前推进。这将代表最新的提交。或者,github可能会跟踪这些东西,并允许每个人访问它们(我对github了解不够,无法说)


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

没有。在Mercurial中,“提示”只是编号最高的修订版(使用相对修订版编号,因为提交总是“添加到堆中”,所以在那里有效)

(也就是说,在任何给定的回购协议中都有绝对数量的提交。但是,当两个不同的回购协议发生分歧时,重新同步时,特定提交的相对数量可能不匹配。例如,假设Joe和我从每个“hg克隆”开始-用6次提交进行回购。我以rev 7的形式提交了一个变更,它已经准备就绪,但在我推动之前,Joe以rev 7的形式提交了一个变更,并推动我们的共享中央回购。现在,我拉动他的变更,即我的rev 8;我合并我的7和8并进行提交9;我将我的7和9推到中央回购,在那里它们分别成为rev 8和9。[我的修订版8没有发生任何变化,中央回购协议已将其作为承诺7。]我现在有我的版本8,变更集是Joe's-and-central-repo的版本7;我有版本9作为合并。如果他现在拉我的变更和合并,他有我的变更作为他的版本8,合并为9。因此,在这一点上,相对数字不再匹配。但是当你进行初始克隆时,这并不重要:你在复制另一个采购订单,在此过程中,您还复制了其编号。)

如果你能掌握另一方的git reflogs(在本例中,是github上的分支历史记录),你可以查看哪个分支最近向前推进。这将代表最新的提交。或者,github可能会跟踪这些东西,并允许每个人访问它们(我对github了解不够,无法说)


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

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

然而,您可以在某种程度上使用自己的方法,尽管它有点复杂

您可以使用一种简单的方法,它以
样式列出所有提交,对它们进行数字排序(
%ct
是Unix epoch格式的提交时间,它是自1970年开始以来的秒数,因此它们可以很好地排序),取最后一个,只剪切散列,然后检查:

$ git checkout `git log --all --format='%ct %H' | sort -n | tail -1 | cut -d' ' -f2`
$ 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)
然而,这会使您处于分离的头部状态,因为您是通过散列而不是引用签出的

一种稍微不那么幼稚、时间更长的方法是获取所有已知的分支,也就是说分支头,并通过类似的过程运行这些分支,在末尾删除分支引用并检查:

$ git checkout `git log --all --format='%ct %H' | sort -n | tail -1 | cut -d' ' -f2`
$ 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)
可能存在边缘情况,但我不知道它们。提交时间应该是一个良好的顺序,因为创建提交的所有内容,无论是
提交
樱桃选择
重新基址
提交--修改
,等等,都会更新他们正在复制的提交的提交时间。换句话说,您不能插入一个超出范围的文件-将日期排序到分支的中间。如果您在分支上选择了某个内容,则该内容将位于最新提交时间的顶部。如果您重新设置基础,则每个提交都将按照从下到上的顺序进行,因此它们也是有序的

也就是说,重基操作通常以大于每秒1次的间隔创建提交,在这种情况下,您将有完全相同的提交时间的提交,并且没有比这更细粒度的提交(我有时希望这样做),因此这里的排序操作很可能会将提交顺序与匹配的时间戳混淆。您可以尝试在这一点上使用作者时间来帮助解决问题,但这开始成为一个更复杂的函数,不再是一个相当简单的shell管道。此外,我不确定这是否总是正确的。可能会有疯狂的边缘案例。

如torek sa