我理想的工作流程是将更改提交到dev
,并且仅通过git merge --no-ff dev
将更改合并到master,但偶尔会发生以下情况:
开发
dev: git add .
dev: git commit -m "Cured cancer."
dev: git checkout master
master: git merge --no-ff dev
写一些代码
master: git commit -a -m "Did something amazing"
Whops,只是致力于掌握。如果我很幸运,我马上意识到这一点,但如果我不这样做,我可以将分支向上游推进另外10个更改。所以这最终会在远程:
Master -------- Merge --- commit - commit --------------- Merge
Dev \ Commit/ \ commit - commit /
虽然看起来像这样:
Master -------- Merge ------------- Merge --------------------- Merge
Dev \ Commit/ \ commit commit / \ commit - commit - commit /
如何消除人为因素(即我的愚蠢)并阻止自己投入到主分支?我在Ubuntu上。
答案 0 :(得分:3)
这不是防弹解决方案,但您可以安装git-completion.bash并使用其PS1增强功能在命令提示符下显示当前分支(以及其他有用的东西)。有关说明,请参阅here。
它不会阻止你承诺掌握,但它会让你很难忘记你所在的分支。
答案 1 :(得分:3)
您可以非常轻松地编写pre-commit hook来检查当前分支,并根据分支名称拒绝提交。
答案 2 :(得分:1)
我正在尝试设置类似的地方,只有hudson提交,因为它会合并你提交到master的远程分支,然后将它们推入我们的git Soooooo我们的主线主机只有GOOD代码,没有开发人员可以受到另一个破坏建设......哦,快乐的一天。
预接收脚本(服务器端 - 不要放在本地)....
#!/bin/sh
# <oldrev> <newrev> <refname>
# update a blame tree
while read oldrev newrev ref
do
echo "STARTING [$oldrev $newrev $ref]"
if [ $ref == "refs/heads/master" ] && [ $USER != "hudson" ]
then
echo "YOU CANNOT COMMIT STUFF TO MASTER BRANCH"
echo "TO CORRECT THIS run"
echo "git branch -c <branch name> then run"
echo "git push <reponame> <branch name>"
echo "and hudson will take and push to master IF it passes the tests"
exit 1;
else
echo "This is hudson, allowing commit to master"
fi
done
然后当然,我讨厌在接收后进行轮询我做这样的事情(请注意,哈德森用户无法运行curl命令,或者你最终无限循环,因为它不断推动它对主分支所做的更改) ...
接收后脚本(服务器端 - 不要放在本地)
echo "User=$USER"
if [ "hudson" != $USER ]
then
echo "Notifying hudson to build NOW"
curl http://10.222.0.168:8080/job/stserver1/build?delay=0sec
echo "Done notifying"
else
echo "This is hudson, not triggering build now"
fi
注意:我还没有找到开发人员将其提交恢复为master的方法,但是:(。仍在处理那个。