针对特定提交使用git rebase -i?

9

我有一个分支,其中有几个提交,我想进行交互式的变基。但是,在拉取和合并后,现在有其他提交与我的提交交错在一起,因此我不能像这样做git rebase -i HEAD~3

是否可以在选择单个提交的情况下执行交互式变基?类似于git rebase -i 23duirs 3eujsfe ...

另一个可能性-如果我只运行git rebase -i,我相信可以剪切和粘贴我的提交行以使其连续,并从那里压缩,这正确吗?是否有最佳实践来最小化与其中不相关提交的冲突的机会?


2
将来请不要在这种情况下合并。如果您在<分支>上有本地更改,可以使用git pull --rebase <remote> <branch>。这样您就不会得到合并提交。 - Zach Langley
3个回答

7
鉴于此,
pick <unrelated a>
pick A
pick <unrelated b>
pick B
pick <unrelated c>

你一定可以做到。
pick <unrelated a>
pick <unrelated b>
pick <unrelated c>
pick A
squash B

只要你的提交与其他更改确实无关,这将完美地工作。

4

在Git中,合并后重新定位是一件很麻烦的事情。

通常我避免这个问题的方法是不进行合并他人的工作,而是通过获取和重新定位来实现。

git fetch upstream
git rebase upstream/master

你也可以使用git pull --rebase upstream master,但这有一个缺点,即它不会更新您的remotes/upstream/master跟踪分支,而git fetch会更新;因此,我更喜欢使用fetch && rebase而不是pull --rebase

这样,我的提交始终位于主分支中,直到我的开发准备就绪,然后我打开一个干净的历史记录的拉取请求,而没有合并的记录。 也就是说,在任何时候,我在工作分支中的最后n个提交都是我的提交,我可以轻松地重新命名、压缩等。

修改一些旧提交的最简单方法是git rebase -i,你传递给git rebase -i的参数是一个单独的提交,所有比提供的提交时间新的提交将显示在交互式重排屏幕上。我不知道这个屏幕是否只显示一些比参数新的提交。

更改旧提交的替代方法是git filter-branch,但使用起来要复杂得多。


从 git 1.8.4 开始,git pull 命令所使用的 fetch 确实会更新远程跟踪分支。不过分离出 fetch 步骤仍然是有用的,因为这样在开始 rebase 之前可以看到上游的变化。 - torek

0

小的hacky解决方案。

从远程创建一个新的本地分支(LOCAL_B)。使用git rebase -i HEAD~3将你在LOCAL_A中的提交(cherry-pick)到LOCAL_B并压缩它们。

现在,为了安全起见,备份LOCAL_A。

删除LOCAL_A。从远程创建新的本地分支LOCAL_A。将LOCAL_B中压缩的提交(cherry-pick)到LOCAL_A。

你已完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接