git 可以在 B 分支直接推送改动给 A 分支合并, 而不用切换到 A 分支的办法吗?

2020-09-05 11:41:22 +08:00
 5bb864e1fc775087

我现在在 dev 分支,提交了一个 commit,想让 master 合并这几个改动
我只知道要先切换到 master 分支,然后再 git merge dev 实现合并
有办法实现不用切换到 master 分支,直接让 master 分支合并这一个 commit 吗?

这种切换到 master 分支,再 git merge 的方式让我这个强迫症难受:

  1. 切换到 master 分支,git 会把我在 dev 分支里新建的文件都删掉,恢复 master 分支的状态
  2. 然后我再 git merge dev,就又把那些文件创建回来

如果我在 dev 分支的 commit 里创建了几百个文件,这一来一回就要改动几百*2 的文件,就很不爽

如果能让 master 分支先合并了,我再切换到 master 分支,这样就不用删这些文件又恢复这些文件

5545 次点击
所在节点    问与答
45 条回复
Mrun
2020-09-05 14:41:38 +08:00
git rebase --onto 看一下
q8164305
2020-09-05 14:43:10 +08:00
那你只能 gitclone 两个项目了,一个用来开发,一个用来合并,先把代码推上去,然后另一个项目拉下来合并再推
5bb864e1fc775087
2020-09-05 15:02:01 +08:00
@silentsee #20 不是慢,只是强迫症不喜欢这样
wushigejiajia01
2020-09-05 15:38:30 +08:00
楼上一群人 连帖子都没看明白吗?
楼主的需求: 将 B 分支合并到 A 分支时, 不需要切换到 A 分支就能直接将 B 分支代码提交给 A 分支

说实话, 我也觉得这样的操作很麻烦,
每次在临时分支上写完代码提交 PUSH 完,
如果需要合并到 DEV, 我都得 [ 先切换到 DEV 分支才能将临时分支的代码合并到 DEV ]

这种感觉就是 "只能操作当前所在分支, 不可跨分支操作"

我也想知道有没有什么方法能减少这样的"只能在 A 分支进行'将 B 分支合并到 A 分支的操作'"
WilliamYang
2020-09-05 16:26:35 +08:00
前同事教我的,好像是 git push -u origin dev:master 具体忘记了,就是直接将 dev 推送到 master
teawithlife
2020-09-05 17:07:22 +08:00
其实先治疗强迫症才是当务之急[狗头]
楼主可以先说一下为啥会有一次新增几百个文件的情况吗?
如果这种情况出现频率很低,那就忍忍用 checkout 吧,或者像楼上几位说的,放两个不同的文件夹
如果出现概率很高,我感觉 git 不是一个适合的工具
lsdm999
2020-09-05 17:24:54 +08:00
1. 这种切换到 master 分支,再 git merge 的方式让我这个强迫症难受
dev 分支都有可能代码冲突,你能保证跨 master 分支 commit 不出现代码冲突?
2. 切换到 master 分支,git 会把我在 dev 分支里新建的文件都删掉,恢复 master 分支的状态
然后我再 git merge dev,就又把那些文件创建回来
git stash 搞定
3. 如果我在 dev 分支的 commit 里创建了几百个文件,这一来一回就要改动几百*2 的文件,就很不爽
git cherry-pick 搞定(如你所描述的,切换分支是最简单不耗时的操作)
lsdm999
2020-09-05 17:27:24 +08:00
看错了,2+3:都用 git cherry-pick 即可
5bb864e1fc775087
2020-09-05 18:11:14 +08:00
@lsdm999 #27 原本我不认为 git stash 和 cherry-pick 能实现我的需要,但是看到好几个人说,我在想会不会是 git stash 和 cherry-pick 有我不知道的作用。能否按照我 7 楼的例子,接着用 git stash 和 cherry-pick 往下写命令。
我理解的 cherry-pick 是这样的:要用 cherry-pick 把 dev 分支的 commit 合并到 master 分支,前提要先切换到 master 分支才行,因为 cherry-pick 只能是把其他分支的 commit 转到当前分支。
lsdm999
2020-09-05 19:00:31 +08:00
其实 4 楼那个方案已经很接近了。
git stash
git checkout master
git cherry-pick commit-hash 值
git push
git checkout dev
git stash pop
没有冲突的话整个过程应该挺快的。
[cherry-pick 这一步有冲突啥的会有提示,可以先 git status 看下状态,那就撤销然后走 merge 手动解决冲突]
lsdm999
2020-09-05 19:02:01 +08:00
如果 dev commit 后没有修改,stash 都可以省掉
5bb864e1fc775087
2020-09-05 19:16:01 +08:00
@lsdm999 #31 好吧还是我主楼没说清楚。顺着我 7 楼的例子,平时我就是这样:
git checkout master
git merge dev // 直接 merge 就行,还不需要 cherry pick
我发贴的主要目的就是想问能不能不执行 git checkout master,也就是不要切换到 master 分支,且 master 分支能与 dev 分支保持同步
v2ft
2020-09-05 19:33:01 +08:00
提 merge request 吧,哈哈
Auster
2020-09-05 19:34:01 +08:00
cherry pick 不就是为这种情况的吗
EminemW
2020-09-05 19:59:09 +08:00
我用 idea 可以直接推到 Master 分支啊。。
guanhui07
2020-09-05 20:40:03 +08:00
git stash
ooops
2020-09-05 22:06:26 +08:00
首先,merge,rebase,cherry-pick 之类的操作会产生新的 commit,这就意味着有可能会出现 conflict 。所以不先切到那个分支是不可能实现的。
其次,好多楼层都说 cherry-pick 好像忽略了它只能把当前分支 cherry-pick
最后,新增的文件也可以先 git add,再 git stash 。如果强迫症不想在 stage area,可以 pop 之后 reset 那些新增的文件,重回 untrack 的状态。
yaerda
2020-09-05 23:21:54 +08:00
正好分享个最近学到的:git worktree - Manage multiple working trees

对于你这个问题:
假如你的项目本地克隆地址是:/path/repo,
在这个项目里使用命令 git worktree add /path/repo-m master,就可以创建出一个新的文件夹 /path/repo-m,对应于 master 分支,新的文件夹只是原项目 master 分支的一个引用,不用担心占 2 份项目空间
.
..
/path/repo ---dev 分支
/path/repo-m ---master 分支

假使你一般都在 /path/repo dev 分支开发,开发完后,直接新开个命令窗口定位到 /path/repo-m,
在在 path/repo-m 下轻轻松松便可以 merge 或者 cherry-pick dev 分支的东西,
方便的实现同一时间本地有多个分支并存,再也不需要 各个常用分支来回切,不断的 stash pop

以上是个人的一些粗浅理解和使用,如有不对或表达有误,还请指出
wangyzj
2020-09-05 23:47:16 +08:00
rebase
nicklooo
2020-09-06 00:03:07 +08:00
@ooops git stash save -u

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

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

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

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

© 2021 V2EX