我的目标很容易解释,但是我找不到任何方法。 假设我有3个分支。 A,B和C
A -------.
\--------.----------- B
\
.-------------- C
我只是想将整个分支“ C”推送到分支“ B”。让我解释一下:我不想保留在我从B创建C之后在B中所做的任何事情。我只希望B具有与分支C完全相同的代码。
我如何安全地做到这一点?
这两个文件之间的差异超过10000,因此不能手动选择。
我尝试了几种方法,包括将git合并为“他们的”策略,但是我仍然存在很多冲突。
答案 0 :(得分:5)
这三个命令中的任何一个都与潜在冲突文件的数量或代码的差异无关
# if you don't need to checkout the branch immediately
git branch -f B C
# if you DO want to checkout the branch immediately
git checkout -B B C
# if you branch B is ALREADY checked out
git reset --hard C
将使B
指向与C
相同的提交,从而使它们完全相同,代码和历史记录相同。没有冲突解决,没有合并,它是瞬时的。
请注意,这被视为对B
最近历史的重写,因此,如果您要与任何人共享分支机构B
,请不要使用它。 >
在分支B
分支之后,它还将取消引用在C
上进行的任何提交,因此,如果您有任何疑问,请事先使用
B
。
git branch backup-B B
最后...您忘记备份了,后悔了吗? git reflog
将列出HEAD
的先前位置,您会在此处找到B
,用git reset --hard <old position hash>
将其恢复,或用{{1} }
答案 1 :(得分:4)
结帐B然后重置HEAD
git checkout B
git reset --hard C
答案 2 :(得分:3)
没有theirs
策略。有一个-X theirs
选项,但这不是一种策略。 Git称之为“策略选项”,这是一个坏名字:听起来像是提供策略的选项,但实际上,它是 其他 other 策略的选项,即-s
选项中的一个,此处默认为-s recursive
。我称-X
为“扩展选项”,是为了避免将其与-s
选项混淆。
有关为什么的描述,即使一次存在,也没有-s theirs
,请参见this answer by VonC。
此处其他答案中的各种重置方法(git checkout -B
,git reset --hard
等)通常是解决方法。但是,如果您想轻松产生-s theirs
策略的效果,请参见jthill's answer至Is there a "theirs" version of "git merge -s ours"?
答案 3 :(得分:2)
如果您只想放弃B
独有的所有更改,则将其删除:
git branch -d B
检出C
并从中创建一个新的B
:
git checkout C
git branch B
B
现在与C
完全相同。