【问题标题】:What is the difference between git merge --ff <commit> and git reset <commit> --mixedgit merge --ff <commit> 和 git reset <commit> --mixed 有什么区别
【发布时间】:2018-03-27 06:21:22
【问题描述】:

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

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

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

git merge --ff &lt;commit&gt; 和 git reset &lt;commit&gt; --mixed 之间有什么技术区别吗?

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

【问题讨论】:

    标签: git git-merge git-reset fast-forward


    【解决方案1】:

    正如您在自己对Ortomala Lokni's answer 的评论中指出的那样,您需要--ff-only 来强制执行仅快进操作。另一个重要的区别是这种git reset:

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

    由于您特别要求 --mixed 重置,这种操作会使工作树与当前提交和索引不同步。一个快进的“合并”(我在这里用引号括起来,因为它并没有真正进行任何合并)更新工作树。

    【讨论】:

      【解决方案2】:

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

      • 如果您使用git merge,您将拥有一个合并提交和来自两个分支的所有提交。
      • 如果您使用git reset,您将只有来自gitlab/master 的提交,而没有合并提交。来自master 的来自gitlab/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 不强制执行快进合并,而没有选项允许快进合并或合并提交?
      • 哦,我明白我的错了。强制选项是--ff-only。
      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 2012-02-22
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多