- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以在工作中,我们正在实现一个新的,不错的git分支策略-太棒了!
为了保留存储库的新结构(而且很好),我们希望所有合并都使用--no-ff
标志(以及--no-commit
标志,以便更好地合并提交消息)。然而,仅仅要求每个人记住它,似乎有点不可靠。有没有办法强制每个开发人员都必须与上述标志合并?
据我所知,这是不可能用钩子检查的(因为git不可靠地存储任何关于快进的信息)。我知道可以在每台开发人员机器上设置配置(通过运行git config --global merge.ff no
)。如果这是解决方案,我如何确保每个开发人员都有这个配置集?
最佳答案
我相信您可以在服务器上的pre-receive hook中检查到这一点,但是很难定义什么是允许的,而且这可能会使推送对执行推送的人来说更加困难。而且,它只会给那些做错事的人一个错误:由他们来修复,这对一些用户来说可能有点复杂。
此外,您(和开发人员)可能不希望在某些合并上强制执行--no-ff
:特别是,如果您在branchX
上没有提交,并且获取了新的origin/X
提交,那么您可能希望将X
快速转发到origin/X
。(另一方面,在这种情况下,您/他们总是可以使用git rebase
。)
也就是说,让我们看看是否可以定义正确的行为。
首先,我们可能会注意到“快进”实际上是标签移动的属性,而不是合并的属性。当标签的前一个提交是其新提交的祖先时,标签会以快速前进的方式移动。(因此,git使用术语“快进合并”来指代事实上根本不是合并的内容。)git用于任何分支推送更新的默认测试是,除非设置了force标志,否则标签更新必须是快进操作。
我们不想拒绝标签快速转发,因为这是扩展分支的正常情况,无论是否合并:
...--o--o--n--n--n <-- br1
o
(更准确地说,
n
)用于指向尖端most
br1
,现在将指向尖端most
refs/heads/br1
。
o
元组的形式将每个引用更新请求交给您。换言之,考虑到上面的压缩
n
更新图,我们可以使用大写和小写(唉,我不能用颜色)重写它,大写代表传入的
<old-hash, new-hash, name>
和
br1
值,给出:
...--o--O--n--n--N <-- br1
old-hash
仍会指向commit
new-hash
。
br1
获取稍后将在
O
上的合并提交时,branch
br1
不会移动到直接包含该合并提交。也就是说,这没关系:
...--o--O--n--n--N <-- br1
... /
...---o--O--n--N <-- br2
br2
更新,然后我们会检查该部分;我们还不能这样做,因为我们还没有得到
br2
更新):
...--o--O--n--n--N <-- br1
... /
... n--n
... /
...----o--o <-- br2 (you get no update since br2 did not move)
...--o--O--n--n--N <-- br1, br2
... /
...---o--O--n--n
...--o--O--n--n--N <-- br1
... / \
...---o--O--n--n N <-- br2
br2
上限制允许它通过哪个父节点;在这些图中,指向左边的直线都是
br2
链接):
...--o--O--n--n--N <-- br1
... / \
...---o--O--n--n---N <-- br2
...--o--O--n--n--n--N <-- br1
... / \
...---o--O--n--n---N <-- br2
br2
上)。但是,我们必须检查每个合并,因为这不正常:
...--o--O--n--n--n--n--n---N <-- br1
... / \ \ /
...---o--O--n--n n--n--N <-- br2
--first-parent
时执行
br2
,然后在
git merge br2
时执行
br1
快速前进,然后在
git merge br1
上执行两次提交;他们也在
br2
上执行两次提交;然后他们再次将
br2
合并到
br1
中,然后将
br1
合并到
br2
中作为
br2
合并;然后在一个
br1
中同时推
--no-ff
和
br1
)。
br2
的规则,从而使这项工作变得更容易和更好。特别是,我们想要的是:
git push
是很有诱惑力的,但是这并不能正常工作,因为为合并显示的边界提交包括其所有父级,即使使用
--first-parent
。所以让我们直截了当地说:
# Operation must be a fast-forward. This ensures that
# $oldsha is an ancestor of (and thus related to) $newsha,
# and thus we are not discarding any commits.
if ! git merge-base --is-ancestor $oldsha $newsha; then
... reject as non-fast-forward
fi
edge=$(git rev-list --topo-order --first-parent $oldsha..$newsha | tail -1)
# If the rev-list is empty then $oldsha is not related to $newsha.
# However, we checked that first. (The only other case where this
# can occur is if $oldsha equals $newsha, which is not an update,
# so we won't be running this code at all.)
#
# The listed edge commit may, however, be a root commit (have
# no parent). We must reject this case as well as "parent is
# not $oldsha". Fortunately that happens automatically since
# the empty string does not match a valid hash; we just need
# to be sure to quote "$parent".
parent=$(git rev-parse -q --verify $edge^)
if [ "$parent" = $oldsha ]; then
... update is OK
else
... reject as containing a bogus merge
fi
--first-parent
不会返回到原始散列。
关于git - 强制整个团队 merge ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36172424/
我时不时地输入“git”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!