有些人喜欢git merge --squash
的原因如下:
压缩到单个提交让您有机会清理杂乱的 WIP 提交,并为您正在合并的更改提供一个很好的理由。
https://coderwall.com/p/qkrmjq/git-merge-squash
但是,我认为有一些缺点超出了制作干净历史的优点。
git merge --squash
产生一个非合并提交。因此,Git 不会将您正在合并的提交识别为合并基础。当 1) 在分支 X 上将 A 更改为 B,2)git merge --squash
从分支 X 到分支 Y,以及 3) 在分支 X 上将 B 更改为 A(还原),以及 4) 将 X 合并到 Y
时,这会导致不需要的合并结果。
在第 4 步之后,在分支 Y 上,从 A 到 B 的更改不会恢复。这里,这是 3 路合并,因此比较从分支 X 到合并基的差异和从分支 Y 到合并基的另一个差异。前者包括没有变化,后者包括从A到B的变化,所以合并结果包括从A到B的变化。
提交作者被覆盖,这会丢弃贡献。git merge --squash
产生一个名为 who did 的新提交git merge --squash
。当然,提交内容来自原始提交。这听起来像是在窃取贡献。这成为https://github.com/Microsoft/winfile/pull/42#issuecomment-380681627 中的一个问题
什么是正确的用例git merge --squash
?
我试图git merge-base
通过合并分支上的命令获取我分支的祖先。
当我尝试时,git merge-base develop branch1
它显示 sha YYY而不是XXX
* `develop`
|
* merge branch1 into develop
|\
| * `branch1` <- HEAD sha YYY
|/
* sha XXX
Run Code Online (Sandbox Code Playgroud)
当我在未合并的分支上发出相同的命令时,一切正常(下图)
* `develop`
|
|
| * `branch1` <- HEAD sha YYY
|/
* sha XXX
Run Code Online (Sandbox Code Playgroud)
我获得此提交 ID 的唯一方法是通过
git log --oneline --boundary develop...branch1
它向我显示提交列表,但我只需要一个。
我要做的是确保我可以安全地删除本地分支。
我在这里找到了这个问题的一些很好的答案:
我如何在 git 中知道一个分支是否已经合并到 master 中?
所以我们有源分支和目标分支。源分支可能已经或可能没有完全合并到目标分支中。
上面链接中的答案的问题是,如果目标分支在与源分支合并后有新的提交,答案似乎不起作用。
我有一个运行良好的脚本,但它似乎只有在所有分支共享相同的提示或其他任何内容时才有效。但是,该脚本在理论上是有效的,因为您只是想查看本地分支的提示是否作为提交包含在远程分支历史记录中的某个位置,所以应该不难弄清楚。
#!/usr/bin/env bash
green='\033[1;32m'
red='\e[31m'
no_color='\033[0m'
branch="${1:-HEAD}"
branch_name=`git rev-parse --abbrev-ref $branch`;
git fetch origin dev;
git fetch origin master;
merge_base="$(git merge-base $branch origin/dev)"
merge_source_current_commit="$(git rev-parse $branch)"
if [ "$merge_base" != "$merge_source_current_commit" ]; then
echo -e "${red}Branch with name '$branch_name' is not completely merged with origin/dev.${no_color}";
exit 1;
else
echo -e "${green}Branch with name '$branch_name' is merged with origin/dev, now checking against origin/master${no_color}";
fi
merge_base="$(git merge-base $branch origin/master)"
if [ "$merge_base" != …
Run Code Online (Sandbox Code Playgroud)