git - 合并 --squash 会在 Git 流程中产生冲突吗?
问题描述
背景:我的团队正在遵循标准的 Git 流程,带有分支release
,develop
并且在合并release
到develop
. 我怀疑来自合并策略的问题。
下面是一个场景: 初始情况是一个名为hello.txt
仅包含1,2,3
. 顺序是:
- 创建 PR
release
以添加一行4, 5, 6
并将其合并 - 创建一个 PR
develop
来报告这个提交并合并它 - 创建 PR
develop
以添加一行7, 8, 9
并将其合并 - 创建一个 PR
develop
以合并release
到develop
根据合并策略,存在冲突。据我了解,Git 应该“看到”(但我不明白它是如何工作的)“ 4, 5, 6
”提交release
已经报告给develop
. 不知何故,将 PR 与git merge --squash
.
这是我得到的结果:
- 一个简单的
git merge
策略,一切都很好 - 使用
git merge --squash && git commit --no-edit
,没有冲突,但提交消息在日志中很混乱 - ,有
git merge --squash && git commit -m "Report --- into ---"
冲突
问题:我报告提交的方式有问题吗(见下文)?还是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 "***************************************************"
解决方案
推荐阅读
- r - 在R中绘制带有大栅格的散点图?
- c++ - 如何使用 imebra 将 RAW 图像转换为 DICOM 图像?
- c# - C# 更新列表中的对象
- java - 是否可以将方法名称存储在数组中,并计算它被调用了多少次?
- gnuradio - 带有 Ettus USRP B210 的 gnuradio 中带有 LO 偏移的 2 Rx 不起作用
- android-studio - android studio 终端不接受我的命令
- excel - 组织架构亲子关系
- sql - to_date 在 oracle 中创建视图时未验证用户输入值
- matlab - 如何消除 fzero 命令 Matlab 的警告输出
- variables - Powershell 向注册表数据输出添加空格