使用git从测试服务器到生产服务器的连续部署

使用git从测试服务器到生产服务器的连续部署,git,merge,Git,Merge,我有一个分支origin/master(来自测试服务器),它在分支master之前有N个提交(在生产服务器上)。我想一个接一个地将提交从origin/master应用到master,以便在每个步骤中观察应用程序对这些提交的反应 我使用了git cherry pick,但随后修改了提交校验和。我想保持同样的历史 我还可以查看来自origin/master的提交列表,并逐个运行git merge,手动选择正确的提交,但我正在寻找一个命令,例如“应用两个分支之间不同的第一次提交”。校验和是使用提交者、

我有一个分支
origin/master
(来自测试服务器),它在分支
master
之前有N个提交(在生产服务器上)。我想一个接一个地将提交从
origin/master
应用到
master
,以便在每个步骤中观察应用程序对这些提交的反应

我使用了
git cherry pick
,但随后修改了提交校验和。我想保持同样的历史


我还可以查看来自
origin/master
的提交列表,并逐个运行
git merge
,手动选择正确的提交,但我正在寻找一个命令,例如“应用两个分支之间不同的第一次提交”。

校验和是使用提交者、提交日期、,作者、提交消息、树对象的哈希以及其他信息。无论何时修改提交,它都是唯一的,我不知道有什么方法可以解决它(或者它是否是您想要的东西)

听起来您正在寻找
-x
参数,当您选择时,该参数将自动将原始提交哈希附加到提交消息

我刚刚举了一个例子:

git cherry-pick -x 60aa086c5d8d68fdeb47d02d9e06a6420e721295
历史呢

    git log
    commit 6287d63090736c9a1ae58d578d2d395896561f27
    Author: Kief Kraken <kief@gitkraken.com>
    Date:   Tue Sep 13 16:31:36 2016 -0700

        original commit message 
       (cherry picked from commit 60aa086c5d8d68fdeb47d02d9e06a6420e721295)
git日志
提交6287D63090736C9A1EAE58D578D2D395896561F27
作者:基夫·克拉肯
日期:2016年9月13日星期二16:31:36-0700
原始提交消息
(樱桃从commit 60aa086c5d8d68fdeb47d02d9e06a6420e721295中挑选)
这样,您就可以始终使用原始提交哈希,以便在需要时可以找到原始提交。

这个(未测试的)bash脚本怎么样

# CREATES A master_test BRANCH STARTING ON master
git checkout -b master_test master

# FOR ALL DIFFERENT COMMITS
for h in $(git log --pretty=format:%H master..origin/master)
do
    # MERGE THE COMMIT
    git merge $h

    # PAUSE TO "OBSERVE"
    echo "Paused"
    read pause
done

你可以用这个。它自动化了(使用二进制搜索)在已知的好提交和坏提交之间选择提交的过程,以查找导致您正在查找的行为的原始提交。

您可以选择、重置和合并,但这有点麻烦。也许这个过程可以使用一些shell脚本实现自动化,但实际上,我希望从第一次提交开始,在两个分支之间逐个应用每个提交。如何使用
bisect
来执行此操作?@OrtomalaLokni它不会一次应用一个,而是在两个提交之间进行二进制搜索以查找问题。如果要查找有问题的提交,二进制搜索应该比一次应用一个提交更快。如果您确实希望在每次提交后查看代码的执行情况,那么对分对您没有帮助。它用于从测试服务器到生产服务器的连续部署。因此,即使是一个有趣的工具,
git-bisect
也不是解决方案。使用
git-merge
,手动选择正确的提交即可。但是我想自动选择两个分支之间不同的第一个提交。好主意,但是for循环在一次迭代中接受所有提交,因为一些bash模糊的行为。可能与处理来自git log命令的换行有关。请检查IFS变量(echo X${IFS}X)的值。我认为IFS变量有一个非默认值。默认值是空白(空格、制表符和换行符),但它可能会被更改,例如,解析逗号分隔的数据文件(更多信息:在本文档中搜索“IFS:)。使用
IFS=$'\t\n'
并不能解决问题,我使用的是
GNU bash,3.2.57(1)版(x86_64-apple-darwin15)