我对存储库的本地克隆进行了一些更改,并将它们提交到本地分支中。让我们调用这些更改"提交A"。我想继续处理提交A,但是当我准备好合并回主分支时,我不想让提交A合并。
我认为我可以使用{{1}}并删除提交A,但有没有办法让该提交保持活动状态,以便将来的工作可以在其上完成?然后,再次,工作合并回主分支而不提交A.
我意识到我所做的事情有点粗略,但是在提交A中改变的行与它上面的工作正交。这些更改与计算机(生产和测试)之间的差异有关,因为它们必须引用第三方库的不同版本。
答案 0 :(得分:1)
我想我可以使用
git rebase -i
并删除提交A,但有没有办法让该提交保持活动状态,以便将来的工作可以在其上完成?然后,再次,工作合并回主分支而不提交A.
你可以标记它。从分支中删除的提交不会消失。然后当你需要它时,你可以挑选标签。那就是:
git tag somename SHA1
...
git rebase -i OLDREV
...
git cherry-pick somename
答案 1 :(得分:1)
创建两个分支,一个分支包含Prod的更改,其中包含对Testing的更改。然后你的工作流程会是这样的:
1) Pull updates
2) Create a local working/topic branch
3) Merge from Test branch
4) Do your work, test, etc.
5) When ready to push back, first merge from Prod branch
6) Merge back into your main/develop/master branch
7) Push
那会有用吗?
答案 2 :(得分:1)
我在那种情况下所做的是隐藏提交A中的更改(不提交它们)。这样,每当我想要处理这些变化时,我都会应用存储(见下文),但只要我不承诺它们,我就不必担心它们最终会在远程。如果A中更改的文件与您正在处理的文件不同,这是最简单的。
现在进行设置,假设A是分支上的最后一次提交。
git reset --soft HEAD~1
git stash
后来:
git stash list
git stash apply stash@{n}
git stash list
是找n
答案 3 :(得分:1)
在我得到答案之前:我建议以更正式的方式解决根问题(在不同的机器上需要不同的代码),因为我怀疑这最终会给你带来更多麻烦。根据语言和工具的不同,我认识到这可能并不容易(当然,我不能在不知道语言,工具等的情况下提供通用解决方案),但您可能会发现它值得。
但是,嘿,假设你现在的方法对你来说很好,这就是你如何坚持下去:
你从这种情况开始
X --- X <--(origin/master)
\
A --- B --- C <--(master)
您希望从B
和C
推送更改,而不是A
;此外,您希望本地继续根据A
,B
和C
的所有更改继续工作。
为了让事情尽可能顺利地运行,您还希望git能够意识到来自B
和C
的更改会得到处理,以便稍后(当您拥有{{1}时并且想要推动它)你最终不会做一堆毫无意义的冲突解决。
首先进行互动式反思;但不是删除D
,而是将其移到TODO列表的末尾。完成此操作后,您应该
A
(技术上A,B和C仍在闲逛,如果你需要,你可以回复它们;但如果一切顺利,你将不需要。)
现在您想要提交X --- X <--(origin/master)
\
B' --- C' --- A' <--(master)
提交,推送,然后将master
拉回master
。
A'
产生
git reset --hard HEAD^
git push
git reset --hard HEAD@{1}
继续,必要时重复
答案 4 :(得分:1)
使用git rebase --onto
来修改所有内容(但不包括在内)A. rebase documentation有一个很好的例子,可以使用符合您所描述方案的--onto
。基本上你会这样做:
git rebase --onto master A
如果您不希望当前分支被重新定位(因为您希望以后继续使用它),那么首先检查一个新的临时分支:
git checkout -b new-temporary-branch
git rebase --onto master A
然后通过将master合并到master中来快速转发master。