所以我正在开发一个有时候构建时间很长的项目,并且构建经常被破坏。如果我有一个旧的分支正在进行一些工作(已经提交,但是基于较大的父级),运行git checkout oldbranch
会更改工作目录以表示所有旧代码,这使我需要运行一个完全重建。
但是,通常我只修改了一个或两个文件,其余文件不需要重置。我想做的是将此分支重新绑定到当前主头,并将这些更改保留到文件中。
基本上,如果修改了a.rs
和b.rs
,那么我需要一种方法让这些更改基于当前头部,而不会触及除这两个以外的任何文件。
这样做有什么好办法吗?目前我正在处理补丁文件来执行此操作。
答案 0 :(得分:2)
这听起来像是git cherry-pick
的一个很好的用例。您可以保留当前分支并从旧分支中选择提交,而不是检查分支并将其重新定位到当前分支。
如果你挑选的分支只包含一个提交,你甚至可以用它的分支名称来引用它,例如:
git cherry-pick old-branch
即。从 old-branch 获取最新的提交并应用更改以在当前分支上创建新提交(保留提交消息,作者等)。
答案 1 :(得分:2)
现在我经历了一次相同的学习,git rebase
允许您一次指定两个分支,实际上使之成为git rebase <remote> <local>
,例如。
git rebase origin/master dev
这将执行更有效的重新设置,在此情况下,文件不会全部被重写(如果您先签出分支,便会出现这种情况)。您仍然仍然需要先解决合并冲突,最后得到一个存储库,在该存储库中检出了本地dev
分支。
答案 2 :(得分:0)
克隆回购,在克隆副本中制作rebase,并将其推回。
如果你在你的回购中,它应该是:
cd ..
git clone <name_of_your_repo_directory> tmp_repo
cd tmp_repo
git checkout origin/oldBranch
git rebase origin/master
git push -f origin HEAD:oldBranch
在tmp_repo origin
中是您本地仓库的名称,当然(您克隆的那个)。
注意:效果将是如
git checkout oldBranch
git rebase master
在原始仓库中,不为
git checkout oldBranch
git rebase origin/master
答案 3 :(得分:0)
我检查了源代码,不幸的是它看起来像 it always checks out the base commit 所以不幸的是,我认为你能做到这一点的唯一方法是将 repo 克隆到另一个目录,在那里重新设置它,然后将更改推回原repo,最后删除。
请注意,将本地存储库克隆到同一文件系统上的其他位置会使用 .git
下文件的硬链接,因此实际上并没有您想象的那么慢。