2016-11-14 108 views
-1

处理一些代码并希望稍后保存它的一部分。假设在两个变更集之间没有太多的事情发生,我决定去git stash -p。一个小时左右后,我们意识到它会变得毛茸茸的,并且不想松开我的藏匿处。所以我想创建一个分支。从git stash中自动引用合并分支

不幸的是做一个简单的

git branch stash-branch [email protected]{0} 

不会产生我想要的结果。望着树我看到

* 99b0d0c (refs/stash, stash-branch) WIP on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|\ 
| * d45ddae index on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|/ 
* 2af1f8b (HEAD -> my-dev-branch) PARTIAL but it builds again! 
| * d8bb99f (origin/my-dev-branch) PARTIAL but it builds again! 
|/ 
* fe1296d PARTIAL (doesn't compile) 

我的预期是什么stash-branch是在d45ddae,但并没有出现这样的工作。噢,我会去寻找另一种自动执行此操作的方法。

经过一番搜索,找不到任何东西。所以我的问题:是否有一种自动的方式在[email protected]{N}的提示之前引用提交?我所有的努力导致新制作的分支指向my-dev-branch

编辑:上面的git branch命令是不正确的。已更正。

此外,据我所知git stash branch总是自动检出分支。在这种情况下,我只想在现有的sha上创建一个新的分支。

基本上,我想创建一个新的分支,而不检查出来,在d45ddae

回答

1

你形容“创建分支出来藏匿的”,这是与完成:

git stash branch <branchname> [<stash>] 

,但你看作为一个命令:

git branch [email protected]{0} 

(这是缺乏一个分支名,并运行git branch命令而不是git stash命令)。

好像你什么是git stash branch,例如:

git stash branch newbr 

(默认是使用主藏匿,[email protected]{0})。这会创建一个新的分支,指向当前保存存储时的提交,然后应用存储(与git stash apply),然后成功 - 其中应该“始终” - 放置存储。

+0

'git branch'命令是一个错字。它已被纠正。因为它只是返回“不是有效的分支名称”。校正结果如下所示。带有'git stash branch'的问题在于它自动检出分支。这不是我想要的。 –

+0

是的,'git stash branch'创建并检出新分支,以便应用和删除存储。创建一个指向存储的父提交的分支名称*没有*切换到它是没有意义的,因为该提交将保持引用(通过存储)直到存储被删除,并且您可以随时通过' ^2'。直到阅读才能开始使用未隐藏的隐藏提交进行提交,并且希望为他们提供分支名称行为,则不需要分支名称*。 (不是它*伤害了*,给这些东西的名字很好。) – torek

+0

你比我更努力。我的藏匿名单经常被污染。我通常用快速的'git stash clear'来解决这个问题。使用分支我至少可以给它一个明智的名字,并且更有意识地删除它。 –

0

直到现在,我完全放弃了大脑的解决方案。这很简单。基本上我想解决藏匿的第二个父母。

* 99b0d0c (refs/stash, stash-branch) WIP on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|\ 
| * d45ddae index on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|/ 
* 2af1f8b (HEAD -> my-dev-branch) PARTIAL but it builds again! 

因此,为了创建一个具有正确变更集的新分支,所有需要完成的操作都是遵循第二个父级。即

git branch stash-branch [email protected]{0}^2 

导致以下:

* 99b0d0c (refs/stash) WIP on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|\ 
| * d45ddae (stash-branch) index on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|/ 
* 2af1f8b (HEAD -> my-dev-branch) PARTIAL but it builds again! 

现在,你为什么会想这样做?说多个文件已经被编辑,只有一些已经被添加。看看下面:

$ git status 
On branch my-dev-branch 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     modified: Makefile 

Changes not staged for commit: 

     modified: README.md 

现在运行下面的命令来看看,我第一次看到的,意想不到的输出:

$ git show [email protected]{0} 
commit 2cbcfa95123ab775107311286418f95180a0ca55 
Merge: 9e620e0 26f500a 
Author: Trevor Norris <[email protected]> 
Date: Tue Nov 15 11:51:09 2016 -0700 

    WIP on my-dev-branch: 9e620e0 working on stuff 

diff --cc README.md 
index d15916e,d15916e..1cf2d60 
--- a/README.md 
+++ b/README.md 
@@@ -2,6 -2,6 +2,8 @@@ 



++FOO BAR 
++ 

哪儿缓存的变化去了?他们坐在分支承诺存储(可以通过做git show [email protected]{0}^2验证这一点)。这意味着可以创建一个新的分支,而不需要检查它,只需指向缓存的更改:

git branch cached-changes [email protected]{N}^2 
+0

我认为更好的答案是“缓存更改在哪里”:他们没有*去*任何地方。他们是正确的,他们一直在这里。你在这里做的是创建一个指向* index * commit的名字。 (这两者都没有问题,但是您可能需要考虑工作树提交,以及第三次提交(如果存在)。请参阅http://stackoverflow.com/a/20412685/1256452和http://stackoverflow.com/ a/20589663/1256452。) – torek

+0

优秀的参考文献。在阅读完这些内容后,我会修改我的答案。 –