0

我正在努力让它工作,很可能是因为缺乏对每个命令实际负责的理解。

我有:

  • “A”,一个裸仓库
  • 从“A”克隆的“B”(它可能应该是“A”中的一个分支,但让我们从这个用例开始。)最初,它被克隆为裸机,但在合并时,我需要一个工作副本.
  • “B”从不推向“A”

设想:

  1. “A”更新了整个 9 码,包括目录“Z”
  2. “B”只改变了一个目录“Z”

我想要:

  1. 从远程“A”中提取所有更改,“Z”除外
  2. 在任何修订中,保留对“Z”中“B”所做的更改而不是“A”中所做的更改。

我已经尝试通过执行以下操作来完成此操作。

在“B”中:

  1. git fetch -a -t origin
  2. git merge --no-commit --no-ff TAG
  3. git reset Z
  4. git commit

它不起作用。

  1. git pull --rebase origin master

仍然更新'Z',所以我不知道在哪里重置'Z'。

4

2 回答 2

2

而不是git reset,您将要git checkout在步骤 3 中使用:

  1. git fetch -a -t origin
  2. git merge --no-commit --no-ff TAG
  3. git checkout HEAD -- Z/
  4. git commit

一般来说,git checkout是说“让我的工作副本中的某些内容看起来像我描述的参考”,无论它是您的整个工作副本、文件还是子目录。这正是您想要的:在合并期间,您想说“废弃合并的任何更改,而是使目录 Z 看起来与 HEAD 中的完全一样”。(请记住 HEAD 尚未移动,因为尚未提交合并!)

git reset通常用于将 HEAD 的某个子集、索引(您为提交暂存的更改)和工作副本一起操作到某个状态。重置可能会让人感到困惑,但如果您想了解更多信息,可以在git-scm.com上找到一篇很好的、深入的文章。

于 2013-10-30T19:26:18.930 回答
0

因此,如果我的问题正确,您应该git checkout -b newbranch在 B 上将所有更改都放在新分支和git commit它们中。

提交更改后,您现在可以切换回 master 并执行git fetch -a origin && git merge origin/master. 上面的命令将合并从 A 到 B 的所有更改。

合并之后,您可以使用git rebase master newbranch从之前获取 B 上的所有更改并将它们重新定位到 A 中的更改。

于 2013-10-30T19:28:55.883 回答