"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/master
。 dev
的上游通常是 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
将表现相同方式也是如此。
有时我会将一堆提交压缩在一起。通常我的命令遵循这种模式:
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/master
。 dev
的上游通常是 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
将表现相同方式也是如此。