应用隐藏的更改和挑选更改之间有什么区别吗?

时间:2016-12-27 20:48:24

标签: git

我想知道以下内容是否有任何不同之处。

(1)

  • git checkout some-branch
  • (进行一些本地更改)
  • git stash save
  • git stash pop

(2)

  • git checkout some-branch
  • (进行一些本地更改)
  • git commit -m "too lazy to write a good message";假设提交哈希为3282a23d5ddb41328e8a61b4ed5c9faf59af673e
  • git reset --hard origin/some-branch
  • git cherry-pick 3282a23d5ddb41328e8a61b4ed5c9faf59af673e

如果是,那有什么区别?

2 个答案:

答案 0 :(得分:0)

git存储库中可能存在一些小的差异,因为在第二种情况下,将创建一个提交,commitreset操作将向前和向后移动分支。相反,当git stash没有更新分支时。如果您想知道,git stash将内容添加为提交(实际上,它添加了2或3个提交条目,我完全不记得)。

如果您尝试两种方法,然后检查即reflog或其他一些扩展视图,您应该能够看到差异:

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

一般而言,普通用户和正常未来使用的净效果将是相同的:分支获得了新内容,并且临时提交被隐藏(不一定完全消失 - 作为reflog或上面的命令显示)。

答案 1 :(得分:0)

首先回答标题中的问题:

应用隐藏更改与采摘提交完全不同。

当您应用隐藏更改时,存储中的更改将作为未提交的已编辑文件应用于您的工作树中。

挑选提交,就是说你想在一个指定的提交中将“diff”应用于当前分支并进行提交。您基本上只需从任何地方选择一个提交,并使其成为当前分支上的下一个提交。例如,如果您在错误的分支上进行了一些提交,并且希望稍后将它们选择到正确的分支,那么它很有用。

然后解释两个命令序列之间的区别:

存在很多差异。

git checkout some-branch
# (make some local changes)
git stash save

实际上与以下内容完全相同:

git checkout some-branch
# (make some local changes)
git commit -a -m "My manually stashed away changes"
git reset --hard origin/some-branch

在这两种情况下,你最终会留在“某个分支”,而你的新的本地变化都不存在,但是“被”藏起来了。在第一种情况下,当您键入“git stash list”时,将显示存储的更改,而在第二种情况下,您将必须运行“git reflog”以查找“存储”的更改。

在你的第一个案例(1)中,你之后会做一个“git stash pop”。它将直接撤消前一行(git stash save)。它会将隐藏的更改添加回本地工作树,但不会添加任何新提交。 HEAD仍将指向原始的“某个分支”。它还将从“git stash list”的输出中删除存储条目。

在你的第二个案例(2)中,你之后会做一个“git cherry-pick SHA1”。这将直接撤消上一个命令(git reset --hard)。你将收回提交。为了在情况(1)中得到相同的结果,你必须运行

git commit -a -m "too lazy to write a good messsage"

在“git stash pop”之后

我们也可以这样说:

git checkout some-branch
# (make some local changes)
git stash save
git stash pop

或多或少与:

相同
git checkout some-branch
# (make some local changes)
git commit -a -m "My manually stashed away changes"
git reset origin/some-branch          # without --hard

两者基本上什么都不做(无视你得到的“无法访问”提交,你可以在reflog中找到。请注意,无法访问并不意味着你无法恢复它们。)