(我担心我的搜索缺乏,我没有找到这个特定情况的答案)
所以,我有一个看起来像这样的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'的做事方式。)
我也有一个远程回购。我可以rebase
和push --force
,但我不愿意;虽然不是批评,但我希望历史看起来“好看”和“可拉”。
答案 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'
更改主人的历史记录
出于某种原因,您可能希望“删除”o
和master
之间的错误历史记录。
首先:保持安全并保留对当前主人的引用:
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''
的内容复制到“干净”的主文件中。