我想创建一个执行以下操作的脚本: 1)git stash 2)git checkout myBranch 3)git stash pop
哪些git管道命令可以取代上面的git瓷器命令?
修改
根据Mark Adelsberger和Torek的非常详细和冗长(谢谢你)的答案,我会坚持使用瓷器命令。我还要注意以下陈述,我发现这对于何时使用瓷器和管道命令非常有帮助。
引自Mark Adelsberger的回答:
“由于您使用的命令不会产生可以驱动脚本的输出,因此我不会过于担心找到管道等效物。”
答案 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
作为创建其他提交的副作用而移动)好的,现在你已经创建了一个“藏匿处”。接下来,您需要使用上游HEAD
,U
从W
(或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-tree
和git checkout-index
更新索引和工作树以匹配新的HEAD
提交,同时保留可以保留的索引和工作树修改。如果您刚刚成功完成git stash save
或同等学历,那么唯一剩下的失败案例发生在:
--skip-worktree
或--assume-unchanged
,将通过切换提交在索引中(因此在工作树中)进行更改因此几乎可以将其减少为一些简单的管道命令。但git checkout branchname
无论如何都被设计为可用作管道。你可能也可以使用它。