如何预防git pull合并错误?

如何预防git pull合并错误?,git,Git,我正在寻找一种预先检测git拉取或git合并是否会失败的方法。我想执行的脚本类型是更新服务器 git fetch git okay stop server backup data git merge start server 这里git okay是我请求的命令的占位符 如果在提交之外更改了文件,那么git pull将失败,并出现以下错误 error: Your local changes to '...' would be overwritten by merge. Aborting. Pl

我正在寻找一种预先检测git拉取或git合并是否会失败的方法。我想执行的脚本类型是更新服务器

git fetch
git okay
stop server
backup data
git merge
start server
这里git okay是我请求的命令的占位符

如果在提交之外更改了文件,那么git pull将失败,并出现以下错误

error: Your local changes to '...' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
我希望git okay执行git merge中描述的预合并检查,并返回非零状态,以便脚本在服务器停止之前中止


我寻找过但没有找到的可能性包括git合并-干运行。我最好的想法是git status-Ceral |预合并OK。要使预合并能够处理良性未跟踪文件之类的事情,这似乎需要做很多工作。

您是否尝试过使用隐藏来保存您的工作,然后只进行合并,知道以后可以将其备份?我没有试过这些确切的命令,但是像

    git tag remember-your-initial-position
    git stash save --all --include-untracked
    git merge
    if [$? -ne 0]; then
      echo "merge will fail"
      git merge --abort
    else
      git stash apply
      if [$? -ne 0]; then
        echo "reapplying changes after the merge will fail"
      else
        echo "merge will be ok"
      fi
      git reset --hard remember-your-initial-position
    fi
    git stash pop
    git tag -d remember-your-initial-position
如果出于某种原因,您不想在工作目录中进行更改,例如,您正在该目录外主动运行服务器,您可以尝试将repo复制到其他地方,然后在其他地方执行以下步骤,如下所示:

    pushd .
    cp -r . /tmp/copy
    cd /tmp/copy
    # do the above steps
    popd
    rm -r /tmp/copy

似乎没有一种优雅的方式完全按照我的要求去做,所以我将使用一个简单的解决方案。这意味着我需要清理未跟踪的文件。一些将被删除,其他将添加到.gitignore中

test -z "$(git status --porcelain)"

这将有助于在启用回滚的同时推进部署。这不完全是我要找的。我希望尽早中止部署并手动修复任何问题。合并时,您通常最好不要有脏的工作区,因此您正在修复该问题。您正在做的一个可能不明显的问题是,如果.gitignore文件被签入并且发生更改,那么您的方法可能会失败,因为您有一个当前被忽略的文件,但是下一个更改将停止忽略它,并可能导致合并失败。一般来说,确保合并工作正常进行的唯一安全方法是实际执行合并,而在其他地方执行合并,正如我在回答的第二部分中所建议的,这通常是微不足道的。您能否用您希望工作目录和索引如何工作的方式来表达您的问题?听起来您可能正在工作目录外运行live,并且运行的服务器被允许更改工作目录中的文件,您正在寻找一种方法来测试合并是否会自动解决,而不会干扰工作目录中的任何文件,尽管我不知道您是否关心索引的更改。