是git reset - 如果合并失败需要硬盘吗?

时间:2016-12-15 21:49:55

标签: git bash sh git-merge git-squash

我有以下bash脚本:

git merge --squash -Xtheirs dev -m "squashing" && 
(./test/testsrc/shell/node-c.sh && echo "compiled successfully") || (git reset --hard; exit 1)

我有两个问题:

  1. 如果合并失败,我是否需要进行git重置才能返回合并开始前的状态?
  2. 假设1的答案是"是",上面的脚本是否正确,这样如果node-c.sh脚本以非零代码退出,那git reset --hard将是调用并将绝对退出代码= 1?
  3. 我在想,在运行git merge时,无论如何都会更新索引,所以git reset --hard始终是正确的做法。

    顺便说一句,我看到的似乎是一些糟糕的Git错误,合并不起作用并产生.js文件被破坏,并且通常甚至不能用" $编译节点-c"。不确定是否有人之前见过这个,但我已经向Git提交了一份错误报告。

2 个答案:

答案 0 :(得分:3)

如果合并失败,您将与分支机构处于冲突状态。我对此的想法是,使用String content = data.toString() .replaceAll("=", "\":\"") .replaceAll(",", "\",\"") .replaceAll("}", "\"}") .replaceAll("{", "{\""); 而不是git merge --abort,您将更安全,因为:

  • 从命令的上下文中可以清楚地看到,您中止了合并,并且
  • 在Git的舞台上可能会出现因合并失败而永远丢失的事情

如果没有某种人工/手动干预,您不希望硬重置分支;即使你重置的东西可能是安全的,你仍然在玩钚。

关于你的Git“bug” - 我真的怀疑Git应该受到责备;它可能是预期合并的副作用,不按计划进行,Git要求你帮助它。

答案 1 :(得分:1)

在您的脚本中,您应该实际执行此操作:

git merge --squash -Xtheirs dev -m "squashing" && 
(./test/testsrc/shell/node-c.sh && echo "compiled successfully") ||
(git reset --hard ORIG_HEAD; exit 1)

当合并通过但node-c.sh没有,那么你有一个你不想要的合并提交。伪引用ORIG_HEAD指向最近合并开始时的位置:如果合并失败,则与HEAD相同,成功时与{HEAD^相同1}}。