使用git合并分支(文件移动和删除除外)

使用git合并分支(文件移动和删除除外),git,git-merge,Git,Git Merge,在与git合并时,有没有办法不合并文件移动和删除 我们创建了一个分支,然后通过删除或移动大量文件来修剪分支。在该分支中还对重新组织的文件进行了一些修改。我现在要做的是将对精简目录所做的更改合并回完整分支,但仍然保留在精简分支中删除的所有文件,并将所有文件保留在其原始位置 git有没有一种简单的方法可以合并来自修剪分支的更改,而不进行任何文件删除或移动?最好是能够轻松处理修改后的文件已被移动这一事实的文件 请注意,我主要关心的是更改的内容,而不是分支历史,因此使用樱桃采摘或重定基址的方法是可以的。

在与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