什么是管道命令来做一个git stash,git checkout mybranch,git stash pop?

时间:2017-06-02 13:25:21

标签: git

我想创建一个执行以下操作的脚本: 1)git stash 2)git checkout myBranch 3)git stash pop

哪些git管道命令可以取代上面的git瓷器命令?

修改

根据Mark Adelsberger和Torek的非常详细和冗长(谢谢你)的答案,我会坚持使用瓷器命令。我还要注意以下陈述,我发现这对于何时使用瓷器和管道命令非常有帮助。

引自Mark Adelsberger的回答:

“由于您使用的命令不会产生可以驱动脚本的输出,因此我不会过于担心找到管道等效物。”

2 个答案:

答案 0 :(得分:2)

由于您使用的命令不会产生可以驱动脚本的输出,因此我不会过于担心找到管道等价物。你想要意识到存储不能干净利用的可能性,我想......

如果您决定使用管道,我认为您正在进行锻炼。我找不到任何“中级”管道命令,所以我认为你必须去基础......

有几种方法可以看待它。如果你想忠实于stash的工作方式:存储是两次或三次提交,加上一个带有操纵的reflog的ref。出于您的目的,您可以选择避开stash引用,但是您希望执行某些内容以在应用步骤失败时提供对“隐藏”更改的访问权限。

所以你要做的就是:

  • 当前提交是H;您的目标分支头是T
  • 使用索引状态
  • 创建提交I
  • 将更改分段到工作树中的跟踪文件
  • 创建一个提交W,其父级为I
  • 如果模拟--untracked--all选项:暂存未跟踪的文件(包括--all中忽略的文件)并创建另一个提交'U',其父级为{{1 }}
  • 以某种方式记下W的ID(如果您未创建U,则为W);这就是U ref在瓷器命令中的用途
  • stash进行硬重置(仍为H,除非您将HEAD作为创建其他提交的副作用而移动)

好的,现在你已经创建了一个“藏匿处”。接下来,您需要使用上游HEADUW(或H)有效地进行变基。为了留在管道土地,我想你可以使用命令来创建和应用补丁。让我们说你得到--onto T - U'。)。

  • 结帐T -- I' -- W'' (and maybe(或U'
  • 将混合模式重置为W'
  • 将软重置为I'

然后无论什么清理都有道理。现在,就像我说的那样,如果你试图保持(不必要地)忠实于T的工作方式。您可能无需进行临时提交即可生成索引和WIP的修补程序,将工作树清理回stash状态,检出HEAD,应用索引修补程序,T所有内容,应用WIP补丁。但这仍然是很多工作,你现在必须弄清楚如果补丁申请过程不顺利,如何为用户保留补丁文件。

说真的,我知道这是坏事,但我只是使用add

答案 1 :(得分:2)

首先,值得快速提醒一下,git stash save的工作方式是它创建一个新的提交 - 或者实际上,至少两次提交,但其中一个是主要提交,这是哈希ID从那时起,人们就会使用它。所以我们可以将它称为“存储提交”:它就像任何其他提交一样,除了(a)它在 no 分支上,并且(b)它看起来像是一个合并提交,但是应该永远不会用作合并提交。

git stash命令本身是一个非常复杂的脚本,没有直接的管道等效。但是,它(因为Git 1.8.4)有自己的方式用作管道,通过git stash create(可选地后跟git stash store来为存储提交分配一个名称)。

创建步骤会使git stash save进行的存储提交,但不会为其分配stash@{number}条目,以便以通常的方式命名所有现有的存储。请注意,就像git stash save一样,如果没有任何要藏匿的内容,它什么都没有git stash save的输出是新主存储提交的哈希ID,如果没有新提交,则根本没有。

如果这创建了一个存储提交,您有14天(默认情况下)为其命名或完成使用它。如果您希望命令序列花费超过14天,则可能需要使用git stash store将其作为stash@{0}推送到存储堆栈,将所有其他序列重新编号为1。如果您认为您的脚本将在14天宽限期内完成,您甚至不需要创建名称:您只需将存储提交哈希传递给git stash apply

因此:

commit=$(git stash create)
... do your thing here ...
if [ "$commit" != "" ]; then git stash apply $commit; fi

(作为Mark Adelsberger noted,您应该检查apply是否成功,如果不成功,您应该为存储提交命名。)

对于git checkout,管道等价物有点复杂(它包括自动确定结帐是否成功,然后如果是,使用git symbolic-ref重新绑定HEAD使用git read-treegit checkout-index更新索引和工作树以匹配新的HEAD提交,同时保留可以保留的索引和工作树修改。如果您刚刚成功完成git stash save或同等学历,那么唯一剩下的失败案例发生在:

  • 有未跟踪的文件(工作树中但未在索引中的文件)将通过切换提交进行跟踪,或
  • 索引中的文件设置为--skip-worktree--assume-unchanged,将通过切换提交在索引中(因此在工作树中)进行更改

因此几乎可以将其减少为一些简单的管道命令。但git checkout branchname无论如何都被设计为可用作管道。你可能也可以使用它。