git merge --ff <commit>和git reset <commit> --mixed

时间:2017-10-15 18:03:36

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

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

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

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

git merge --ff <commit>git reset <commit> --mixed之间是否存在任何技术差异?

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

2 个答案:

答案 0 :(得分:2)

如果合并作为快进解决,则应该没有差异,但如果情况并非如此:

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

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

(初始化,常见的两个都是scenari,我们使用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选项都是默认选项,可以省略。

答案 1 :(得分:2)

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

  1. 始终移动/重新分配HEAD(如果--soft,请停在此处);
  2. 可选择重置索引(如果--mixed),则停在此处;
  3. 可选择重置工作树(--hard)。
  4. 由于您明确要求进行--mixed重置,因此这种操作会使工作树与当前的提交和索引不同步。快进&#34;合并&#34; (我在这里引用了合并,因为它并没有真正做任何合并)更新工作树。