- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于处理merge
重命名还有其他答案,但是我的情况非常复杂,以至于我认为这值得一个单独的问题。
我们有一个git项目,最初由20多个存储库组成。我们使用包装器脚本来处理许多标准git操作。因为我们现在要迁移到GitHub,所以我们不能以这种方式处理项目。
因此,我们基本上使用saintgimp上描述的方法将所有存储库移动到单个存储库中。当然,这意味着所有文件现在都已重命名,但是SHA在历史上是相同的。
好的,所以现在我想将分支source
合并到分支target
中,请注意,我确保在最后一次转换之前两者已同步。我的第一次尝试使用git merge <source>
导致了成千上万的冲突,关于在一侧或另一侧更改/删除文件的投诉等。
然后我在Advanced Merging page上找到了一个宝石:
如果您想做这样的事情,但连Git都没有,请尝试
从另一侧合并更改,这是更严厉的
选项,这是“我们的”合并策略。这不同于
“我们的”递归合并选项。
啊,听起来像我需要的。好的,我执行了以下操作:
$ git merge -s ours SHA
SHA
是统一的最后一次提交。换句话说,我希望所有历史记录(包括
SHA
在内)都已被合并为
target
。我希望这将是一次合并,并将解决所有将来的合并。
source
的第一个新提交时,效果是正确的,但是我继续收到以下警告:
[user@host src] git merge --no-commit next_unmerged_commit
Auto-merging /path/to/file/changed/foo.c
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your merge.renamelimit variable to at least 5384 and retry the command.
Automatic merge went well; stopped before committing as requested
renamelimit
设置为10000,则执行下一个合并(称为
B
)时不会发出警告,但是会降低性能。再一次,一次性费用是可以接受的,如果我的后续合并再次恢复正常,我将支付该费用。
C
的下一个合并
renamelimit
再次发出警告。
target
分支与
source
保持同步,以便它在统一之前不再试图恢复历史?由于性能下降,我希望能够在不增加
renamelimit
的情况下进行合并。
最佳答案
这确实不是一个很好的答案,因为它更多地与您使用的脚本有关,或者也许我应该说,您未使用的脚本,如your comment说您使用的是基于the script to which you linked的脚本,但我图11显示了我在下面的一些原始存储库的假设脚本转换中得到的缠结图。请注意,此特定脚本使所有转换都具有一个合并基本提交,实质上是commit B
,而commit B
本身为空。
您的问题是:
现在,我想将分支source
合并到分支target
中,请注意,我确保在最后一次转换之前两者已同步。
正如您将在下面看到的那样,所有新分支都以它们来自的项目命名—没有明确的方法将source
和target
映射到例如P或Q上。但是,如果要运行:
git checkout P/master
git merge Q/master
git merge
的合并基础将为empty-commit-
B
,并且合并将顺利进行:Git会分别查看我作为
D
和
H
绘制的提交,并跟踪它们祖先,找到提交
B
作为其合并基础,然后运行两个
git diff
:
git diff <hash-of-B> <hash-of-D> # what we did on P/master
git diff <hash-of-B> <hash-of-H> # what they did on H/master
git diff
的输出将表明每个文件都是从头开始创建的,并且它们的名称都不同:
P/master
中的所有内容都命名为
P/*
,而
H/master
中的所有内容都命名为
Q/*
。不会发生名称冲突,合并将自行完成。
git checkout P/master # just to be somewhere that's not master
git branch -d master # discard existing master branch name
git checkout --orphan master # arrange to create new master
git merge P/master Q/master R/master # make big octopus merge to marry all projects
B
,结果将是一次合并,使所有项目以其新的
project/*
名称进入。现在,原始存储库几乎都没有用,但是如果其中有新的提交,则可以从它们中获取信息,添加重命名提交,然后从重命名提交进行合并(如果导入脚本没有删除添加的内容,这样做会更容易遥控器)。
git read-tree
和
git commit-tree
来构建和创建章鱼末端合并。主键是在下图中的每个传入项目分支(
P/*
,
Q/*
等)的末尾添加重命名提交。
A--B <-- master
git remote add P <url>
和
git fetch P
(带有
--tags
!?)。我们在这里假设P具有master和dev。
A--B <-- master
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
refs/remotes/P/*
中具有相同的名称集。 (假设
git checkout -b P/master master
。影响:
A--B <-- master, P/master
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git reset --hard
:无效果。也许
git clean -d --force
:无效果。
git merge --allow-unrelated-histories --no-commit remotes/P/master"
(does merge, but does not commit yet) and then run
git commit -m ...`。
A--B <-- master
\
\-------C <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git mv all-but-P P/
git commit -m "[Project] Move ${sub_project} files into sub directory"
A--B <-- master
\
\-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git mv
指定了
-k
,因此,如果
git mv
操作之一将失败。但是,除了
.git
本身,位于顶层的所有文件
git mv
应该
P
,否则成功。
D
不存在。
dev
重复循环(请参阅步骤5)。运行
git checkout -b P/dev master
:
A--B <-- master, P/dev
\
\-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git reset
和
git clean
再次
git mv
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
\ Pd <-- origin/P/dev
\ \
\---E <-- P/dev
master
的子目录中,也没有
dev
。
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
\ Pd <-- origin/P/dev
\ \
\---E--F <-- P/dev
origin/P/*
名称,
P/*
分支:
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
--tags
,不是步骤5中指出的好计划
origin/Q/*
名称的不相交子图。为简单起见
origin/Q/master
存在:
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
Q1-Q2-...-Qm <-- origin/Q/master
git checkout -b Q/master master
:
A--B <-- master, Q/master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
Q1-Q2-...-Qm <-- origin/Q/master
git reset --hard
和
git clean
步骤。
--allow-unrelated-histories
使用时髦的两步合并
G
,如下所示:
---------------G <-- Q/master
/ |
A--B <-- master | (down to Qm)
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
/ (up to G)
/
Q1-Q2-...-Qm <-- origin/Q/master
---------------G--H <-- Q/master
/ |
A--B <-- master | (down to Qm)
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
/ (up to G)
/
Q1-Q2-...-Qm <-- origin/Q/master
Q
和
origin/Q/*
名称。 (无需绘制。)
master
,我们将得到如下图所示的纠结图:
--------------------I--J <-- R/master
/ | (down to Rm)
/
| ---------------G--H <-- Q/master
|/ |
A--B <-- master | (down to Qm)
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
/ (up to G)
/
Q1-Q2-...-Qm
/ (up to I)
/
R1-R2-...----Rm
关于git - 重命名所有文件后git merge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285121/
我从一个 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
我是一名优秀的程序员,十分优秀!