标签: merge-base

“git merge --squash”的正确用例是什么?

有些人喜欢git merge --squash的原因如下:

压缩到单个提交让您有机会清理杂乱的 WIP 提交,并为您正在合并的更改提供一个很好的理由。

https://coderwall.com/p/qkrmjq/git-merge-squash

但是,我认为有一些缺点超出了制作干净历史的优点。

  1. 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的变化。

  2. 提交作者被覆盖,这会丢弃贡献。git merge --squash产生一个名为 who did 的新提交git merge --squash。当然,提交内容来自原始提交。这听起来像是在窃取贡献。这成为https://github.com/Microsoft/winfile/pull/42#issuecomment-380681627 中的一个问题

什么是正确的用例git merge --squash

git merge squash 3-way-merge merge-base

6
推荐指数
1
解决办法
2822
查看次数

git merge-base 不适用于合并的分支

我试图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 merge-base

3
推荐指数
1
解决办法
1696
查看次数

检查分支是否已经合并到远程的 master 或 dev 分支

我要做的是确保我可以安全地删除本地分支。

我在这里找到了这个问题的一些很好的答案:

我如何在 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)

git git-merge merge-base

3
推荐指数
1
解决办法
1144
查看次数

标签 统计

git ×3

merge-base ×3

3-way-merge ×1

git-merge ×1

merge ×1

squash ×1