如何在Git中维护本地和远程存储库之间的文件差异?

时间:2017-03-10 21:16:53

标签: git

我对存储库的本地克隆进行了一些更改,并将它们提交到本地分支中。让我们调用这些更改"提交A"。我想继续处理提交A,但是当我准备好合并回主分支时,我不想让提交A合并。

我认为我可以使用{{1}}并删除提交A,但有没有办法让该提交保持活动状态,以便将来的工作可以在其上完成?然后,再次,工作合并回主分支而不提交A.

我意识到我所做的事情有点粗略,但是在提交A中改变的行与它上面的工作正交。这些更改与计算机(生产和测试)之间的差异有关,因为它们必须引用第三方库的不同版本。

5 个答案:

答案 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)

您希望从BC推送更改,而不是A;此外,您希望本地继续根据ABC的所有更改继续工作。

为了让事情尽可能顺利地运行,您还希望git能够意识到来自BC的更改会得到处理,以便稍后(当您拥有{{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。