我偶然将一个同事分支合并到我正在处理的分支机构中。从那以后我做了几次提交,所以理想情况下我不想恢复到合并前分支的状态。但是,我没有做任何改变他的文件的事情。
有没有办法可以从我的文件中删除他的分支文件?
(抱歉,我是git的新手 - 希望我的术语已经失效了。)
答案 0 :(得分:8)
这里最简单,最安全的选择可能是恢复你提交过几次提交的合并提交。为此,请使用git log
在历史记录中查找合并提交,并记录该提交的SHA-1哈希值。然后,执行以下操作:
git revert -m 1 <SHA-1>
此处<SHA-1>
是您要撤消的合并提交的哈希值。 -m 1
选项告诉Git恢复到第一个父节点,即发起合并的分支,它应该是您的分支。
答案 1 :(得分:1)
如果您没有在任何地方推送(发布)您的提交,最简单的解决方法是将合并重新绑定。 (即使你已经发布了它们,你也可以这样做,但请注意警告。)
命令git rebase
复制提交,但默认情况下,它丢弃合并提交。 git rebase
的正常目标是复制提交,以便它们来自不同的点。例如,你可能有这个:
...--o--*--o--o <-- master
\
A--B--C <-- yourbranch
从某些&#34;上游&#34;中获取一些新的master
提交后,在您的存储库中存储库(origin
),现在您希望在A-B-C
上的最后一次提交之后生成master
序列,而不是在提交*
之后(提交) *
是第一次提交 master
和 yourbranch
)。
然后你git checkout yourbranch && git rebase master
和Git将提交复制到新的,A'-B'-C'
(原件的副本),然后扔掉旧的:
A'-B'-C' <-- yourbranch
/
...--o--*--o--o <-- master
\
A--B--C [abandoned]
但是,由于git rebase
通常丢弃合并,您可以重新定位到现在的位置,并在此过程中抛出合并:
...--o--*--o--o--o--...
\ \
A--B--X--C--D <-- yourbranch
在这里,您的合并提交X
是一个错误,您希望摆脱它(我已将它绘制为合并主线,但它可以合并其他东西 - 它不会真的很重要你合并了什么,只是它是一个合并提交,当Git看着它时,有两个向后指向的箭头。因此,您可以找到提交*
的哈希ID并运行:
git checkout yourbranch; git rebase <hash-id>
Git将要复制的提交列为&#34; *
之后的提交,直至yourbranch
的提示,除了任何合并&#34;。那是A-B-C-D
。然后&#34;复制&#34; A
(它没有必要,因此它实际上默认重复使用原始A
),&#34;副本&#34; B
(同样没有必要),复制C
(此时此刻 - 原始C
已连接到X
,而新版本必须连接而是复制B
),并复制D
,使yourbranch
指向最后复制的提交并放弃旧链:
...--o--*--o--o--o--...
\ \
A--B--X--C--D [abandoned]
\
C'-D' <-- yourbranch
放弃D
后,D
,C
和X
的所有三个完全消失了地图:
...--o--*--o--o--o--...
\
A--B
\
C'-D' <-- yourbranch
C
和D
消失后,我们甚至不需要C'
和D'
标记。不过,我会留下他们,只是理顺我们不再需要的纠结:
...--o--*--o--o--o--...
\
A--B--C'-D' <-- yourbranch
C'
的提交消息与C
的提交消息类似,D'
的提交消息与D
的提交消息类似;并且C'
和D'
和#34;一样好&#34;原件 - 或者,实际上甚至更好:他们是新的和改进的! :-)因为他们省略了合并的东西。
警告:因为这些是&#34;新的和改进的&#34;,所以他们有新的哈希ID 。这意味着如果您已经发布了,那么拥有旧版本的人仍会拥有它们,并且会通过旧的哈希ID了解它们。你现在必须说服这些其他Git用户和他们的其他存储库接收新的和改进的副本并丢弃旧的和糟糕的副本,就像你一样。
如果你没有在任何地方发布这些提交,没有其他人拥有旧提交,并且没有什么可担心的。
顺便说一下,您可以git rebase
加入新基地,就像更新到最新master
一样。这只是复制所有提交(到新位置),而不是重新使用它可以提交的任何提交(在旧位置)并复制其余的提交。 (但是当你这样做时,你将面临任何与更新相关的问题,就像你对任何这样的rebase一样。也就是说,如果更新master
的任何人,或者你正在更新的任何内容,触及了相同的文件中的相同的代码,您必须解决发生的任何合并冲突。如果您只是删除合并,并且没有合并冲突合并后,在篮板中不会出现任何变化。)