首页 > 解决方案 > 合并 --squash 会在 Git 流程中产生冲突吗?

问题描述

背景:我的团队正在遵循标准的 Git 流程,带有分支releasedevelop并且在合并releasedevelop. 我怀疑来自合并策略的问题。

下面是一个场景: 初始情况是一个名为hello.txt仅包含1,2,3. 顺序是:

  1. 创建 PRrelease以添加一行4, 5, 6 并将其合并
  2. 创建一个 PRdevelop来报告这个提交并合并它
  3. 创建 PRdevelop以添加一行7, 8, 9 并将其合并
  4. 创建一个 PRdevelop以合并releasedevelop

根据合并策略,存在冲突。据我了解,Git 应该“看到”(但我不明白它是如何工作的)“ 4, 5, 6”提交release已经报告给develop. 不知何故,将 PR 与git merge --squash.

这是我得到的结果:

问题:我报告提交的方式有问题吗(见下文)?还是merge --squash在使用 Git flow 时不推荐?另外,git如何识别要合并的提交?为什么只是更改提交消息会影响它?

这是一个创建临时 git repo 并执行前面提到的 git 操作的 shell 脚本。它旨在模仿 BitBucket 执行的 PR 创建/合并,以及我团队中使用的合并策略。请查看调用的函数merge,因为它允许更改合并策略。

注意:如果您不完全了解它的作用,切勿执行 shell 脚本。

#! /bin/bash
set -euo pipefail
IFS=$'\n\t'

function log_step() {
  echo -e "\n\e[96m${*}\e[0m"
}

# Delegates the call to the merge strategy and passing args
# You can uncomment the desired strategy
function merge()
{
#  merge_simple $*
  merge_squash_rename $*
#  merge_squash_no_edit $*
}

function merge_squash_rename(){
  echo -e "\e[94mMerge ${1} into ${2}\e[0m"
  git checkout ${2}
  git merge --squash ${1}
  git commit -m "Merge ${1} into ${2}"
}

function merge_squash_no_edit(){
  echo -e "\e[94mMerge ${1} into ${2}\e[0m"
  git checkout ${2}
  git merge --squash ${1}
  git commit --no-edit
}

function merge_simple(){
  echo -e "\e[94mMerge ${1} into ${2}\e[0m"
  git checkout ${2}
  git merge ${1}
}

tmp_dir=$(mktemp -d -t strategit-XXXXXXXX)

echo "Created directory ${tmp_dir}"
cd ${tmp_dir}

# Initial state : a file named hello.txt, containing "1,2,3"
log_step "Create initial file with 1,2,3"
git init
echo '1,2,3' >> hello.txt
git add hello.txt
git commit -m 'First commit'

# Create initial branches release + develop
log_step "Create branches release and develop"
git checkout -b release
git checkout -b develop

# Work on ticket FW-456 on release
log_step "Create PR on release in order to add the line 4,5,6"
git checkout release
git checkout -b feature/FW-456
echo '4,5,6' >> hello.txt
git add hello.txt
git commit -m 'feature/FW-456'
# Keep it for cherry-pick later
ORIGINAL_COMMIT_HASH=$(git rev-parse HEAD)

log_step "Merge the PR on release"
merge feature/FW-456 release

# report PR on develop by creating a report branch
log_step "Create the report branch from develop"
git checkout develop
git checkout -b report/feature/FW-456
git cherry-pick ${ORIGINAL_COMMIT_HASH}

log_step "Merge the report branch on develop"
merge report/feature/FW-456 develop

# Work on ticket FW-789 on develop
log_step "Create a new PR from develop to add the line 7,8,9"
git checkout develop
git checkout -b feature/FW-789
echo '7,8,9' >> hello.txt
git add hello.txt
git commit -m 'feature/FW-789'

log_step "Merge the PR in develop"
merge feature/FW-789 develop

# Now, report release into develop
log_step "Create a PR on develop to report release in develop"
git checkout develop
git checkout -b chore/report-release-into-develop
# "|| true" to prevent script from exiting because of the potential conflict error

log_step "Try to merge"
git merge release || true

echo ""
echo "***************************************************"
echo "*                                                 *"
echo -e "* See result in directory \e[92m${tmp_dir}\e[0m *"
echo "*                                                 *"
echo "***************************************************"

标签: git

解决方案


推荐阅读