git - 我可以在不修改工作副本的情况下对 Git 分支进行 rebase 吗?

标签 git rebase

假设我检查了我的“master”分支。我已经对“master”进行了一些生产更改,现在我想将我的“实验”分支重新定位到最新的 master。但是,我想在不修改工作副本中的任何文件的情况下执行此操作。本质上,我希望所有的魔法都发生在 .git 目录中,而不触及工作副本。

如果不是因为“不要修改我的工作副本”的要求,这只是一个做的问题:

# current branch is master
git checkout experimental
git rebase master
git checkout master

我真正的问题是,这会修改我的工作副本中的时间戳,即使我最后检查的内容与我开始时完全相同。一旦我运行“git checkout experimental”,任何在实验分支中包含更改的文件都会将它们的 mtime 设置为当前时间——自上次我 rebase experimental 以来在 master 中更改的任何文件也会如此。因为时间已经改变,构建工具之类的东西得到了他们需要再次做的工作的想法,即使在我完成时,文件的内容实际上并没有改变。 (在我的例子中,如果项目文件的时间戳发生变化,Visual Studio 认为它需要花费大量时间来卸载和重新加载项目。)我想避免这种情况。

有没有一种方法可以一步完成上述所有操作,而无需修改工作副本中的任何内容 (假设在 rebase 期间没有冲突)?

(如果冲突,我的偏好是显示错误然后中止整个操作,而不修改任何时间戳。但这只是我的偏好,不是硬性要求——我不知道什么是可能的。)

当然我可以写一个脚本来捕获mtimes,运行git,然后重置mtimes;但是 Git 似乎已经有办法在不影响工作副本的情况下执行 rebase 之类的操作,因为 rebase 实际上是关于增量,而不是文件的实际内容。

最佳答案

git 2.5 ,更好的解决方案是使用第二个 worktree .

A git repository can support multiple working trees, allowing you to check out more than one branch at a time.

$ git worktree add ../second-copy experimental
$ cd ../second-copy/
$ git rebase master experimental

就是这样。之后,如果需要,您可以rm -rf second-copy,或者保留它以备将来使用。

$ git rebase master experimental

关于git - 我可以在不修改工作副本的情况下对 Git 分支进行 rebase 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913360/

相关文章:

git - git 存储库可以处理的提交数量是否有上限?

git - 通过 pull 请求解决 merge 冲突

像 Subversion 中的 Git 关键字替换?

git - 恢复分支看起来像主人?

git - Mercurial : How to do a rebase like git's rebase

git reword 没有再次解决 merge 冲突

git - 为什么 'Git rebase' 将提交压缩到之前的提交中,而不是之后的提交中?

git - 代理连接在访问 git 时中止

git - github merge "pull-request"和gitlab merge "merge-request"的区别

git - 如何 git commit --amend 作为分支基础的提交