git merge --ff <commit> 和 git reset <commit> --mixed 有什么区别
What is the difference between git merge --ff <commit> and git reset <commit> --mixed
如果我想更新我的本地分支,说 master
,到远程分支 gitlab/master
,我看到两个选项:
- 我可以使用快进合并将本地分支与远程分支合并。
- 我可以使用reset将我的分支移动到远程分支的位置。
第一个操作可以在我的SmartGit GUI中通过右击实现:merge
。后面的操作可以通过将本地分支标记拖到新的位置来实现。
git merge --ff <commit>
和git reset <commit> --mixed
在技术上有什么区别吗?
我承认 reset 也可以用来将本地分支移动到另一个分支,这不是快进的方式。
如果合并解析为快进,则应该没有差异,但如果不是这样:
- 如果您使用
git merge
,您将有一个合并提交和来自两个分支的所有提交。
- 如果您使用
git reset
,您将只有来自 gitlab/master
的提交,而没有合并提交。 gitlab/master
中缺少的 master
的提交将被取消提交(重置),但它们的内容将出现在工作目录中。
你可以自己试试,有以下两个场景:
(初始化,常见两种情况,我们用master
作为gitlab/master
,branch1
作为master
)
# Common commit
git init
echo a > a; git add .; git commit -m"a"
# Commit on branch1
git checkout -b branch1
git init
echo b > b; git add .; git commit -m"b"
# Second commit on master
git checkout master~1
echo c > c; git add .; git commit -m"c"
(合并场景)
git checkout branch1
git merge master
(重置场景)
git checkout branch1
git reset master
另请注意,选项 --ff
和 --mixed
都是默认选项,可以省略。
正如您在自己对 的评论中指出的那样,您需要 --ff-only
才能强制执行仅快进操作。另一个重要的区别是这种 git reset
:
- 始终移动/重新分配
HEAD
(如果 --soft
则在此处停止);
- 可选地重置索引(如果
--mixed
则在此处停止);
- 可选择重置工作树 (
--hard
)。
由于您特别要求 --mixed
重置,这种操作会使工作树与当前提交和索引不同步。快进 "merge"(我在这里将合并放在引号中,因为它并没有真正进行任何合并)更新工作树。
如果我想更新我的本地分支,说 master
,到远程分支 gitlab/master
,我看到两个选项:
- 我可以使用快进合并将本地分支与远程分支合并。
- 我可以使用reset将我的分支移动到远程分支的位置。
第一个操作可以在我的SmartGit GUI中通过右击实现:merge
。后面的操作可以通过将本地分支标记拖到新的位置来实现。
git merge --ff <commit>
和git reset <commit> --mixed
在技术上有什么区别吗?
我承认 reset 也可以用来将本地分支移动到另一个分支,这不是快进的方式。
如果合并解析为快进,则应该没有差异,但如果不是这样:
- 如果您使用
git merge
,您将有一个合并提交和来自两个分支的所有提交。 - 如果您使用
git reset
,您将只有来自gitlab/master
的提交,而没有合并提交。gitlab/master
中缺少的master
的提交将被取消提交(重置),但它们的内容将出现在工作目录中。
你可以自己试试,有以下两个场景:
(初始化,常见两种情况,我们用master
作为gitlab/master
,branch1
作为master
)
# Common commit
git init
echo a > a; git add .; git commit -m"a"
# Commit on branch1
git checkout -b branch1
git init
echo b > b; git add .; git commit -m"b"
# Second commit on master
git checkout master~1
echo c > c; git add .; git commit -m"c"
(合并场景)
git checkout branch1
git merge master
(重置场景)
git checkout branch1
git reset master
另请注意,选项 --ff
和 --mixed
都是默认选项,可以省略。
正如您在自己对 --ff-only
才能强制执行仅快进操作。另一个重要的区别是这种 git reset
:
- 始终移动/重新分配
HEAD
(如果--soft
则在此处停止); - 可选地重置索引(如果
--mixed
则在此处停止); - 可选择重置工作树 (
--hard
)。
由于您特别要求 --mixed
重置,这种操作会使工作树与当前提交和索引不同步。快进 "merge"(我在这里将合并放在引号中,因为它并没有真正进行任何合并)更新工作树。