2

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

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

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

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

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

4

2 回答 2

2

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

  • 如果您使用git merge,您将有一个合并提交和来自两个分支的所有提交。
  • 如果你使用git reset,你将只有提交gitlab/master,没有合并提交。来自master缺席的提交gitlab/master将被取消提交(重置),但它们的内容将出现在工作目录中。

您可以自己尝试一下,使用以下两个场景:

(初始化,常见的两种情况,我们用masterasgitlab/masterbranch1as 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都是默认选项,可以省略。

于 2017-10-15T18:23:05.503 回答
2

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

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

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

于 2017-10-15T19:23:59.707 回答