使用git合并分支(文件移动和删除除外)
在与git合并时,有没有办法不合并文件移动和删除 我们创建了一个分支,然后通过删除或移动大量文件来修剪分支。在该分支中还对重新组织的文件进行了一些修改。我现在要做的是将对精简目录所做的更改合并回完整分支,但仍然保留在精简分支中删除的所有文件,并将所有文件保留在其原始位置 git有没有一种简单的方法可以合并来自修剪分支的更改,而不进行任何文件删除或移动?最好是能够轻松处理修改后的文件已被移动这一事实的文件 请注意,我主要关心的是更改的内容,而不是分支历史,因此使用樱桃采摘或重定基址的方法是可以的。(只要我不必手动浏览提交历史记录来隔离那些带有修改更改的提交。)使用git合并分支(文件移动和删除除外),git,git-merge,Git,Git Merge,在与git合并时,有没有办法不合并文件移动和删除 我们创建了一个分支,然后通过删除或移动大量文件来修剪分支。在该分支中还对重新组织的文件进行了一些修改。我现在要做的是将对精简目录所做的更改合并回完整分支,但仍然保留在精简分支中删除的所有文件,并将所有文件保留在其原始位置 git有没有一种简单的方法可以合并来自修剪分支的更改,而不进行任何文件删除或移动?最好是能够轻松处理修改后的文件已被移动这一事实的文件 请注意,我主要关心的是更改的内容,而不是分支历史,因此使用樱桃采摘或重定基址的方法是可以的。
我发现了,但问题是有前瞻性的,答案是“不要那样做”。在我的情况下,分支和删除已经发生。这不是我在Git中会做的事情。也许有一种方法可以做到这一点,但我会用一些shell脚本来代替。您没有指定您的环境,但我的解决方案将针对UNIX环境。无论如何,应该有运行bash脚本的工具 首先,如果您的分支发生了分歧,因此您要“合并”的两个分支都发生了更改,那么您可能需要重新设置基础。让我们调用您的分支
master
和deletions
。如果您推动了删除
,以便其他人正在处理该分支,我可能会创建一个新的相同分支删除2
,我将在master
上重新设置基础,以避免重写历史记录。您可能不想继续进行删除
,因为您必须全部重做,但这样您就不会破坏任何东西
然后,我将通过克隆回购协议手动将所有文件从deletions2
复制到master
,并在回购协议的一个副本中签出一个分支,在另一个副本中签出另一个分支。然后我会列出所有跟踪的文件,并使用简单的循环复制它们:
deletions2/ $ \
git ls-tree HEAD -r | while read f; do \
# use -n to keep master versions, -f to keep deletions versions, \
# or -i to choose manually for each file \
cp -f "$f" ../master/ \
done
我是这样处理的 与user2882096的回答一样,我将使用完整的、删除前的分支是
master
,修剪后的分支是deletions
。我还假设您在存储库的根目录下工作
首先,git很容易被移动的文件弄糊涂,所以首先要做的是在一个牺牲的分支中反向移动
git checkout -b deletions2 deletions
git merge-base deletions2 master # Note this SHA1 - substitute it in the following commands
git diff --diff-filter=R -M25% --raw SHA1 | awk '{system("mkdir -p `dirname " $(NF-1)"`; git mv " $NF " " $(NF-1) )}'
git commit
git-diff命令使用diff-filter只提取删除分支上发生的重命名(移动)。-M25%意味着要进行更广泛的重命名检测,查找除移动外修改率高达75%的文件。--raw将输出格式更改为更便于后期处理的格式
awk命令只是一种反向移动的方法。(请注意,如果文件名中有空格或时髦的字符,则不一定可靠。)这里唯一的复杂性是git mv
不会创建不存在的目录,因此mkdir-p basename
位
取消移动后,我们可以获得修改和添加(但不是删除)的补丁:
然后,我们可以在合并点进行另一个牺牲分支,以允许我们应用更改
git checkout -b temp SHA1
git apply modifications.patch # and resolve any issues
git merge master # To resolve conflicts with the current state of master
现在我们只需将临时分支合并回主分支
git checkout master
git merge temp
这将合并修改,但不会合并提交历史记录。如果还希望合并提交历史记录,请执行以下操作:
git merge -s ours deletions2
其中,-s
告诉git merge合并提交历史记录,但保持文件的当前状态
最后一点注意:如果使用
git-format-diff
和git-apply
来制作补丁,而不是使用git-format-diff
和git-am
,可能会更好。但是,我无法使用--diff过滤器选项使其正常工作。已制作了适当的修补程序,但它们不会干净地应用。熟悉这两种方法的人可能会取得更好的成功。一个问题是对已移动的文件进行了修改。因此,文件在删除
分支和主
分支中不在同一位置。好的,那么我不知道怎么做。我想现在是我学习修补和类似功能的时候了。:)
git merge -s ours deletions2