我有一个分支,其中有几个提交,我想进行交互式的变基。但是,在拉取和合并后,现在有其他提交与我的提交交错在一起,因此我不能像这样做git rebase -i HEAD~3
是否可以在选择单个提交的情况下执行交互式变基?类似于git rebase -i 23duirs 3eujsfe ...
另一个可能性-如果我只运行git rebase -i
,我相信可以剪切和粘贴我的提交行以使其连续,并从那里压缩,这正确吗?是否有最佳实践来最小化与其中不相关提交的冲突的机会?
我有一个分支,其中有几个提交,我想进行交互式的变基。但是,在拉取和合并后,现在有其他提交与我的提交交错在一起,因此我不能像这样做git rebase -i HEAD~3
是否可以在选择单个提交的情况下执行交互式变基?类似于git rebase -i 23duirs 3eujsfe ...
另一个可能性-如果我只运行git rebase -i
,我相信可以剪切和粘贴我的提交行以使其连续,并从那里压缩,这正确吗?是否有最佳实践来最小化与其中不相关提交的冲突的机会?
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
在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 pull
命令所使用的 fetch
确实会更新远程跟踪分支。不过分离出 fetch
步骤仍然是有用的,因为这样在开始 rebase 之前可以看到上游的变化。 - torek小的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。
你已完成。
git pull --rebase <remote> <branch>
。这样您就不会得到合并提交。 - Zach Langley