及时回滚git主分支的明智方法&x2B;然后根据当前主目录合并分支中的一些文件?

及时回滚git主分支的明智方法&x2B;然后根据当前主目录合并分支中的一些文件?,git,version-control,git-merge,Git,Version Control,Git Merge,(恐怕我的搜索功能不足,我没有找到这个特定场景的答案) 所以,我有一个git回购协议,看起来像这样: A a'', b'' | / M a',b' | | | o a, b | M' a, b'' | M是当前的主机,a是主题分支o是一个旧提交,a、b等指的是repo中两个特定文件集的状态 我意识到我想将master移回提交o(文件a),但在主题分支a中创建/修改的某些特定文件(b'')除外。换句话说,我想让新主人看起来像这样: A a'', b''

(恐怕我的搜索功能不足,我没有找到这个特定场景的答案)

所以,我有一个git回购协议,看起来像这样:

   A a'', b''
   |
  /
 M a',b'
 |
 |
 |
 o a, b
 |
M' a, b''
|
M是当前的
主机
,a是主题分支
o
是一个旧提交,
a、b等
指的是repo中两个特定文件集的状态

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

   A a'', b''
   |
  /
 M a',b'
 |
 |
 |
 o a, b
 |
M' a, b''
|
最好的方法是什么

(我可以做的一个选择是将文件
b
复制到回购协议之外的某个地方,及时回滚主文件,然后重新添加这些文件,就像它们是全新的提交一样。不过,这听起来不像是一种非常“git”的方式。)


我也有一个远程回购。我可以
rebase
push--force
东西,但我不愿意;虽然不是很关键,但我希望历史记录看起来“漂亮”且可拖动。

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

签出要基于的提交:

git签出所需主机

创建新分支:

git签出-b要保存的文件

将这些文件的状态从不需要的主文件中带出:

git checkout master path/to/file/a
git checkout master path/to/file/b
提交这些更改,然后将它们重新定基到所需的主服务器上

git重新设置要保存的所需主文件的基础


您必须强制推进,以实现主分支想要的“干净”历史。这通常是不可取的,但也是可能的-您需要在与团队中的其他人沟通之前进行沟通,如果您正在使用CI工具,则可能需要对其进行更改。

而不更改master的历史记录。

从当前主控文件中,获取文件
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'
从分支机构
A
获取文件
b
的所需版本:

git checkout A -- b
git add b
git commit -m 'integrating changes from branch A on file b'
git checkout A -- b
git add b
git commit -m 'integrating changes from branch A on file b'
git checkout A
git branch backup/A # keep an easy way to undo your changes !
git rebase master
更改master的历史记录

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

第一:注意安全,并保留对您当前主人的引用:

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

如果您有一些修改过的文件,请以某种方式存储更改:aither
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 add b
git commit -m 'integrating changes from branch A on file b'
git checkout A
git branch backup/A # keep an easy way to undo your changes !
git rebase master
保存历史记录,防止

与只运行
git checkout A--b
(获取文件的确切内容,但不保留历史记录)不同,to可以使用
git rebase
跟踪历史记录
master--A

git checkout A -- b
git add b
git commit -m 'integrating changes from branch A on file b'
git checkout A -- b
git add b
git commit -m 'integrating changes from branch A on file b'
git checkout A
git branch backup/A # keep an easy way to undo your changes !
git rebase master

这个存储库是与其他几个克隆(同事、公共开源项目…)共享的存储库,还是只有一个或两个克隆的repo?它是一个有两个克隆的私有repo,但它们都是我的(台式机+笔记本电脑)。不过,如果存储库更公开,我也对该怎么做感兴趣(由多人处理等)。如果您的更改已发布,并在公共回购协议上共享,您最好保持当前主机的原样,并在其上添加提交。就像您发布一些勘误表页面以随打印的书籍一起发布一样。