git merge --ff <commit> 和 git reset -<commit>-mixed 有什么区别



如果我想将我的本地分支(例如master)更新到远程分支gitlab/master,我看到两个选项:

  • 我可以使用快进合并将本地分支与远程分支合并。
  • 我可以使用重置将我的分支移动到远程分支的位置。

第一个操作可以在我的 SmartGit GUI 中通过右键单击来实现:merge .后一种操作可以通过将本地分支标记拖动到新位置来实现。

git merge --ff <commit>git reset <commit> --mixed之间有什么技术区别吗?

我承认重置也可用于将本地分支移动到另一个分支,这不是快进的方式。

如果合并解析为快进,应该没有差异,但如果不是这样:

  • 如果使用 git merge ,您将有一个合并提交,并且所有提交都来自两个分支。
  • 如果使用 git reset ,您将只有来自gitlab/master的提交,而没有合并提交。gitlab/master中不存在的提交master将取消提交(重置),但其内容将存在于工作目录中。

你可以自己尝试一下,下面有两个场景:

(初始化,常见的两个场景,我们使用master作为gitlab/masterbranch1作为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 都是默认选项,可以省略。

正如你在自己对Ortomala Lokni的回答的评论中所指出的,你需要--ff-only来强制一个只有快进的操作。 另一个重要的区别是这种git reset

  1. 总是移动/重新分配HEAD(如果--soft,请在此处停止);
  2. 可选择重置索引(如果--mixed,请在此处停止);
  3. --hard)可以( ( )。

由于您特别要求--mixed重置,因此此类操作将使工作树与当前提交和索引不同步。 快进的"合并"(我在这里将合并放在引号中,因为它并没有真正进行任何合并)更新了工作树。

最新更新