因此,我正在一个有时构建时间较长的项目中进行构建,并且该构建经常被破坏。如果我有一个较旧的分支并正在进行一些工作(已提交,但基于一个较老的父级),则运行会git checkout oldbranch更改工作目录以表示所有旧代码,这使我需要再次运行完整版本。
但是,通常我只修改了一个或两个文件,其余的不需要重置。我想做的是将该分支重新设置为当前的主头,并保留对文件的那些更改。
基本上,如果a.rs和b.rs已被修改,那么我需要一种使这些更改基于当前文件头的方法,而不涉及除这两个文件以外的任何文件。
有这样做的git-ish方式吗?目前,我正在使用补丁文件来执行此操作。
我了解到git rebase,现在通过同样的方法,您可以一次指定两个分支git rebase <remote> <local>,例如,基本上可以做到。
git rebase origin/master dev
Run Code Online (Sandbox Code Playgroud)
这样可以执行更有效的重新设置,在此情况下,文件不会被全部重写(如果您先签出分支,便会出现这种情况)。您仍然仍然需要先解决合并冲突,最后得到一个dev检出本地分支的存储库。
这听起来像是git cherry-pick. 您可以留在当前分支上并从旧分支中挑选提交,而不是检出分支并将其重新绑定到当前分支上。
如果您从中挑选的分支仅包含一个提交,您甚至可以通过其分支名称来引用它,例如:
git cherry-pick old-branch
Run Code Online (Sandbox Code Playgroud)
IE。从旧分支获取最近的提交并应用更改以在当前分支上创建新提交(保留提交消息、作者等)。
注意: 对于问题中确切问题的直接解决方案,请查找下面的答案,它们更简单。
对于“我想在不弄乱我的工作目录的情况下进行一些更改”这一更普遍的问题,请继续阅读。
git worktree add请参阅有关您的存储库是否很大的评论。
克隆存储库,在克隆副本中进行变基,然后将其推回。
如果你在你的仓库中,它应该是:
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
Run Code Online (Sandbox Code Playgroud)
当然,tmp_repoorigin是您本地存储库的名称(您克隆的存储库)。
注意:效果会是这样的
git checkout oldBranch
git rebase master
Run Code Online (Sandbox Code Playgroud)
在你原来的仓库中,而不是
git checkout oldBranch
git rebase origin/master
Run Code Online (Sandbox Code Playgroud)