应用藏匿的变化和挑剔的变化之间是否有任何区别



我想知道以下之间是否有任何不同。

(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

如果是这样,有什么区别?

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

如果尝试同时尝试,则应该可以看到差异

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

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

首先回答标题中的问题:

应用藏匿的变化与樱桃采摘提交完全不同。

应用藏匿的更改时,藏匿处的更改将作为工作树中的未投入的编辑文件应用。

樱桃挑选提案,就是要说您要在一个指定的提交中应用"差异"并提交提交。基本上,您只需从任何地方选择一个提交,然后将其作为当前分支上的下一个提交。例如,如果您在错误的分支上做了一些提交,并且要稍后将其挑选到正确的分支。

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

有很多差异。

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列表"时,将存在藏匿的更改,而在第二种情况下,您必须运行" git reflog"才能找到"藏匿"的更改。

在您的第一种情况(1)中,您将进行" git储藏式弹出"。它将直接撤消上一行(git stash保存)。它会将藏匿处的更改添加到您本地工作树中,但不会添加任何新提交。头仍将指向原始的"某个分支"。它还将从" git储藏列表"的输出中删除藏匿条目。

在您的第二种情况(2)中,您将进行" git樱桃挑战sha1"。这将直接撤消上一个命令(git重置 - 硬)。您将获得提交。为了在(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中找到。

最新更新