合并到另一个git分支时,我可以从git分支中删除单个文件而不删除它们吗? 我处于一个有两个主要开发分支的项目中,因为该项目由一个库和一个库的实现组成,这两个库都是在不同的分支中并行开发的。

合并到另一个git分支时,我可以从git分支中删除单个文件而不删除它们吗? 我处于一个有两个主要开发分支的项目中,因为该项目由一个库和一个库的实现组成,这两个库都是在不同的分支中并行开发的。,git,merge,branch,Git,Merge,Branch,我的工作流程是,一旦向库中添加了足够的功能,我就将库分支与--no ff合并到实现(名为core)分支中,理想情况下,库分支永远不会看到实现中的任何文件,因为否则,两个分支将对相同的实现文件进行更改。不幸的是,情况并非如此,因为我是从一个现有的源文件夹启动项目的,该文件夹包含库中的一些文件和一个部分启动的实现,并且在最初从master中拆分两个工作分支时忘记删除实现文件 工作流程: $ git checkout library …做些改变 $ git commit -am "updated l

我的工作流程是,一旦向库中添加了足够的功能,我就将库分支与
--no ff
合并到实现(名为
core
)分支中,理想情况下,库分支永远不会看到实现中的任何文件,因为否则,两个分支将对相同的实现文件进行更改。不幸的是,情况并非如此,因为我是从一个现有的源文件夹启动项目的,该文件夹包含库中的一些文件和一个部分启动的实现,并且在最初从master中拆分两个工作分支时忘记删除实现文件

工作流程:

$ git checkout library
…做些改变

$ git commit -am "updated library"
$ git checkout core
$ git merge --no-ff library
在这一点上,我通常必须处理由于库更新而导致的冲突,更改
分支中的实现文件,同时合并对
核心
分支的更改,并更新相同的文件,即使
核心
分支已经对这些文件进行了自己的更新

当我将实现目录合并到实现分支中时,如何从
分支中删除它们而不删除它们

当我将它们合并到实现分支中时,如何从库分支中删除实现目录而不删除它们

您可以使用--no commit执行合并,恢复删除的文件并完成提交

请参见“”作为具体示例

git checkout dev1
git merge --no-commit dev2
git checkout dev1 implementationFile
git add implementationFile
git commit

看起来你在这方面做得有点错误,你不应该为了这个目的而使用分支;相反,您应该使用两个独立的存储库,一个是库存储库,另一个是实现/客户机存储库。然后,client one将库repo作为其子模块(尽管还有其他方法)

这样,这两个回购协议之间的文件不会有任何重叠,这是您想要的,由您的需求决定

为了转换当前以2个分支形式存在的内容,您可以使用
git filter branch
从分支A中筛选出属于分支B的文件,反之亦然,因此最终只有2个repo具有库或客户端的文件(实现)。这当然有修改历史记录的缺点,因此如果您想避免这种情况,只需使用普通的
git-rm
git-commit

来执行删除操作,避免通过
cherry pick
-ing对其进行删除: 是的,您可以很简单地做到这一点:您必须避免合并那些删除文件的提交。因此,当然,您不应该进行更改和删除文件的提交

例如:

使用包含两个文件的
主分支创建git回购:

~$ mkdir gittest
~$ cd gittest
~/gittest$ git init
Initialized empty Git repository in /home/kaz/gittest/.git/
~/gittest$ echo foo > foo
~/gittest$ echo bar > bar
~/gittest$ git add foo bar
~/gittest$ git commit -m "root commit"
[master (root-commit) 1c1860f] root commit
 2 files changed, 2 insertions(+)
 create mode 100644 bar
 create mode 100644 foo
从根提交中发出一个
topic
分支:

~/gittest$ git branch topic
在两个文件的
master
上创建第二个版本:

~/gittest$ echo foo >> foo
~/gittest$ echo bar >> bar
~/gittest$ git diff
diff --git a/bar b/bar
index 5716ca5..a486f1a 100644
--- a/bar
+++ b/bar
@@ -1 +1,2 @@
 bar
+bar
diff --git a/foo b/foo
index 257cc56..0d55bed 100644
--- a/foo
+++ b/foo
@@ -1 +1,2 @@
 foo
+foo
~/gittest$ git commit -a -m "hack 1"
[master ded65d8] hack 1
 2 files changed, 2 insertions(+)
切换到
主题
。删除
并提交。以与
master
冲突的方式修改
foo
,并提交:

~/gittest$ git checkout topic
Switched to branch 'topic'
~/gittest$ git rm bar
rm 'bar'
~/gittest$ git commit -m "delete bar"
[topic 8a4009d] delete bar
 1 file changed, 1 deletion(-)
 delete mode 100644 bar
~/gittest$ echo "foo2" > foo
~/gittest$ git commit -a -m "replace foo"
[topic abfa329] replace foo
 1 file changed, 1 insertion(+), 1 deletion(-)
~/gittest$ cat foo
<<<<<<< HEAD
foo
foo
=======
foo2
>>>>>>> abfa329... replace foo
~/gittest$ cat > foo
foo
foo2
~/gittest$ git add foo
~/gittest$ git commit -m "merged topic, avoiding deletion"
[master 320818f] merged topic, avoiding deletion
 1 file changed, 1 insertion(+), 1 deletion(-)
回顾
主题的历史记录

~/gittest$ git log --oneline
abfa329 replace foo
8a4009d delete bar
1c1860f root commit
返回到
主控

~/gittest$ git checkout master
Switched to branch 'master'
~/gittest$ git log --oneline
ded65d8 hack 1
1c1860f root commit
现在,从主题中选择
abfa329替换foo
,避免
8a4009d删除条

$ git cherry-pick abfa329
error: could not apply abfa329... replace foo
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
请注意,
bar
仍然存在:

~/gittest$ ls bar
bar
~/gittest$ cat bar
bar
bar

在合并期间或合并之后,使用
git reset
撤消不需要的删除: 如果你发现了一个不需要的删除,你可以很容易地撤销它

让我们将示例
master
分支回滚到
hack 1
提交并重写,以便
bar
不会在
master
上修改,只修改
foo

~/gittest$ git reset --hard ded65d8
HEAD is now at ded65d8 hack 1
~/gittest$ git reset HEAD^ -- bar
Unstaged changes after reset:
M   bar
~/gittest$ git commit --amend -m "hack1: bar only"
[master 623908a] hack1: bar only
 1 file changed, 1 insertion(+)
~/gittest$ git log --oneline
623908a hack1: bar only
1c1860f root commit
~/gittest$ git show -p
commit 623908a3bf6b2fb81b0bf8309fa2e83cd602986a
Author: Kaz <kaz@stackexchange.example.com>
Date:   Sat Dec 20 08:03:27 2014 -0800

    hack1: bar only

diff --git a/foo b/foo
index 257cc56..0d55bed 100644
--- a/foo
+++ b/foo
@@ -1 +1,2 @@
 foo
+foo
哎呀!在撤消
更改后,我忘记了
git重置--hard
。拿两个:

~/gittest$ git reset --hard
HEAD is now at 623908a hack1: bar only
~/gittest$ git merge topic
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Removing bar
Automatic merge failed; fix conflicts and then commit the result.
好的,因此合并会自动删除
(没有冲突,因为
未在
上修改)。
foo
上存在冲突,与
cherry pick
案例中的冲突完全相同,因此让我们先处理一下:

~/gittest$ cat > foo
foo
foo2
~/gittest$ git add foo
现在,回滚对
条的删除操作。请注意,
bar
不在工作树中,目前仍保持这种状态:

~/gittest$ git reset HEAD^ -- bar
Unstaged changes after reset:
D   bar
我们承诺:

~/gittest$ git commit -m "merged topic, except deletion of bar"
[master 57b7fca] merged topic, except deletion of bar
现在我们带回
bar

~/gittest$ git reset
Unstaged changes after reset:
D   bar
哎呀,我的意思是硬的

~/gittest$ git reset --hard
HEAD is now at 57b7fca merged topic, except deletion of bar
使用
--graph
查看日志:

~/gittest$ git log --graph --oneline
*   57b7fca merged topic, except deletion of bar
|\  
| * abfa329 replace foo
| * 8a4009d delete bar
* | 623908a hack1: bar only
|/  
* 1c1860f root commit
验证文件内容
foo
被合并,
bar
是否存在:

~/gittest$ cat foo
foo
foo2
~/gittest$ cat bar
bar

“实现库”是指“库的客户端”或“使用库的代码”,对吗?@ErikAllik抱歉,是的。实现分支包含使用库中编写的接口和类的代码。我合并,以便可以从库包中导入它们,以及任何API更改。实现应该包含一个子目录和库文件吗?并不是我不希望重叠,而是实现分支应该拥有所有文件,而库分支应该只包含库files@adnan_252:没错-该库应为实施回购的子文件夹;看到了吗,或者,或者更好。否则,我看不到一种长期可持续/自动化的方式来实现你想要的,而通过单独的回购协议和使用子树/子模块,它将毫不费力地实现。
~/gittest$ cat foo
foo
foo2
~/gittest$ cat bar
bar