我想知道以下之间是否有任何不同。
(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存储库中可能存在一些小差异,因为在第二种情况下,将创建一个提交,并且commit
和reset
操作将将分支移动并向后移动。相反,当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中找到。