2016-12-27 88 views
0

我想知道下面是否有任何不同。应用隐藏的更改和樱桃采摘更改是否有区别?

(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

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

+0

我有点困惑......它看起来像是在“将”更改“移动”到原来的位置,对吗?在第一种情况下,你将变化存储起来立即弹出;这没有我能想到的净效果。您仍然在工作树中进行更改并未提交。在第二种情况下,除非你的分支在这个序列开始时先于原点,樱桃选择只是将变化“移动”到他们已经存在的位置......我在这里错过了什么? –

回答

0

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

你应该能够看到的差异,如果你尝试双双出局,然后检查即引用日志或像其他一些扩展视图:

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

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

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存储列表”的输出中删除存储条目。

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

git commit -a -m "too lazy to write a good messsage" 
后“混帐藏匿弹出”

我们也可以说:

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中找到。请注意,无法访问并不意味着您无法恢复它们。)