"git merge --squash" 的默认目标文档

Documentation of Default Target of "git merge --squash"

有时我会将一堆提交压缩在一起。通常我的命令遵循这种模式:

git reset --hard HEAD~4
git merge --squash HEAD@{1}
git commit

不过今天,在第 2 步,我被一些东西(松鼠?Slack?Facebook?)分散了注意力,我忘记了用 HEAD@{1} 结束 git merge --squash 命令。然而它神奇地做了我想要的。

我找不到任何文档说明省略合并的目标将默认为 HEAD@{1},但结果很好。

哪里有这方面的文档吗?

我从 git help merge 看到以下内容,但它似乎没有回答问题:

--squash, --no-squash
           Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit, move the HEAD, or record $GIT_DIR/MERGE_HEAD (to cause the next git commit command to create a merge commit). This
           allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in case of an octopus).

           With --no-squash perform the merge and commit the result. This option can be used to override --squash.

           With --squash, --commit is not allowed, and will fail.

运行:

git merge

(没有选项也没有参数)“意味着”:

git merge @{upstream}

添加选项,例如 --squash,不会改变这一点,因此:

git merge --squash

是以下的同义词:

git merge --squash @{upstream}

@{upstream}语法的意思是在当前分支的上游定位提交pointed-to。 master 的上游非常典型 origin/masterdev 的上游通常是 origin/dev。这种模式重复。可以通过 git rev-parse:

找到实际的上游
git rev-parse --symbolic-full-name @{upstream}

例如在我的 Git 克隆的 Git 存储库中 Git 产生:

$ git rev-parse --symbolic-full-name @{u}
refs/remotes/origin/master

也就是说,我在 master 上,它的上游是 origin/master。 (这个特定的克隆对我来说主要是一个参考克隆,所以我只是让它的母版与 Git 存储库的其他各种副本保持同步 Git。@{u} 是一种更短的方式来写 @{upstream}:不那么容易记忆,但更容易输入。)无论提交 @{u} 是什么意思,这就是 Git squash-merged 的那个。

作为 ,您应该考虑 git reset --soft 作为您的特定目标。软重置移动当前分支,而不触及索引和工作树,这避免了 git merge --squash 必须执行的工作。结果 index-and-work-tree 将是相同的两种方式,并且由于 --squash 不会创建 .git/MERGE_HEAD (并且确实暗示 --no-commit)最终的 git commit 将表现相同方式也是如此。