【问题标题】:How can I stop myself from committing to the master branch in git?如何阻止自己提交到 git 中的 master 分支?
【发布时间】:2011-10-09 12:00:58
【问题描述】:

我理想的工作流程是将更改提交到 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"

哎呀,只是致力于掌握。如果我很幸运,我会立即意识到这一点,但如果我不这样做,我可以将分支推向上游,并在顶部再进行 10 次更改。所以这以远程结束:

Master   -------- Merge --- commit - commit --------------- Merge
Dev      \ Commit/                        \ commit - commit /

虽然它应该看起来像这样:

Master   -------- Merge ------------- Merge --------------------- Merge
Dev      \ Commit/     \ commit commit /  \ commit - commit - commit /

如何消除人为因素(即我的愚蠢)并阻止自己提交到 master 分支?我在 Ubuntu 上。

【问题讨论】:

  • 我能问一下为什么它很重要吗?没有人看到您提交到哪个本地分支,所以如果您最终以任何方式推送到 master,那么您在本地进行原始提交真的很重要吗?
  • @CharlesBailey:使用 git 的一个主要好处是能够创建有意义的历史记录,从而更好地控制代码的共享和集成方式。如果一个提交意外地以 10 个更改结束在 master 中,如果该功能还没有准备好发布而其他 10 个更改已准备好,那么将其分离出来会变得很尴尬。
  • @MarceloCantos:我不同意你所说的,但我不明白原始提交在哪个分支上会影响“撤消”操作的难度。
  • @Charles Bailey - 这就是我们的开发流程的设置方式。你提交到你自己的 dev 分支并将它们合并到 master 中。当 master 上有一堆微小的提交时,它也会产生一些噪音。撤消操作的难点在于,如果有人在我推后拉了主人,所以如果我尝试撤消他们可能已经拉了主人,这会导致冲突。我在实际实践中并没有那么在意,如果提交历史是一致的就好了。
  • @Charles Bailey - 哦,他们确实看到了哪个提交去了哪里。我的本地 master 跟踪远程 master,我的本地 dev 跟踪远程 dev。

标签: git version-control ubuntu-11.04


【解决方案1】:

这不是万无一失的解决方案,但您可以安装 git-completion.bash 并使用其 PS1 增强功能将当前分支(和其他有用的内容)显示为命令提示符的一部分。请参阅here 了解说明。

它不会阻止你提交到 master,但它会让你很难忘记你在哪个分支。

【讨论】:

    【解决方案2】:

    您可以很容易地写一个pre-commit hook 来检查您当前的分支并根据分支名称拒绝提交。

    【讨论】:

    • +1,但不要忘记允许对 master 进行适当的提交——即从 dev 合并。不知道这有多容易/多难。
    【解决方案3】:

    我正在尝试设置类似的东西,只有 hudson 提交,因为它会将您提交的远程分支合并到 master 中,然后将它们推送到我们的 git Soooooo 我们的主线 master 只是好的代码,没有开发人员会受到另一个破坏的影响构建...哦,快乐的一天。

    预接收脚本(服务器端 - 不要放在本地) ....

    #!/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
    

    当然,我讨厌轮询,所以在收到后我会做这样的事情(注意 hudson 用户无法运行 curl 命令,或者你最终会进入无限循环,因为它会不断推动对 master 分支所做的更改) ...

    post-receive 脚本(服务器端-不要放在本地)

    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 的提交的方法:(。仍在研究那个。

    【讨论】:

    • 院长,我已从您最近的三篇文章中删除了指向您博客的链接。签名在 Stack Overflow 上是不合适的,而仅用于为您的博客做广告的签名更是如此。如果您链接到您的一篇文章,该文章对您的一个答案进行了更详细的介绍,那将更合适。请参阅Are taglines & signatures disallowed? 了解更多详情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多