及时回滚git主分支的明智方法&x2B;然后根据当前主目录合并分支中的一些文件?
(恐怕我的搜索功能不足,我没有找到这个特定场景的答案) 所以,我有一个git回购协议,看起来像这样:及时回滚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''
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
相同的提交
如果您有一些修改过的文件,请以某种方式存储更改:aithergit 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,但它们都是我的(台式机+笔记本电脑)。不过,如果存储库更公开,我也对该怎么做感兴趣(由多人处理等)。如果您的更改已发布,并在公共回购协议上共享,您最好保持当前主机的原样,并在其上添加提交。就像您发布一些勘误表页面以随打印的书籍一起发布一样。