与git合并时是否有一种不合并文件移动和删除的方法?
我们已经创建了一个分支,然后通过删除或移动大量文件来减少分支。在该分支中也对重新组织的文件进行了一些修改。现在我想要做的是将对已修剪的目录所做的更改合并回完整的分支,但仍然保留所有已删除的文件,并将所有文件保存在原来的位置。
是否有一种简单的方法可以让git在不做任何文件删除或移动的情况下,将修改从修剪后的分支合并回来?最好是能够轻松处理修改文件已被移动的事实。
请注意,我主要关注的是更改的内容,而不是分支历史,所以使用摘樱桃或重基的方法是可以的。(只要我不需要手动拖网查看提交历史记录,就可以通过修改更改来隔离这些提交。)
我找到了https://stackoverflow.com/questions/19166368/how-do-i-ignore-file-deletions-in-a-git-branch-for-merging-purposes,但问题是有前途的,答案是“不要那样做”。在我的情况下,已经发生了分支和删除。
发布于 2016-07-21 14:49:52
这不是我在吉特做的事。也许有一种方法可以做到这一点,但是我会用一些shell脚本来代替。您没有指定您的环境,但我的解决方案将是UNIX环境。不管如何,都应该有运行bash脚本的工具。
首先,如果您的分支发生了分叉,以便对您想要“合并”的两个分支进行更改,那么您可能希望进行一个重基。让我们将您的分支称为master
和deletions
。如果您推动了deletions
,以便其他人正在处理该分支,那么我可能会创建一个新的相同的分支deletions2
,它将基于master
来避免重写历史记录。无论如何,您可能都不想继续在deletions
上工作,因为您将不得不全部重做,但是这样做不会破坏任何东西。
然后,通过复制回购文件,手动将所有文件从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
发布于 2016-07-22 09:13:40
我就是这样处理的。
与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-filter只提取刚刚在删除分支上发生的重命名(移动)。-M25%意味着进行更广泛的重命名检测,查找除了移动之外还有75%修改的文件。-raw将输出格式更改为更便于后处理的输出格式.
awk命令只是逆转移动的一种方法。(请注意,如果文件名中有空格或时髦字符,这并不一定是健壮的。)这里唯一的复杂之处在于,git mv
不会创建一个不存在的目录,因此产生了mkdir -p basename
位。
撤消这些移动后,我们可以获得修改和添加(但不是删除)的修补程序:
git diff --patch --diff-filter=AM -M25 SHA1 > modifications.patch
然后,我们可以在合并点创建另一个牺牲分支,以允许我们应用这些更改。
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
现在,我们只需将临时分支合并回master。
git checkout master
git merge temp
它将合并修改,但不合并提交历史记录。如果还希望将提交历史合并到:
git merge -s ours deletions2
其中,-s ours
告诉git合并以合并提交历史,但保持当前文件的状态。
最后注意:如果不使用git diff
和git apply
来制作补丁,而是使用git format-diff
和git am
__,可能会更好。但是,我无法使它与--diff-filter选项很好地工作。适当的补丁是制作的,但它们不适用于干净。更熟悉这两种情况的人可能会获得更好的成功。
https://stackoverflow.com/questions/38509584
复制