【问题标题】:git reset --merge vs git reset --keep [duplicate]git reset --merge vs git reset --keep [重复]
【发布时间】:2014-09-03 21:32:57
【问题描述】:

我读过 the documentation, 但是我很难理解两者之间的区别

git reset --merge

和

git reset --keep

请提供一个简单的解释和/或示例。

【问题讨论】:

  • 恕我直言,他们并不完全是骗子。这个问他们做什么,另一个问你为什么要使用它们。
  • @SteveBennett 他们已经足够接近,可以作为骗子被关闭,IMO,但请随时投票重新开放。

标签: git git-reset


【解决方案1】:

我同意文档不是很清楚。通过测试,我发现了三个不同之处,与文件发生的情况有关:

  • 已分阶段更改
  • 没有未分阶段的更改

总结:

  • reset --merge 总是丢弃索引(分阶段更改);如果任何文件上存在未暂存和暂存的更改,则中止
  • reset --keep 保留但取消分级索引;如果重置目标触及同一个文件,则中止

测试场景:

echo First > file.txt
git add file.txt
git commit -m 'first'
git tag v1
echo Second >> file.txt
git commit -am 'second'
git tag v2
echo New > newfile.txt
git add newfile.txt
git commit -m 'third'
git tag v3
echo 'More stuff' >> file.txt
git add file.txt

我们现在有三个提交,'file.txt' 在 v1 和 v2 之间发生变化,但在提交 v2 和 v3 之间没有变化。

索引和新 HEAD 之间没有变化

在这种情况下:

  • git reset --merge v2 丢弃这些更改
  • git reset --keep v2 保留它们,但取消暂存它们。

索引和新 HEAD 之间的变化

如果我们尝试重置为 v1:

  • git reset --merge v1 丢弃更改
  • git reset --keep v1 拒绝:

    error: Entry 'file.txt' would be overwritten by merge. Cannot merge.
    fatal: Could not reset index file to revision 'v1'.
    

索引和新 HEAD 之间的更改,以及未分级的更改

    git echo "Even more things" >> file.txt

现在,两者都失败了,但错误消息略有不同:

  • git reset --merge v1

    error: Entry 'file.txt' not uptodate. Cannot merge.
    fatal: Could not reset index file to revision 'v1'.
    
  • git reset --keep v1

    error: Entry 'file.txt' would be overwritten by merge. Cannot merge.
    fatal: Could not reset index file to revision 'v1'.
    

对不相关文件的分阶段和非分阶段更改

echo Unrelated > unrelated.txt
git add unrelated.txt
echo Stuff >> unrelated.txt

现在这有点奇怪:

  • git reset --merge v1

    error: Entry 'unrelated.txt' not uptodate. Cannot merge.
    fatal: Could not reset index file to revision 'v1'.
    
  • git reset --keep v1

    两组更改都被保留,但不分阶段。

没有分阶段的更改,而是非分阶段的更改

为了完整起见,它们的行为相同:重置成功并且文件保持未暂存状态。

【讨论】:

    【解决方案2】:

    它们在处理合并冲突时是不同的,例如这会产生冲突

    git init
    echo 333 > foo.txt
    git add foo.txt
    git commit -m 333
    git checkout -b feature
    echo 444 > foo.txt
    git commit -am 444
    git checkout master
    echo 555 > foo.txt
    git commit -am 555
    git merge feature
    

    然后

    $ git reset --keep
    fatal: Cannot do a keep reset in the middle of a merge.
    
    $ cat foo.txt
    <<<<<<< HEAD
    555
    =======
    444
    >>>>>>> feature
    

    对比

    $ git reset --merge
    
    $ cat foo.txt
    555
    

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2015-06-01
      • 1970-01-01
      • 2014-09-03
      • 2014-10-22
      相关资源
      最近更新 更多