- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须合并两个独立的git存储库orig和work。工作是作为orig的一个子目录的派生创建的,有些实验性的更改还没有提交给orig。
~> mkdir WORK
~> cp -a ORIG/src/* WORK
~> cd WORK
~/WORK> # apply some experimental changes to WORK
~/WORK> git init
~/WORK> git add .
~/WORK> git commit -m "Entirely disconnected commit."
src
而不是
./src/FILE
)存在,
./FILE
合并到工作
git mv
git merge -X theirs --allow-unrelated-histories ORIG/master
./src
合并策略,并重新应用
ORIG/master
查找相关部分,
master
和来自外部的文件
theirs
不存在于
最佳答案
有没有可能
不知怎么的,是非常开放的,所以是的。
在orig中标识创建工作的提交
简单的方法是:记住它。另一种方法是查找提交,其中该提交的源树与您保存的子树匹配。这很困难(但并非不可能,如果您愿意进行精确的子树匹配,则速度相当快:使用子树的散列ID),但会打开多个匹配的可能性:根据源存储库的不同,ORIG
中的许多提交似乎都有一个子树与WORK
中的根提交树匹配。在这种情况下,它们中的任何一个都可能是合适的,但不能保证。
问题是,它并没有真正给你买什么好东西,还没有。这可能会使合并步骤更容易(见下文)。
更改工作,以便显示完整的文件路径(即./src/FILE
而不是./FILE
)
是的,有点;或者不是,取决于你的意思。您可以使用git filter-branch
制作存储库的副本,并在副本中进行此更改。副本不再与原始版本兼容,但是如果您计划有一个标志日,并将每个人切换到副本,那么它非常简单。
合并存储库而不丢失历史?
这是非常棘手的部分。
git从未真正失去历史:历史,在git中,是(是?)承诺。承诺是永久不变的。但是,git通过分支名称(以及其他名称,如标记)记住提交,因此如果您强制分支名称停止记住某些提交,例如,这就是git filter-branch
在将所有筛选的提交复制到新提交之后所做的事情,那么这些提交实际上会被忘记。最后,如果您删除了找到这些提交的所有功能,git将通过垃圾收集来真正删除它们:git gc
。
同样,这也是git filter-branch
的工作方式:您告诉它将每个提交复制到一个新的提交,新的提交与原始提交非常相似,只是每个FILE
都被重命名为src/FILE
。然后,使所有分支名称指向新副本的最后一个,而不是原始副本的最后一个。删除所有保存的原始名称(git filter-branch
复制原始引用,以防万一),删除所有其他备用安全带和安全线(git reflog expire
等),强制垃圾收集通行证,然后poof,您的原始提交集已消失,您只有替换提交。
但是:提交是快照。您拥有ORIG
中的所有快照,您可以将您喜欢的WORK
中的所有快照(或通过git filter-branch
创建的修改后的替换副本)添加到其中。结果只是提交的总和。这不是一部两部作品交织在一起的历史:它只是一部说,实际上,“在<日期>这两部作品合并在一起,在那之前,我们有这两部独立的历史”。例如,ORIG
可能如下所示:
root--o--(history graph)---o <-- master
\ /
o--(branchy)--o--o <-- feature
WORK
可能如下所示:
o--o
/ \
root2--o--o------o <-- master
WORK
's
master
的名称更改为其他名称,您将拥有:
o--o
/ \
root2--o--o------o <-- workmaster
root--o--(history graph)---o <-- master
\ /
o--(branchy)--o--o <-- feature
git checkout master; git merge workmaster
,解决所有合并冲突git将抱怨
src/*
中的每个文件(位于
master
提示提交中)都有一个add/add冲突,因为常见的起点是“没有文件”-并根据合并的结果进行提交:
o--o
/ \
root2--o-------------o------o <-- workmaster
\
root--o--(history graph)---o--o <-- master
\ /
o--(branchy)--o--o <-- feature
ORIG
的存储库,其中有一个新的提交将两个历史记录连接起来。
git merge
是困难的,因为所有的文件都是冲突的。但是,如果您找到了所有文件都匹配的点,则可以使用
git replace
进行临时移植,而不是像上面那样合并。然后,您可以更容易地合并,甚至可以使替换永久(使用另一个
filter-branch
,这意味着所有这些)。
X
匹配。注意,我在这里也标记了
root2
的孩子:
o--o
/ \
root2--Y--o------o <-- workmaster
root--o--...--X----...-----o <-- master
\ /
o--(branchy)--o--o <-- feature
git replace
来告诉git:不要查看commit
Y
,而是查看新的替换commit
Y'
,这样大多数git都会看到:
o--o
/ \
Y'---o------o <-- workmaster
/
root--o--...--X----...-----o <-- master
\ /
o--(branchy)--o--o <-- feature
Y
和
root2
仍然存在,只是git不再查看它们(除了
git gc
或使用
--no-replace-objects
选项运行的任何命令之外)。
Y
之后找到子提交
root2
-幸运的是只有一个,但是如果有几个,我们可以将它们全部提交并运行:
git replace --graft <hash-of-Y> <hash-of-X>
git replace
。这给了我们上面的绘图,现在
Y'
将把
git merge
作为合并两个分支提示的公共提交。
o--o
/ \
Y'---o------o <-- workmaster
/ \
root--o--...--X----...-----o--o <-- master
\ /
o--(branchy)--o--o <-- feature
X
-并且我们确保不使用
git filter-branch
-filter分支将复制存储库,而不使用原始的
git --no-replace-objects filter-branch
和
Y
提交,而是使用
root2
和
X
提交。换言之,这些嫁接,现在是永久的,在我们的新的,又一次重写储存库(另一个国旗日转换,虽然运气好或计划好,同一天,只有一个国旗日)。
关于git - merge 没有通用历史记录但具有通用文件的git存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48929586/
我从一个 Mercurial 存储库开始,它有多个我试图 merge 到其中的子存储库,就好像它们一直是主存储库的一部分一样。它们从一开始就不应该是子存储库。 我整理了一个将旧历史转换为单个存储库的过
假设我有一个主线分支和一个功能分支。我已经多次将主线分支 merge 到功能分支中,但只有少数非常小的 merge 冲突。我想清理历史,以便最后只有一个 merge 。执行此操作的最佳方法是什么? 最
首先我使用heapq.merge创建了a&b的两个结果,但是在mergea&b之后,我发现a的列表是空的。 >>> a=merge([1,2],[3,4]) >>> b=merge([4,5],[6,
我和我的团队正在使用远离主轨道 (origin/dev) 的远程分支 (origin/our_feature_branch) 开发一项功能。 Gerrit用于审查等。 使用 git merge ori
这个问题在这里已经有了答案: Is there a way to merge with Strategy "ours" without producing a new commit? (1 个回答)
GitLab 无法自动 merge 请求。所有 merge 请求都会收到消息“此 merge 请求包含必须解决的 merge 冲突。您可以在命令行上手动尝试” 消息似乎不正确,我通过使用“git br
git 有没有办法在不 merge 文件的情况下 merge 两个分支?换句话说就是绘制 merge 箭头。 假设我有分支 A 和 B。我需要将分支 B merge 到 A,但不需要 B 中的所有更改
我想使用提供 git 集成的流行的开源问题跟踪器 (Redmine)。不幸的是,跟踪器中的每个项目只能与一个 git repo 相关联。在跟踪器中创建多个项目不是我理想的设置。 考虑到这一点,我尝试使
在我们的存储库中,我们遵循基于 git-flow 的工作流程。我们有一个已完成的发布(安装在生产环境中),因此发布分支已 merge 到主分支中。 B---C---D---E [release
git merge 命令有一个执行快进 merge 的选项,但这不是我想要的,因为如果它不能执行快进 merge ,它会使用普通 merge . 是否有一个 git 命令仅执行快进 merge (从跟
尝试合并 TFS2008 时出现此错误。源分支或目标分支上都没有挂起的更改。 TF14083: The item {0} has a pending merge from the current me
为了更好地理解这些操作,我想知道 github 或 gitlab 到底是如何 merge 这些请求的。当压缩、 rebase 、 merge ......时详细执行哪些 git 命令? 最佳答案 PR
为了更好地理解这些操作,我想知道 github 或 gitlab 到底是如何 merge 这些请求的。当压缩、 rebase 、 merge ......时详细执行哪些 git 命令? 最佳答案 PR
我试图将提交的一部分从默认分支(不是所有文件和其他文件的部分) merge 到一个命名分支。我试过 graft ,但它只需要整个提交,而没有给我选择的机会。这将如何完成? 例子: A---B---C-
我正在进行 merge ,此时我已准备好提交,但我在 TortoiseHg 中的提交对话框显示许多文件已修改,但是当我与 parent 进行比较时,它说所有文件都是二进制相等的。 我没有也从未有过 e
我已经尝试了以下几种变体,但我仍然遇到错误。有什么办法可以解决这个问题。 DB2 10.1(DB2 for z/OS V10) 对于以下 MERGE INTO TRGT t USING SRC s O
我的数据库模型有用户和 MAC 地址。一个用户可以有多个MAC地址,但一个MAC只能属于一个用户。如果某个用户设置了他的 MAC,并且该 MAC 已经链接到另一个用户,则现有关系将被删除,并在新所有者
假设我有一个新功能,所以我创建了一个新分支。这个分支是一个会持续很长时间的副项目,所以我最终将 master merge 回它以使其保持最新状态。这已经发生了 50 次,因为我一直在更新它并消除该功能
过去几个小时我在 Mercurial 中进行了一次巨大的 merge 。 merge 131 个文件后,我的 merge 工具 meld 崩溃,显示 python 回溯。在尝试退出 meld 时,我无
我有一个关于 git merge 的问题。假设我的存储库中有两个分支(本地和远程):master 和 test。当我在测试分支上工作时,主分支被其他人更新了。在终端中,我写: git checkout
我是一名优秀的程序员,十分优秀!