合并到另一个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