重新设置分支基础而无需签出

Man*_*rth 10 git rebase

因此,我正在一个有时构建时间较长的项目中进行构建,并且该构建经常被破坏。如果我有一个较旧的分支并正在进行一些工作(已提交,但基于一个较老的父级),则运行会git checkout oldbranch更改工作目录以表示所有旧代码,这使我需要再次运行完整版本。

但是,通常我只修改了一个或两个文件,其余的不需要重置。我想做的是将该分支重新设置为当前的主头,并保留对文件的那些更改。

基本上,如果a.rsb.rs已被修改,那么我需要一种使这些更改基于当前文件头的方法,而不涉及除这两个文件以外的任何文件。

有这样做的git-ish方式吗?目前,我正在使用补丁文件来执行此操作。

Tom*_*z W 9

我了解到git rebase,现在通过同样的方法,您可以一次指定两个分支git rebase <remote> <local>,例如,基本上可以做到。

git rebase origin/master dev
Run Code Online (Sandbox Code Playgroud)

这样可以执行更有效的重新设置,在此情况下,文件不会被全部重写(如果您先签出分支,便会出现这种情况)。您仍然仍然需要先解决合并冲突,最后得到一个dev检出本地分支的存储库。

  • 不确定这是否真的有所作为。文档说_“如果指定了 &lt;branch&gt;,git rebase 将在执行其他操作之前执行自动 git checkout &lt;branch&gt;。”_ (9认同)
  • 请注意,这可以与“--onto”标志结合使用。假设您不小心在“master”工作树中的“master”分支上创建了一个功能分支,而不是在“release”工作树中的“release”分支上创建了一个功能分支。`cd ../release-branch-worktree; git rebase --onto origin/release origin/master your_feature_branch`瞧。该工作仅经过最低限度的必要重新编译就被转移。 (2认同)
  • 它有帮助,因为否则你必须“git checkout dev”,然后“git rebase”(这将进行另一次签出,这次是上游)。“checkout dev”仅用于告诉 git 哪个分支要变基,如果它在历史上很早,它就可以无缘无故地触及各种文件。 (2认同)
  • 如果您删除了 rebase 目标和分支之间的某个 git 子模块,则签出将(可能)彻底失败。这个答案中的方法可以将历史分支重新设置为当前主分支,而无需修复由于子模块删除而导致的签出问题。 (2认同)

Nic*_*k F 5

这听起来像是git cherry-pick. 您可以留在当前分支上并从旧分支中挑选提交,而不是检出分支并将其重新绑定到当前分支上。

如果您从中挑选的分支仅包含一个提交,您甚至可以通过其分支名称来引用它,例如:

git cherry-pick old-branch
Run Code Online (Sandbox Code Playgroud)

IE。从旧分支获取最近的提交并应用更改以在当前分支上创建新提交(保留提交消息、作者等)。


Fra*_*rax 1

注意: 对于问题中确切问题的直接解决方案,请查找下面的答案,它们更简单。

对于“我想在不弄乱我的工作目录的情况下进行一些更改”这一更普遍的问题,请继续阅读。

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)

  • 除了克隆之外,您还可以使用“git worktree add ../newFolderNamebranchToCheckout”。 (3认同)