5bb864e1fc775087
V2EX  ›  问与答

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

  •  
  •   5bb864e1fc775087 · Sep 5, 2020 · 7588 views
    This topic created in 2262 days ago, the information mentioned may be changed or developed.

    我现在在 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 分支,这样就不用删这些文件又恢复这些文件

    45 replies  •  2021-05-11 17:11:18 +08:00
    blindie
    blindie
    Sep 5, 2020
    1
    可以了解一下 git stash 这个功能
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    2
    @blindie #1 git stash 我知道,但不是这个用途吧? git stash 不就是把未提交的文件,找个地方存起来,然后把暂存区清空(应该是叫暂存区吧忘了),事后可以再恢复出来
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    3
    @5bb864e1fc775087 #2 git stash 跟我说的东西没关系吧
    silentsee
    silentsee
    Sep 5, 2020
    4
    git stash
    git checkout master
    git merge dev
    git checkout dev
    git stash pop
    TMaize
    TMaize
    Sep 5, 2020 via Android
    5
    我都是项目再复制一份,一个用来合并,一个用来开发
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    6
    @silentsee #4 好吧 我帖子没说清楚;我举的例子是我当前在 dev 分支, 已经把改的东西都 git commit 了, 这时执行 git status 显示我没有未提交的改动; 这时我在 dev 分支我要把我刚刚在 dev 分支提交的 commit 合并到 master 分支
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    7
    举个例子
    git init // 这时我在 master 分支
    git checkout -b dev
    touch test
    git commit -m "test"
    然后我现在在 dev 分支, 要把刚刚提交的 commit "test" 合并到 master 分支, 但是不想用 git checkout master; git merge dev 这种方式
    lcdtyph
    lcdtyph
    Sep 5, 2020 via iPhone❤️1
    8
    如果你确定这次 merge 可以 fast forward 的话可以这样

    git branch -f master dev

    但是不建议这么操作
    viggoc
    viggoc
    Sep 5, 2020 via Android
    9
    cherry-pick 了解一下
    sfqtsh
    sfqtsh
    Sep 5, 2020 via Android
    10
    用 worktree 吧
    Kobayashi
    Kobayashi
    Sep 5, 2020 via Android❤️2
    11
    现在的年轻人怎么都这么懒了? https://stackoverflow.com/q/3216360/5101148
    nicklooo
    nicklooo
    Sep 5, 2020 via iPhone
    12
    @viggoc 我觉得楼主需要的就是这个
    xqin
    xqin
    Sep 5, 2020❤️1
    13
    @Kobayashi 自己先试一下再讲, stackoverflow 上面最高票的回答.

    里面讲了两种

    第一种:
    git fetch . foo:master

    这条仅限于 master 到 foo 可以 fast-forward

    第二种:
    git fetch <remote> +<remoteBranch>:<localBranch>

    多的这个+号, 如果用了的话, 是强制将 localBranch 的位置更新到 remoteBranch 位置.

    即 如果 master 上有其他的提交, 那么不好意思, 丢了..


    所以就目前来说, 如果存在 master 到 当前分支 需要进行正常合并的, 是没有办法 不切换分支进行 merge 的. (参见那个帖子中, 第二个回复).

    如果可以 fast-forward 过来的, 参见上面第一种方法.
    blindie
    blindie
    Sep 5, 2020 via Android❤️1
    14
    @5bb864e1fc775087 不管是 github flow 还是 git flow 都不会频繁出现 merge 到 master 的需求。如果使用 gitlab 合作模式走 mr 提交上 master 则可以直接在 gitlab 上提 mr 。况且我看你回答都懂,4 楼回答完全解决你的问题,为什么不写个 shell ?
    newtype0092
    newtype0092
    Sep 5, 2020❤️1
    15
    如果你分支差异确实这么大,切换起来感觉麻烦的话,重新拉一个仓库长期放在 master 分支就好了,只需合并就 cd 到新仓库的文件夹操作,不用切分支。
    gqbre
    gqbre
    Sep 5, 2020❤️1
    16
    git rebase dev master
    不要轻易尝试,除非你知道怎么还原
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    17
    @blindie #14 4 楼说的就是我主贴里说的,先切到 master 再合并。我平时就是这么做的,只是不爽一来一回删掉文件又恢复回来。所以才来问问有没有不切换到 master 分支的方法
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    18
    @viggoc #9 我理解的 cherry-pick 就是把另一个分支的某个 /某些 commit,单独拿到我当前分支再 commit 一遍。如果我没理解错,那我要的情况就不适合,因为执行 cherry pick 前提我要先切换到 master 分支,但是我要的是不切换到 master 分支的方法
    zyfsuzy
    zyfsuzy
    Sep 5, 2020
    19
    cherry-pick 用一下
    silentsee
    silentsee
    Sep 5, 2020
    20
    @5bb864e1fc775087 你是说因为这几百个文件的提交导致切换分支很慢吗?按道理不会太慢的,除非你这几百个文件十分巨大。还是说你就是强迫症,觉得有几百个文件的变动就会让你不爽?
    LeoWA
    LeoWA
    Sep 5, 2020
    21
    git rebase --onto 看一下
    q8164305
    q8164305
    Sep 5, 2020 via Android
    22
    那你只能 gitclone 两个项目了,一个用来开发,一个用来合并,先把代码推上去,然后另一个项目拉下来合并再推
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    23
    @silentsee #20 不是慢,只是强迫症不喜欢这样
    wushigejiajia01
    wushigejiajia01
    Sep 5, 2020❤️2
    24
    楼上一群人 连帖子都没看明白吗?
    楼主的需求: 将 B 分支合并到 A 分支时, 不需要切换到 A 分支就能直接将 B 分支代码提交给 A 分支

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

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

    我也想知道有没有什么方法能减少这样的"只能在 A 分支进行'将 B 分支合并到 A 分支的操作'"
    WilliamYang
    WilliamYang
    Sep 5, 2020 via iPhone
    25
    前同事教我的,好像是 git push -u origin dev:master 具体忘记了,就是直接将 dev 推送到 master
    teawithlife
    teawithlife
    Sep 5, 2020
    26
    其实先治疗强迫症才是当务之急[狗头]
    楼主可以先说一下为啥会有一次新增几百个文件的情况吗?
    如果这种情况出现频率很低,那就忍忍用 checkout 吧,或者像楼上几位说的,放两个不同的文件夹
    如果出现概率很高,我感觉 git 不是一个适合的工具
    lsdm999
    lsdm999
    Sep 5, 2020
    27
    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
    lsdm999
    Sep 5, 2020
    28
    看错了,2+3:都用 git cherry-pick 即可
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    29
    @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
    lsdm999
    Sep 5, 2020
    30
    其实 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
    lsdm999
    Sep 5, 2020
    31
    如果 dev commit 后没有修改,stash 都可以省掉
    5bb864e1fc775087
    5bb864e1fc775087
    OP
    Sep 5, 2020
    32
    @lsdm999 #31 好吧还是我主楼没说清楚。顺着我 7 楼的例子,平时我就是这样:
    git checkout master
    git merge dev // 直接 merge 就行,还不需要 cherry pick
    我发贴的主要目的就是想问能不能不执行 git checkout master,也就是不要切换到 master 分支,且 master 分支能与 dev 分支保持同步
    v2ft
    v2ft
    Sep 5, 2020
    33
    提 merge request 吧,哈哈
    Auster
    Auster
    Sep 5, 2020 via iPhone
    34
    cherry pick 不就是为这种情况的吗
    EminemW
    EminemW
    Sep 5, 2020
    35
    我用 idea 可以直接推到 Master 分支啊。。
    guanhui07
    guanhui07
    Sep 5, 2020
    36
    git stash
    ooops
    ooops
    Sep 5, 2020
    37
    首先,merge,rebase,cherry-pick 之类的操作会产生新的 commit,这就意味着有可能会出现 conflict 。所以不先切到那个分支是不可能实现的。
    其次,好多楼层都说 cherry-pick 好像忽略了它只能把当前分支 cherry-pick
    最后,新增的文件也可以先 git add,再 git stash 。如果强迫症不想在 stage area,可以 pop 之后 reset 那些新增的文件,重回 untrack 的状态。
    yaerda
    yaerda
    Sep 5, 2020❤️2
    38
    正好分享个最近学到的: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
    wangyzj
    Sep 5, 2020
    39
    rebase
    nicklooo
    nicklooo
    Sep 6, 2020 via iPhone❤️1
    40
    @ooops git stash save -u
    yuriko
    yuriko
    Sep 6, 2020
    41
    git 命令基本都是针对当前分支的操作,涉及到操作空间的逻辑,这个设计我觉得很合理

    以及本地切换 git branch 很麻烦我理解,但关注点是文件的创建流程就是强迫症了,不然你要不要考虑下 gitlog 里的东西都怎么存的?
    SergeGao
    SergeGao
    Sep 6, 2020❤️1
    42
    楼上都不读题的吗....题主是想在不切回 master 分支的情况下合并某分支到 master 上,说个我知道的操作:

    git fetch origin branch-dev:master

    这个命令的意思就是拉取 branch-dev 分支并合并到 master 分支,所以题主可以先 push 一下 dev 分支,然后执行下上面操作即可
    xi_lin
    xi_lin
    Sep 6, 2020
    43
    @yaerda git worktree 学到了,感谢。不知道为啥我在 v2 上没有点感谢的入口了。。
    standin000
    standin000
    Sep 7, 2020❤️1
    44
    正想提 worktree,需要 git 2.15 版本,一个目录存在多个分支,公用.git 目录
    James369
    James369
    May 11, 2021
    45
    太棒了,我正好有这个需求。因为我经常在切换分支的时候,文件就莫名其妙的丢失了(可能被 ignore 了)。现在可以不用切换直接合并了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2067 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 13:13 · PVG 21:13 · LAX 05:13 · JFK 08:13
    ♥ Do have faith in what you're doing.