git stash应用特定索引

时间:2018-12-18 17:52:50

标签: git github

我从上游https://github.com/F5Networks/k8s-bigip-ctlr分叉并克隆,在开发分支'vli-dev'中进行了一些本地更改,在此过程中,上游进行了一些更改,因此我保留了本地更改,重新建立了本地开发的基础上游master分支上的'vli-dev'分支,现在我想git stash将我的本地更改逐一应用于重新开发的分支,但是会出现以下问题:

$ git stash list
stash@{0}: WIP on vli-dev: 3ef5efd ConfigMap serverssl support with 
f5ServerSslProfileAnnotation
stash@{1}: WIP on vli-dev: 1408dc3 Enable configmap to add custom irule
stash@{2}: WIP on vli-dev: bd6d985 Allow user to attach custom irule to Ingress
stash@{3}: WIP on vli-dev: 2452696 Allow ingress to attach X-Forwarded-For iRule
stash@{4}: WIP on vli-dev: cd01ce5 Route health monitor always default from http monitor regardless what's configured in route health monitor annotation, this patch fix it

$ git stash apply 0
error: Your local changes to the following files would be overwritten by merge:
pkg/appmanager/resourceConfig.go
schemas/bigip-virtual-server_v0.1.7.json
Please commit your changes or stash them before you merge.
Aborting

我注意到本地更改实际上是存储在“ stash @ {1}”中的更改

当我git stash应用索引0时出现,索引1的更改已应用到由索引1更改的文件,索引0的更改未应用,我该如何解决?我的意图是逐个应用存储索引以解决与上游的任何冲突更改,并为上游创建拉取请求。

2 个答案:

答案 0 :(得分:0)

听起来您正在使用存储库来尝试执行rebase所做的事情,而不仅仅是让rebase执行。暂存的唯一真正目的是搁置未提交的更改,这样它们就不会“妨碍”您要执行的某些立即操作。提交更改后,没有理由将其存储-实际上,您要使用存储进行的操作恰恰是重新设计基准的目的。

现在,我假设您当前没有要保留的任何未提交的更改。您可以使用git status来确认您有哪些未提交的更改。一旦您的工作树干净,我就可以这样做:

(1)在开始存储东西之前,将本地分支恢复到其状态。您可以为此使用reflog

git reflog vli-dev

,这将向您显示vli-dev所引用的所有提交。查找您上次执行的本地提交。它将具有类似vli-dev@{14}的名称。 (花括号中的数字将指示之前进行了多少更改,因此14仅是示例。)那么您将

git checkout vli-dev
git reset --hard vli-dev@{14}

将您的本地分支恢复到该状态,还原您已存储的所有更改。这也会撤消变基,因此下一步您需要

git rebase origin/master 

这会将您的每个vli-dev提交中的更改复制到基于新获取的master提交的新提交中。

现在,不必担心以这种方式创建的中间提交是否确实引入了错误。 (这是我对rebase的许多常用用法的最强烈的保留。)您当然可以签出并进行测试。如果在某个中间状态下发现错误,则必须确定值得解决的麻烦程度。此时,您可以从损坏的提交中创建一个新分支,进行更改,以使其通过测试git commit --amend,然后将其余提交基于该新修改的提交。

要做的另一件事是清理所有那些现在不必要的藏匿处。如果您有真正未提交的更改,则需要将其应用到重新设置的分支上。但其余的可以删除(git stash drop)。或者,如果您完全确定没有任何隐藏项包含重要数据,则可以

rm .git/refs/stash
rm .git/logs/refs/stash

答案 1 :(得分:0)

我想从列表中应用特定的存储,为此我使用了 git stash pop stash @ {2}

如果使用此命令,它将应用特定的存储并将其从存储列表中删除;如果您不想删除存储,则只需使用 git stash apply stash @ {2}

如果要删除特定的存储,请使用 git stash drop stash @ {1}

如果要清除列表中的所有存储,请使用 git stash clear

引用:https://www.atlassian.com/git/tutorials/saving-changes/git-stash