我一直在努力让我的团队的 git 工作流程变得简洁明了。我们的团队为我们的构建服务器使用master
、staging
和分支。development
当一个新的任务/功能正在处理时,我们将首先从 master 创建我们的功能分支,根据需要将其提交多次,然后使用临时分支将其全部压缩为 1 个提交并将其移动到任何一个 staging或发展。
考虑这个基本图:
Master
|
Staging
|
Development ——> [F1] ——> [F2]
|
*Temporary* ——> [F2]
|
Feature1 ——> [A ——> B ——> C] = [F1]
|
Feature2 ——> [A ——> B ——> C] = [F2]
在这里,我们看到所有分支的起始位置排成一行。每个功能的提交都是隔离的并保持在一起。当特性移动到上游时,特性的提交被压缩,然后合并到上游分支。例如,将功能移至开发将意味着:
git checkout development; # Switch to Development
git pull --rebase $DEV_REMOTE; # Rebase changes onto development
git checkout $MASTER; # Switch to master branch
git checkout -b $SQUASH; # So that we can clone a squash branch from it
git merge --squash $FEATURE_BRANCH; # Merge in the feature
git commit -m "Testing ($FEATURE_BRANCH)"; # Meaningfully Commit
git rebase $DEV_LOCAL; # Rebase Local Dev onto Feature
git checkout $DEV_LOCAL; # Switch back to Dev
git merge $SQUASH; # Merge on the feature
git branch -D $SQUASH; # Delete Squash Branch
这在短时间内运行良好,直到我在挤压时遇到第一次冲突。我不确定更改是在哪里进行的,以及为什么 git 不能自动使用历史记录来解决它。这是一个非常基本的输入/输出交换。
我的问题是:有没有更好的方法来做到这一点?我们希望将我们的代码合并到 dev/staging 中,每个特性分支 1 次提交,而不会在开发测试时破坏/弄脏特性分支(将未经批准的代码从 dev 重新定位到特性分支将包括合并到 staging 分支时的那些更改)。