请教一个 git 问题,分支里多次提交合并成一个 commit,再合并到 main 分支

240 天前
 yagamil

请教各位 V 老师

用网上的教程:

1 、git checkout master 2 、git merge --squash 分支名称 3 、git commit -m '汇总后的一次 commit 内容'

这样是可以,不过从此我的分支和 main 的就分开了。

1487 次点击
所在节点    程序员
24 条回复
z1829909
240 天前
1. 在你的分支 git reset --soft hashxxx 回退到合并前的那个提交
2. git add . + git commit -m 'xxx' + git push --force
这样你的这个分支的后面几个提交合成一个了
horizon
240 天前
git rebase
xubeiyan
240 天前
这个问题那些 git 命令行最棒的人就跟没看见一样,笑死,切到需要的分支上,用 tortoisegit 查看提交记录,多选若干个提交,压扁成一个提交,完了,再看 merge 或者 rebase 到 master 分支上
yagamil
240 天前
@xubeiyan 大佬们都觉得问题简单哈。。。
hanxiV2EX
240 天前
我只会用 git rebase -i HEAD~3 ,3 是要合并几条 commit ,然后在 vim 里编辑提交信息,会有提示的,第一条不动,其他的改成 s (squash) ,然后保存,然后再改 commit 信息就行了。
xubeiyan
240 天前
@yagamil 这种压扁提交的方式有很多种但用命令行来实现都不简单,使用图形界面就比较简单
dayeye2006199
240 天前
rebase interactive 压一块儿
yagamil
240 天前
@hanxiV2EX 谢谢老哥,这样可以。
JackyCDK
240 天前
直接 rebase 呗
hexiaowu1993
240 天前
git reset --soft 跟 git rebase -i 都可以实现你的要求,压缩 commit 后,在强推到你特性分支,然后在合并到主分支,这样就只有一个 commit 了
loveDiu4ever
240 天前
rebase -i 然后根据选项进行筛选合并
kfansup
240 天前
rebase -i master ,然后提交前 保留一个初始 commit ,squash 其他 commit 。
dif
240 天前
不想分开就 rebase ,各有优缺点。统一规范就行。
anonym233
240 天前
如果多次提交基于以前的 master ,那就 git reset --soft 合并比较方便。如果多次提交不连续,那就需要 git rebase -i 调整顺序并合并。 合成一个 commit 以后,可以 git rebase master ,然后再到 master 分支下 merge 这个分支,这样的话 master 合并是无痛的,并且你的分支也是基于最新的 master ,还是紧密的联合在一起,可以继续在这个分支上开发。
droppedbytech
240 天前
@xubeiyan 不是反对你哈,我知道 gui 能这样操作,非常方便;但对习惯 git cli 的人来说,这套操作的负担和敲命令其实差不多,而且粒度还更精细,想 reword 哪个 commit 都是可以的。而且你看下面的回复都是用命令行的操作方式介绍,怎么就“跟没看见一样”呢
shawndev
240 天前
在你检出的新分支上,合并多次提交之后会造成哈希链表的分叉,所以所谓的分开了是必然结果。

只是这种情况可以不必检出新分支操作,在 main 分支 rebase 之后可以选择 force push 。
mengdodo
240 天前
rebase 变基的坑有人踩过没😄
aroa
240 天前
@droppedbytech 你真知道?我好几个 gui 用下来只有 tortoisegit 支持这个功能
Z5460520
239 天前
我不知道你是用的什么 IDE 开发工具。我用的是 pycharm 。首先确认你的当前分支。你现在肯定已经有很多个 commit_id 。现在你可以基于你的当前的分支,再新建一个分支。然后 pycharm 会直接切到你新建的分支上。然后你选择你从 master 分支切换的那个节点(非常重要),然后选择重置到那个节点。你所在的当前分支的 commit 暂存区会有你所有的改动。然后提交 commit 。你的这个新的分支就可以合成一个 commit,然后将这个新分支提交合并到主分支上了。没有什么指令。
droppedbytech
239 天前
@aroa 别的 GUI/TUI 不清楚,我只是在很久以前用过小海龟,但是 lazygit 是支持的,我感觉没道理 TUI 都支持的东西 GUI 不支持吧... 不过我还是更习惯 rebase -i ,然后自己编辑,可能我远程机开发比较多习惯了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972816

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX