意外地将错误的分支合并到我的.有没有办法删除这些不需要的文件?

Mel*_*Dog 8 git merge

我不小心将一个同事分支合并到我正在处理的分支机构中.从那以后我做了几次提交,所以理想情况下我不想恢复到合并前分支的状态.但是,我没有做任何改变他的文件的事情.

有没有办法可以从我的文件中删除他的分支文件?

(对不起,我是git的新手 - 希望我的术语有所了解).

Tim*_*sen 9

也许这里最简单,最安全的选择是恢复你提交过几次提交的合并提交.为此,请使用历史git log记录中的合并提交,并记录该提交的SHA-1哈希值.然后,执行以下操作:

git revert -m 1 <SHA-1>
Run Code Online (Sandbox Code Playgroud)

以下<SHA-1>是要撤消的合并提交的哈希值.该-m 1选项告诉Git恢复到第一个父节点,即发起合并的分支,它应该是您的分支.

  • 这样做的缺点是 Git 仍然相信合并发生了(因为它确实发生了!),所以如果你*想要*合并,这可能会让你稍后感到心痛。 (2认同)

tor*_*rek 6

如果您尚未将提交推送(发布)到任何地方,最简单的解决方法是重新合并合并。(即使您已经发布了它们,您也可以执行此操作,但请参阅警告。)

\n\n

该命令git rebase 复制提交,但默认情况下,它会丢弃合并提交。正常的目标git rebase是复制提交,以便它们出现在不同的点。例如,你可能有这样的:

\n\n
...--o--*--o--o     <-- master\n         \\\n          A--B--C   <-- yourbranch\n
Run Code Online (Sandbox Code Playgroud)\n\n

master在您从某些“上游”存储库 ( ) 中获取一些新提交后origin,在您的存储库中,现在您希望使您的A-B-C序列出现在 的最后一次提交之后master,而不是出现在提交之后*(提交*是第一个提交,即对两者 master yourbranch

\n\n

然后,您git checkout yourbranch && git rebase master和 Git 将提交复制到新的提交A\'-B\'-C\'(原始副本),并丢弃旧的提交:

\n\n
                A\'-B\'-C\'   <-- yourbranch\n               /\n...--o--*--o--o     <-- master\n         \\\n          A--B--C   [abandoned]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,由于git rebase通常会放弃合并,因此您可以重新定位到现在所在的位置,并在此过程中丢弃合并:

\n\n
...--o--*--o--o--o--...\n         \\     \\\n          A--B--X--C--D   <-- yourbranch\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,您的合并提交X是一个错误,您希望摆脱它(我将其绘制为合并主线,但它可能会合并其他内容\xe2\x80\x94,您合并的内容并不重要,只是它一个合并提交,当 Git 查看它时,其中会出现两个向后指向的箭头)。所以你找到提交的哈希ID*并运行:

\n\n
git checkout yourbranch; git rebase <hash-id>\n
Run Code Online (Sandbox Code Playgroud)\n\n

Git 将要复制的提交列为“那些在 之后*,直到 顶端yourbranch,除了任何合并”。那是A-B-C-D。然后它“复制” A(它不需要,所以A默认情况下它实际上重新使用原始文件),“复制” B(同样它不需要),复制C(这次它必须\xe2\x80 \x94原始C连接到X,新的必须连接到B),并复制Dyourbranch指向最后复制的提交并放弃旧链:

\n\n
...--o--*--o--o--o--...\n         \\     \\\n          A--B--X--C--D  [abandoned]\n              \\\n               C\'-D\'  <-- yourbranch\n
Run Code Online (Sandbox Code Playgroud)\n\n

被遗弃后,和D的所有三个都D完全从地图上消失:CX

\n\n
...--o--*--o--o--o--...\n         \\\n          A--B\n              \\\n               C\'-D\'  <-- yourbranch\n
Run Code Online (Sandbox Code Playgroud)\n\n

随着CD消失,我们甚至不需要C\'D\'标记。不过,我会把它们留在里面,只是解决我们不再需要的问题:

\n\n
...--o--*--o--o--o--...\n         \\\n          A--B--C\'-D\'  <-- yourbranch\n
Run Code Online (Sandbox Code Playgroud)\n\n

的提交消息C\'看起来像 的提交消息C,并且 的提交消息D\'看起来像 的提交消息D;和C\'D\'与原件“一样好”\xe2\x80\x94,或者实际上,甚至更好:它们是新的和改进的!:-) 因为他们省略了合并的内容。

\n\n

注意:因为这些“新的和改进的”,所以它们有新的哈希 ID。这意味着,如果您已经发布了它们,那么任何拥有旧版本的人仍然拥有它们,并且可以通过旧的哈希 ID 来了解它们。您现在必须说服其他 Git 用户以及他们的其他存储库,采用的和改进的副本并丢弃旧的和糟糕的副本,就像您所做的那样。

\n\n

如果您尚未在任何地方发布这些提交,则其他人也没有旧的提交,因此无需担心。

\n\n
\n\n

顺便请注意,您可以git rebase进入新的基础,就像更新到最新的master. 这只是复制所有提交(到新位置),而不是重新使用可以的提交(在旧位置)并复制其余部分。(但是,当您执行此操作时,您将面临任何与更新相关的问题,就像任何此类变基一样。也就是说,如果更新的人master或您要更新的内容接触了相同文件中的相同代码,您将必须解决发生的任何合并冲突。如果您仅删除合并,并且合并中没有合并冲突,则变基中不会有任何冲突。)

\n