Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图找到一个;“跺脚”;在GIT中合并_Git_Version Control_Git Branch_Branching And Merging - Fatal编程技术网

试图找到一个;“跺脚”;在GIT中合并

试图找到一个;“跺脚”;在GIT中合并,git,version-control,git-branch,branching-and-merging,Git,Version Control,Git Branch,Branching And Merging,抽象场景:有主节点和分支节点。树枝是主人的后代。与此处未显示的其他文件一样,这两个文件都包含一个名为subdir的子目录,其中包含一组json文件: branch: /subdir/1.json /subdir/2.json master: /subdir/2.json /subdir/3.json 我想做的是将subdir从master合并到branch,其中branch的subdir中的所有文件都将被删除并替换为master的内容,而不会丢失branch中提交的历史记录,也不会影响bra

抽象场景:有主节点和分支节点。树枝是主人的后代。与此处未显示的其他文件一样,这两个文件都包含一个名为subdir的子目录,其中包含一组json文件:

branch:
/subdir/1.json
/subdir/2.json

master:
/subdir/2.json
/subdir/3.json
我想做的是将subdir从master合并到branch,其中branch的subdir中的所有文件都将被删除并替换为master的内容,而不会丢失branch中提交的历史记录,也不会影响branch中的任何其他文件


因此,合并后,分支的subdir和主分支的subdir看起来完全相同。

没有合并参数使其这样做

有一种方法可以在一次合并中实现这一点,但这可能不是一个好主意。这种合并被称为邪恶合并,至少在某些人看来是这样(请参阅关于“邪恶合并”到底是什么的各种说法)。一种“不邪恶”的方法是进行合并,提交结果,然后进行后续提交,以纠正问题。另一种“不邪恶”的方法是,做出一个使合并正确的提交,然后进行合并。无论哪种方式,你都有两次犯罪,其中一次是非邪恶的日常合并

但如果你真的想把它作为一个单一的合并,至于它是否邪恶,这里是你如何做到的:

$ git checkout branch
$ git merge --no-commit -s ours master
... Git does the merge, but stops before committing ...

$ git rm -r -- subdir           # needed only if there are files to remove

$ git checkout master -- subdir
$ git status                    # use git status often!
... you'll see some status ...
$ git diff --cached HEAD        # optional: see what's changing vs tip of branch "branch"
... you'll see some status ...
$ git diff --cached --name-status HEAD  # optional: see what files differ
... you'll see some status ...
$ git status                    # it's never wrong to use git status too often
... you'll see some status ...
... ok, we're really ready ...
$ git commit
<and write a good merge message>
$git签出分支
$git merge--不提交-s我们的主
... Git进行合并,但在提交之前停止。。。
$git rm-r——只有在存在要删除的文件时才需要subdir
$git签出主机--子目录
$git status#经常使用git status!
... 你会看到一些状态。。。
$git diff--缓存头#可选:查看分支“branch”与分支尖端的变化
... 你会看到一些状态。。。
$git diff--cached--name status HEAD#可选:查看哪些文件不同
... 你会看到一些状态。。。
$git status#经常使用git status从来没有错
... 你会看到一些状态。。。
... 好的,我们真的准备好了。。。
$git提交
注意,在进行了这个合并之后,Git现在认为,合并您刚刚合并的两个提交的正确结果是您刚刚提交的内容。这会影响将来的合并操作


请注意
git rm-r
步骤(我一开始忘记了这一点):如果当前(tip of-
分支
)提交中存在不在
提示提交中的文件,则需要此步骤,这些文件应在合并中删除。如果没有这样的文件,
git rm-r
是无害的,但没有任何用处:我们只是将所有文件替换为后续的
git checkout master--subdir
步骤。

没有合并参数使它这样做

有一种方法可以在一次合并中实现这一点,但这可能不是一个好主意。这种合并被称为邪恶合并,至少在某些人看来是这样(请参阅关于“邪恶合并”到底是什么的各种说法)。一种“不邪恶”的方法是进行合并,提交结果,然后进行后续提交,以纠正问题。另一种“不邪恶”的方法是,做出一个使合并正确的提交,然后进行合并。无论哪种方式,你都有两次犯罪,其中一次是非邪恶的日常合并

但如果你真的想把它作为一个单一的合并,至于它是否邪恶,这里是你如何做到的:

$ git checkout branch
$ git merge --no-commit -s ours master
... Git does the merge, but stops before committing ...

$ git rm -r -- subdir           # needed only if there are files to remove

$ git checkout master -- subdir
$ git status                    # use git status often!
... you'll see some status ...
$ git diff --cached HEAD        # optional: see what's changing vs tip of branch "branch"
... you'll see some status ...
$ git diff --cached --name-status HEAD  # optional: see what files differ
... you'll see some status ...
$ git status                    # it's never wrong to use git status too often
... you'll see some status ...
... ok, we're really ready ...
$ git commit
<and write a good merge message>
$git签出分支
$git merge--不提交-s我们的主
... Git进行合并,但在提交之前停止。。。
$git rm-r——只有在存在要删除的文件时才需要subdir
$git签出主机--子目录
$git status#经常使用git status!
... 你会看到一些状态。。。
$git diff--缓存头#可选:查看分支“branch”与分支尖端的变化
... 你会看到一些状态。。。
$git diff--cached--name status HEAD#可选:查看哪些文件不同
... 你会看到一些状态。。。
$git status#经常使用git status从来没有错
... 你会看到一些状态。。。
... 好的,我们真的准备好了。。。
$git提交
注意,在进行了这个合并之后,Git现在认为,合并您刚刚合并的两个提交的正确结果是您刚刚提交的内容。这会影响将来的合并操作


请注意
git rm-r
步骤(我一开始忘记了这一点):如果当前(tip of-
分支
)提交中存在不在
提示提交中的文件,则需要此步骤,这些文件应在合并中删除。如果没有这样的文件,
git rm-r
是无害的,但没有任何用处:我们只是将所有文件替换为后续的
git checkout master--subdir
步骤。

谢谢,我已经尝试了单次合并,到目前为止它还在工作。有一件事我不完全理解,那就是调用“git合并--不提交-我们的主“。这会将主机合并到分支,但我担心它可能会将不需要的文件从主机写入分支。如果它实际上没有做到这一点,那么它实际上在做什么,也就是说,为什么需要它呢?
git merge--no commit-s我们的master
的要点是设置一些东西,以便下一次提交将是合并提交。
-s-ours
使Git不采取实际的合并操作。我们将通过
git checkout master--subdir
步骤完全替换索引树和工作树的某些部分,因此,如果git只将下一次提交标记为“将是一次合并”,那么就可以了。理解所有这些的真正关键是Git根据索引中的内容进行新的提交。您的工作树的存在只是为了让您可以进行工作。Git关心的是索引。谢谢,我已经尝试了单次合并,到目前为止,它还在工作。有一件事我不完全理解,那就是调用“Git merge--no commit-s ours master”。这将合并主机到分支,但我担心它可能会将不需要的文件从主机写入分支。如果它