如何在没有历史记录的情况下将特定提交推送到存储库(不包括先前的提交)?

时间:2019-11-27 09:59:43

标签: git commit git-commit upstream-branch

我正在尝试将特定的提交推送到upstream存储库中,该提交与我正在处理的存储库相同,但是有一些细微的变化。

当前存储库位于upstream的前面,我想推送我在当前存储库中所做的一些更改,但不是全部。

当我做类似

git push upstream <commit SHA>:<remotebranchname>

它可以工作,但是它也可以推送在我的upstream存储库中的最后一次提交与我正在推送的提交之间完成的所有其他提交。

但是,我只希望推送在该提交中所做的更改,而不是在该提交之前进行的更改。

如何避免它们被整合?

更新给出的答案说明了如何推送特定的提交(包含所有历史记录),但我想仅推送特定的提交而没有其历史记录。

3 个答案:

答案 0 :(得分:0)

首先,您必须使您的本地历史记录看起来像您想要推送的内容。然后您可以推动。

数千种可能的方法之一是使用git rebase,例如:

git rebase -i upstream/remotebranchname

将显示一个编辑器窗口,其中列出了您尚未提交的提交列表以及一个小的文档操作。只需保留要推送的提交的行即可,但删除不希望推送的行。然后保存并退出。希望您不会有冲突(在想要的提交中更改了文件,在不需要的提交中更改了文件)。

然后您可以推动。

((如果您在本地要保留不想推送的提交(出于某种原因),请首先制作一个标签,例如:

git tag usefultagname

答案 1 :(得分:0)

为了避免进行某些更改,应将分支设置为要包含的最后一个提交。在您的情况下,最好的选择是创建一个新分支,将其重置为您要包括的最后一个提交,樱桃式地选择要推送的一个提交。

git checkout -b new-branch # make sure to do this **while you're on** the upstream branch
git pull <remote> <upstream branch> #just to be sure you're right where the remote upstream branch is
git cherry-pick <commit hash>
git push <remote> new-branch

答案 2 :(得分:0)

这是禁止的。

Git提交包含其父哈希ID(S)。如果您作为发送者向其他Git提供提交 H (对于某些哈希ID H ),则其他Git无需接受 H 它也有 H 的父母(或父母,如果是合并提交)。因此,您必须提供 H 的父母。除非依次有 个(或那些)提交的父项,否则它不需要接受该提交。

换句话说,提交的ID是它的哈希,但是要在存储库中拥有,则意味着您还拥有所有其祖先 1 因此,处理此类提交的唯一方法是拥有其所有祖先。

此时,您可以对该提交进行拷贝(例如,通过git cherry-pick),以得到具有差异的不同提交。 哈希ID,不同的父级,以及由于该不同的父级而可能需要的其他任何差异。 2 然后,您可以提供此 different 提交(通过其他哈希ID)添加到其他Git存储库。如果其他Git存储库中确实有此新副本的父级,则它们将不会首先要求任何其他提交。


1 此规则在浅表克隆中得到了放松,并且正在进行其他方面对其进行放松的工作,但至少在原则上仍是必需的。 没有有血统的承诺至少是可疑的;这可能是假的;链的完整性是通过一直沿链回到根部来确定的。

2 尤其是,您可能还需要其他快照。请记住,Git提交保存的是快照每个文件的完整副本),而不是变更集。因此,如果要将提交H'的副本H应用于提交B,则H'中所需的不是H中的快照,而是将更改 H 放入变更集,然后应用将变更集更改为提交B,同时还要考虑H的父级和B之间的其他差异。要将H更改为变更集,我们(或Git)将其快照与父级快照进行比较。

git cherry-pick命令是一种工具,用于在H'签出后由H及其父母创建B。)