【问题标题】:Git alias with two commands (stash pop + merge) executes only the first command. Why? How to execute also the merge?带有两个命令(stash pop + merge)的 Git 别名仅执行第一个命令。为什么?如何执行合并?
【发布时间】:2011-05-25 15:17:25
【问题描述】:

我这样设置了一个 git 别名:

git config --global alias.popmerge '!git stash pop && git merge master'

然后我这样称呼它:

git popmerge

git stash pop”被执行,但“git merge master”被忽略。

如果我在“git popmerge”之后立即运行“git merge master”......它基本上会按预期运行,执行合并。

我还有其他具有长命令序列的别名......它们运行完美。似乎 git stash pop”中的某些东西使别名进程停止...是否可以避免这种行为?怎么样?

谢谢。

【问题讨论】:

  • 您确定,您首先要使用stash pop 弄脏您的工作目录,然后再使用merge?先执行merge,然后执行pop 不是更安全吗?此外,我不确定忽略作为答案接受的退出状态是否真的很可取。 stash pop 的失败不是意味着有冲突吗?你真的想在另一个容易发生冲突的merge 上增加混乱吗?
  • 是的,我确定。唯一的stash save / stash pop 目的只是为了让checkout master 命令in this sequence 始终成功。我希望存储堆栈为空,并且 stash pop 始终成功。 成功stash pop 的退出状态不为零。 别问我为什么。这就是我需要; 解决方法的原因。考虑紧跟在save 之后的pop 发生冲突的可能性:在这种情况下,它为零。
  • 好的,不知道保存完全基于同一个提交。然后,唯一可以预料的冲突是从合并 master 到 dev - 很好。太糟糕的 git 命令退出状态行为没有真正记录在案......

标签: git git-stash git-alias


【解决方案1】:

你检查过 stash pop 的退出代码吗?

&& 暗示后面的list只有在exitcode为0(成功)时才会执行。

您可以通过使用; 而不是&& 来简单地忽略退出代码。


使用以下内容验证成功:

true  && echo ok || echo fail   # echoes "ok"

false && echo ok || echo fail   # echoes "fail"

【讨论】:

  • 太棒了。按照建议,我将 && 更改为 ; 并且它起作用了。也感谢您的解释。
  • @J.Bruni and @LeifWickland:谢谢!我喜欢对细节的关注:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2017-04-14
  • 2017-12-31
  • 2010-12-15
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多