在 git 中指定一个单向分支

Specify a one-direction branch in git

假设一个回购有一个 master 分支和一个 junk 分支。有没有办法配置 git 以确保我和我的同事永远不会将 junk 合并到 master

简短的回答是否定的。特别是 Git 根本没有真正合并 branches;它合并了 提交 。像 junk 这样的分支名称只是一个标记,意思是“最新的此类提交”,Git 为您保持最新。但是既然你可以 运行:

git merge a123456

这是哈希 ID 而不是分支名称,如果该提交是 junk 分支上的最新提交,则该提交(“该分支”)将合并到当前分支中,即使当前分支是 master,并且不会有任何迹象表明这是将 junk 合并到 master,即使它正在做完全相同的事情。

综上所述,您 可以 使用各种 Git 钩子,或者避免直接使用 git 命令本身,以试图阻止您自己制作错误。例如,编写您自己的 front-end 命令——我在这里将其称为 mgit 以表示 my git,但您可以根据需要将其命名为 git,只要您使它调用“真正的 Git” 不知何故——让你的 mgit merge 检查:

mgit() {
    local subcmd=""
    case "$subcmd" in
    merge)
         # if current branch is master and argument is junk, error
         ... write code here ...
         ;;
    ... add additional subcommands here ...
    esac
}

mgit 只是一个 Small Matter of Programming,现在你有一个命令可以做你想做的事。

(至于 Git 钩子,目前在正确的地方还有 none 来阻止你自己犯这个特定的错误,所以不要那样做,除非你想得到真正参与了 Git 项目。正在进行的工作是使 hooks 更可用、更友好等等,你可以参与其中。)