Sane方式及时滚动git master分支+然后根据当前主服务器合并一些分支中的文件?

时间:2015-06-18 07:34:59

标签: git version-control git-merge

(我担心我的搜索缺乏,我没有找到这个特定情况的答案)

所以,我有一个看起来像这样的git repo:

   A a'', b''
   |
  /
 M a',b'
 |
 |
 |
 o a, b
 |

M是当前master,A是主题分支。 o是旧提交,a,b, etc指的是回购中两个特定文件集的状态。

我已经意识到我希望将master及时移回提交o(文件a),之外的某些特定文件( b'')在主题分支A中创建/修改。换句话说,我希望新主人看起来像这样:

M' a, b''
|

最好的方法是什么?

(我可以做的一个选项是将文件b复制到repo之外的某个地方,及时回滚主服务器,然后重新添加这些文件,就像它们是完全新的提交一样。 ,这听起来不像是一种非常'git'的做事方式。)

我也有一个远程回购。我可以rebasepush --force,但我不愿意;虽然不是批评,但我希望历史看起来“好看”和“可拉”。

3 个答案:

答案 0 :(得分:1)

检查您想要基于的提交:

git checkout desired-master

创建一个新分支:

git checkout -b files-to-save

从不受欢迎的主文件中提取这些文件的状态:

git checkout master path/to/file/a
git checkout master path/to/file/b

提交这些更改,然后将它们重新绑定到所需的主数据上。

git rebase desired-master files-to-save

您必须强制推送以获得主分支所需的“干净”历史记录。这通常不可取,但可能 - 您需要在对团队中的其他人进行此操作之前进行沟通,如果您使用CI工具,则可能需要对其进行更改。

答案 1 :(得分:1)

不改变主人的历史

从您当前的母版,获取您希望的文件版本a

git checkout o -- a # 'o' is the commit reference, 'a' is the filename

承诺:

git add a
git commit -m 'reverting file a to a previous correct version'

从分支b获取文件A所需的版本:

git checkout A -- b
git add b
git commit -m 'integrating changes from branch A on file b'

更改主人的历史记录

出于某种原因,您可能希望“删除”omaster之间的错误历史记录。

首先:保持安全并保留对当前主人的引用:

git branch backup/master master

这会创建一个新分支backup/master,它指向与当前master相同的提交。

如果您有一些修改过的文件,请以某种方式存储更改:git stash(快速运行,但容易忘记)或添加更改并将其提交到backup/master(在历史记录中更明显) )。

master分支,回滚到提交o

git checkout master # just to be sure you are acting on master
git reset --hard o # warning : if you have modified files, this is one of
                   # the few git commands which will throw away the
                   # changes with no way to get them back

A获取您想要的修改:

git checkout A -- b
git add b
git commit -m 'integrating changes from branch A on file b'

保持历史记录

可以使用git checkout A -- b来跟踪历史记录git rebase,而不是仅仅运行master--A(获取文件的确切内容,但不保留历史记录):

git checkout A
git branch backup/A # keep an easy way to undo your changes !
git rebase master

答案 2 :(得分:0)

首先,在诸如master之类的“已发布”分支上更改历史通常是不好的。其次,您不使用文件集,而是更改集。您可以恢复“o”和“M”之间的所有提交,而不是更改历史记录,然后将b''的内容复制到“干净”的主文件中。