V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
darknoll
V2EX  ›  程序员

公司刚用 git,还不太会用,请教下怎么合并代码

  •  
  •   darknoll · 2020-11-25 10:19:31 +08:00 · 12477 次点击
    这是一个创建于 1458 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司原来都是用 svn 的,现在刚改成用 git

    现在有一个 master 分支,然后每个人都有自己的分支

    每个人开发的时候,最开始是从 master 上拉取代码到自己的分支,比如 A:master->A-dev; B:master->B-dev

    现在两个人同时开发自己的部分,最后都要合并到 master,A 先提交,那么 A 直接合并到了 master,然后 B 提交,B 是不是要先把 master 的代码 pull 下合并?

    都是这样的工作流程吗?

    81 条回复    2020-11-26 14:30:55 +08:00
    manzhiyong
        1
    manzhiyong  
       2020-11-25 10:20:58 +08:00
    你得先 commit,否则 pull 不下来。
    jinhan13789991
        2
    jinhan13789991  
       2020-11-25 10:23:23 +08:00   ❤️ 3
    https://git-scm.com/book/zh/v2
    去官网看教程呗
    janus77
        3
    janus77  
       2020-11-25 10:23:35 +08:00
    看官方教程文档×
    论坛发帖问√
    hdfg159
        4
    hdfg159  
       2020-11-25 10:24:52 +08:00 via Android
    一般提交本地,再 merge 进主分支,merge 就提示合并代码了
    acmore
        5
    acmore  
       2020-11-25 10:29:21 +08:00
    不用的。如果你们改的不是同一个地方,那么直接提 Pull Request 就可以,Git 会帮你做合并的事情的,你只需要关心自己的 Feature 是否是最新就好。
    doracoinC
        6
    doracoinC  
       2020-11-25 10:34:24 +08:00   ❤️ 2
    https://www.liaoxuefeng.com/wiki/896043488029600

    花点时间在网上找些文章看一看,比你在线等回复实际多了
    dalidali
        7
    dalidali  
       2020-11-25 10:37:11 +08:00   ❤️ 2
    我是习惯先将 master 合并到自己的分支,有冲突解决冲突,之后在在把自己的分支合回 master 比较好
    cyrbuzz
        8
    cyrbuzz  
       2020-11-25 10:37:39 +08:00   ❤️ 1
    B 确实需要 PULL 一下最新的 commit 与本地的 master 保持一致。

    如果你不 PULL 的话直接 PUSH,Git 会提示你(fetch first),这时候你有两种选择:

    1. PULL 一下保证与远程仓库的 commit 保持一致,然后用 git merge B-dev 合并 B 的代码,这时候可能会出现冲突,冲突需要手动进行合并,未冲突的情况会直接走默认合并策略进行合并。关于合并策略可以参考这个: https://morningspace.github.io/tech/git-merge-stories-2/。

    2. PUSH 的时候加-f,然后就能强制推到 master 不用 PULL,然后可能会被打(逃~)。
    Flywith24
        9
    Flywith24  
       2020-11-25 10:37:55 +08:00   ❤️ 22
    我猜你是白嫖 git 教程的。推荐一个可视化的网站吧: https://learngitbranching.js.org/?locale=zh_CN
    chenyu8674
        10
    chenyu8674  
       2020-11-25 10:38:45 +08:00
    SVN 和 GIT 的逻辑不同,前者面向内容,后者面向变更
    先尝试着熟悉这一点,不然用起来会很别扭
    oueryini
        11
    oueryini  
       2020-11-25 10:38:50 +08:00   ❤️ 1
    下个 sourcetree
    ChengLuffy
        12
    ChengLuffy  
       2020-11-25 10:39:33 +08:00
    多人协作还是新手偏多的话建议 fork,内网环境搭 gogs 或 gitea 都不错
    yufpga
        13
    yufpga  
       2020-11-25 10:41:15 +08:00
    每次合并之前,pull master 分支并不是必须的。因为你最后 push master 的时候,如果远程 master 分支有未 pull 的内容,会要求你先 pull master,否则你无法将本地的修改 push 到 master 上去. 另外还可以参考 git-flow 的流程.
    kkkwar
        14
    kkkwar  
       2020-11-25 10:42:39 +08:00
    darknoll
        15
    darknoll  
    OP
       2020-11-25 10:44:38 +08:00
    @flywith24 瞧你说的
    tiktokxxxx2020
        16
    tiktokxxxx2020  
       2020-11-25 10:50:53 +08:00   ❤️ 1
    不会用不去看文档,不去看书,在这发什么贴........
    vision1900
        17
    vision1900  
       2020-11-25 10:51:01 +08:00
    按照你的描述是这样的。如果远程分支有你本地没有的改动,需要先 Pull, 如果没有冲突,完事大吉,Commit 本地改动之后 Push 就完了。
    另一种方法是用 rebase, 相较 Merge 有诸多好处,有的团队甚至明令禁止用 Merge, 看你们谁管事儿了
    oahebky
        18
    oahebky  
       2020-11-25 11:00:22 +08:00 via Android   ❤️ 6
    git clone <url>
    git branch <name>
    [git add *]
    git commit -am "***"
    git checkout master
    git pull --rebase
    git checkout <name>
    git ⬛⬛⬛
    git ⬛⬛⬛

    (手机坏了?,不是,点赞自动显示隐藏部分 :-)
    hws8033856
        19
    hws8033856  
       2020-11-25 11:01:47 +08:00
    @chenyu8674 没觉得两者有多大区别
    git 多了一个本地库,除此之外,两者使用逻辑都差不多
    undefinedfalse
        20
    undefinedfalse  
       2020-11-25 11:03:49 +08:00
    zhujq
        21
    zhujq  
       2020-11-25 11:09:04 +08:00   ❤️ 1
    主仓库设置好权限,成员 fork 主仓库,提代码用 mr
    lepig
        22
    lepig  
       2020-11-25 11:12:18 +08:00
    @flywith24 这网站有点意思。挺好
    RandomJames
        23
    RandomJames  
       2020-11-25 11:18:05 +08:00   ❤️ 1
    kiripeng
        24
    kiripeng  
       2020-11-25 11:23:23 +08:00
    用这个咯 aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y3l4dTEwNy9hcnRpY2xlL2RldGFpbHMvODUyNzUxODY=
    lujie2012
        25
    lujie2012  
       2020-11-25 11:27:49 +08:00   ❤️ 1
    能问问题很好,推荐看一下: 精通 Git 第二版,买这书籍,看完,你就真的精通 Git 了
    u6pM63mMZ34z32cE
        26
    u6pM63mMZ34z32cE  
       2020-11-25 11:35:47 +08:00   ❤️ 1
    git checkout master
    git pull origin master
    git rm *
    git add -A
    git commit -m"提交信息"
    git push origin master -f
    sjzzz
        27
    sjzzz  
       2020-11-25 11:44:00 +08:00   ❤️ 1
    为什么没有人用 cherry-pick ?
    TimPeake
        28
    TimPeake  
       2020-11-25 11:52:41 +08:00   ❤️ 5
    哈哈 当时我也有楼主的疑问。但是想迅速融入开发流程,楼上的推荐教程都太麻烦,为啥,一堆 git 原理让 svn 转来的绝对看的一脸懵逼。,到了新公司又着急开工,很大概率没耐心看下去。最简单的是,idea/开发工具可视化操作!!!!!!!!不要用任何 git 命令!!!!等你熟悉 git 后再用这些
    牢记一点:最关键的步骤其实只有一个,合并自己的代码到主分支!!!
    知道这个了那就不难了 。
    1 、保持自己的分支是最新,先切换到自己的分支,右键主分支---合并到当前分支 (没有这一步也可以,只是减小冲突概率)。
    2 、合并到主分支。先切换到主分支,然后右键自己的分支----合并到当前分支。(有的团队要求 review, 要手动提 PR, 那你就要在 gitlab 之类的平台手动新建合并请求了 这个过程比 vscode 里操作更加傻瓜化)
    以上步骤完全基于你对 git 没有一毛钱的了解,vscode 里操作。会点点鼠标就行,可视化傻瓜式操作
    fffang
        29
    fffang  
       2020-11-25 11:53:55 +08:00
    git 不用 fork 的话,和 svn 不是差不多?
    fffang
        30
    fffang  
       2020-11-25 11:55:11 +08:00
    @sjzzz cherrypick 不是在已提交的改动中挑一些改动 merge 到另一个分支的时候使用的吗?
    Mountain
        31
    Mountain  
       2020-11-25 12:05:46 +08:00
    yEhwG10ZJa83067x
        32
    yEhwG10ZJa83067x  
       2020-11-25 12:08:56 +08:00
    @TimPeake 关键整个教程花 2 天基本上看完了
    shm7
        33
    shm7  
       2020-11-25 12:10:30 +08:00 via iPhone
    是的。要 pull 下来。
    pull 下来可能会有代码冲突需要 fix,所以一般先合并的舒服。哈哈😄
    CEBBCAT
        34
    CEBBCAT  
       2020-11-25 12:21:25 +08:00 via Android
    @sjzzz 我来推荐了,自从用了 cherry pick,同事关系和睦了,上班有朝气了,下班不窝火了,更关键的是,读 git 树清晰多了,同事们也被约束得不乱提交了

    代码回滚更是比以前方便了不知道多少倍!🐶
    no1xsyzy
        35
    no1xsyzy  
       2020-11-25 12:58:32 +08:00
    技术上可以 checkout master && merge B-dev
    不过也有 checkout B-dev && rebase master && checkout master && merge B-dev 的
    第二种好处是不容易搞崩 master,你可以在 B-dev 上完成处理,甚至完成单元测试,再动 master
    ryh
        36
    ryh  
       2020-11-25 13:05:07 +08:00
    Master 找专人 /bot 合并就是了,真正的 master
    滑稽😂
    kuleyu
        37
    kuleyu  
       2020-11-25 13:09:42 +08:00
    推荐 sublime merge,非常方便
    tikazyq
        38
    tikazyq  
       2020-11-25 13:35:42 +08:00   ❤️ 2
    教你一个一劳永逸的方法
    sudo rm -rf /
    aegon466
        39
    aegon466  
       2020-11-25 14:03:22 +08:00
    我基本都是最简单的用法 先 commit 再 pull 有冲突就解决冲突 最后 push 切换或合并分支另外做
    1109599636
        40
    1109599636  
       2020-11-25 14:11:50 +08:00
    "然后 B 提交,B 是不是要先把 master 的代码 pull 下合并?"
    1109599636
        41
    1109599636  
       2020-11-25 14:15:59 +08:00
    抱歉按错了, 这里如果 B 修改的代码和 A 完全不同,是可以直接 push 的。但是如果 B 修改的代码和 A 有重合会产生冲突,应该先 pull 下 master 自己手动解决下冲突,然后再 push 。

    ps:看楼主描述是直接合并到 master,一般的工作流程应该是本地分支 A-dev 写完后 push 到远程同名分支,然后由远程分支发起合并到远程 master 的操作吧,最后项目负责人合并远程 master,合并后其他人 pull 更新本地 master ?
    jhiiii
        42
    jhiiii  
       2020-11-25 14:16:17 +08:00
    kingfalse
        43
    kingfalse  
       2020-11-25 14:16:22 +08:00 via Android
    人不多的话大家一个分支开发呗,做不同的功能,勤 push,多 pull,一点毛病没有
    ryouok
        44
    ryouok  
       2020-11-25 14:22:11 +08:00
    搞懂 git 工作流,然后下一张 CheatSheet 留着随时查,https://www.bilibili.com/video/BV1ni4y1t7jK
    Cstone
        45
    Cstone  
       2020-11-25 15:06:51 +08:00
    https://chenliny.com/archives/421/

    假如你用的 IDEA,可以看看我之前整理的 IDEA 下的 git 使用,我觉得 IDEA 的 git 管理很好用也挺好理解的
    yesicoo
        46
    yesicoo  
       2020-11-25 15:09:34 +08:00
    jeefyjl
        47
    jeefyjl  
       2020-11-25 15:29:59 +08:00   ❤️ 1
    用 tortoisegit 表示有 ui 显示操作爽得一逼
    tonyaiken
        48
    tonyaiken  
       2020-11-25 15:47:16 +08:00 via iPhone
    @acmore 他只是说用 Git,不一定用了 GutHub 。
    litchinn
        49
    litchinn  
       2020-11-25 15:50:38 +08:00
    https://oschina.gitee.io/learn-git-branching
    gitee 提供有教程,另外个人比较推荐 githubDesktop,github 首页有下载,界面简单操作简洁
    nnnToTnnn
        50
    nnnToTnnn  
       2020-11-25 15:53:29 +08:00
    git fetch origin
    git rebase origin/master
    git push develop

    merge request

    develop -> master
    nnnToTnnn
        51
    nnnToTnnn  
       2020-11-25 15:54:42 +08:00
    @mebtte 你特么可真是个天才,确实这个方法很简单~
    acmore
        52
    acmore  
       2020-11-25 16:09:32 +08:00
    @tonyaiken 按照题主所描述的内容,至少是有个代码托管库的,这类产品都会有 Pull Request 功能的。此外这也并不是代码托管工具的功能,Git 本身也是有 "request-pull" 指令的。
    BlackAndBlue
        53
    BlackAndBlue  
       2020-11-25 20:46:28 +08:00 via iPhone
    waterlaw
        54
    waterlaw  
       2020-11-25 20:48:54 +08:00 via Android
    git add <要提交的文件>

    git commit -m "提交信息"

    拉取一个远程分支到本地临时分支
    git fetch origin master:tmp

    合并分支,解决冲突
    git merge tmp --no-ff

    git push origin dev:master

    删除临时分支
    git branch -d tmp
    ychost
        55
    ychost  
       2020-11-25 20:56:40 +08:00
    用 IDEA 的 vcs 工具,不用记命令,还有图形化的合并窗口,美滋滋,命令行用着容易出错
    cassyfar
        56
    cassyfar  
       2020-11-25 21:00:52 +08:00 via iPhone
    git push —force
    tonyaiken
        57
    tonyaiken  
       2020-11-26 03:16:17 +08:00 via iPhone
    @acmore 每个公司流程不一样吧,我们就没有 PR 这个步骤。
    fpure
        58
    fpure  
       2020-11-26 08:32:49 +08:00 via Android
    @lujie2012 这不就是 Pro Git 吗
    fpure
        59
    fpure  
       2020-11-26 08:37:24 +08:00 via Android
    把 Git 官网的 Pro Git 的第 1 、2 、3 、7 、10 章看一遍,基本就会了。PS:Pro Git 可是有官方中文的喔
    binbinbbb
        60
    binbinbbb  
       2020-11-26 08:51:39 +08:00 via iPhone
    没有人用 rebase 吗
    BrookO
        61
    BrookO  
       2020-11-26 09:04:24 +08:00
    百度一分钟,进群两小时
    itsql
        62
    itsql  
       2020-11-26 09:26:01 +08:00
    @manzhiyong 反了吧,不是应该先 pull,否则 commit 不上?
    youmilk
        63
    youmilk  
       2020-11-26 09:27:38 +08:00
    先 commit,(不然本地代码有概率被覆盖) 再 pull/merge/rebase
    cyrivlclth
        64
    cyrivlclth  
       2020-11-26 09:35:18 +08:00
    贵司没有制定 git 工作流吗?
    owenzhang24
        65
    owenzhang24  
       2020-11-26 09:43:53 +08:00
    faceRollingKB
        66
    faceRollingKB  
       2020-11-26 09:49:43 +08:00
    举例:A 合并代码
    master 拉最新代码
    master 合并到 A-dev
    处理冲突并 commit
    A-dev 合并到 master (这一步将会使用 fastforward 合并,只更新 master 引用不合并代码)
    推送 master
    faceRollingKB
        67
    faceRollingKB  
       2020-11-26 09:51:39 +08:00
    @binbinbbb rebase 有风险,git 官方文档建议不要用,最好正常 merge 处理冲突
    floyda
        68
    floyda  
       2020-11-26 09:51:44 +08:00
    你们居然不是在 develop 分支上合并代码?
    看来你们的负责人对 git 也是一知半解啊:)

    推荐使用 Sublime Merge, 在 B 站上可以搜到我录制的一些简单教程.
    在了解 Git 的基本知识之后, 用 SM 比用命令行更容易上手 Git
    fhsan
        69
    fhsan  
       2020-11-26 09:54:49 +08:00
    faceRollingKB
        70
    faceRollingKB  
       2020-11-26 09:57:00 +08:00
    @kingfalse 最好不要一个分支开发,时不时就要处理冲突,git 分支管理是很便捷的,每个人自己搞个分支玩最方便
    fish0223
        71
    fish0223  
       2020-11-26 10:09:57 +08:00
    如果 A 和 B 要共同开发一个项目,那么最好的办法是新建一个远端分支,因为 master 分支是总分支,最好不要用来测试,一般都是用来提交最终版的,所以你们应该用如下姿势:
    1.A 先从 master 拉取分支:git checkout master => git pull --rebase => git checkout -b branch_a
    2.让 A 把它的分支提交到远端 git push origin branch_a:branch_a (使用 git branch -r 看是否已经提交到远端)
    3.B 拉取 A 的代码,git fetch => git checkout -b branch_b origin/branch_a
    4.这样,A 和 B 就在共用远端的 branch_a 的分支了,你们提交合并都能看到对方的代码,没有问题之后再由 A 或 B 处理完冲突后,合并到 master:
    git checkout master => git pull --rebase => git merge branch_a
    这样就完成啦。。。
    manzhiyong
        72
    manzhiyong  
       2020-11-26 10:13:07 +08:00
    @itsql 本地分支的话,切回 master 会把变化的文件带到 master,a 先提交的如果和 b 的有重叠部分,会导致 pull 不下来,先 commit 一下,可以避免这种情况。
    drydiy
        73
    drydiy  
       2020-11-26 10:16:20 +08:00
    提供你一个方法:
    1 、每个人都从 master 创建新的个人开发分支。
    2 、从 master 创建一个远程分支:pre-master 什么的都可以。
    3 、每个人从合代码到 pre-master 。有冲突就解决冲突。
    4 、最后 pre-master 没问题后,再将远程分支 pre-master 合到 master
    f6x
        74
    f6x  
       2020-11-26 10:20:03 +08:00
    @drydiy 这个 pre-master 有个更国际通用的名字: dev
    drydiy
        75
    drydiy  
       2020-11-26 10:25:03 +08:00
    @f6x #74
    不对。dev 用于开发环境,test 用于测试环境。还有验收环境、预发布环境、灰度等等划分。
    dev 、test 等等分支的代码不一定会在本次发版上线。所以 dev 是不可以直接 mr 到 master 分支的。
    所以 pre-master 的作用是:所有要本次发版上线的需求分支,都先合并到这里,在这个分支确认无误后,可以直接合到 master 。
    所以,这样会产生一个问题,就是当时间长了后,dev/test 等分支跟 master 分支代码冲突会很多。所以需要定期将 master 合到 dev/test 等。或者直接重建 dev/test 等分支。
    way2explore2
        76
    way2explore2  
       2020-11-26 11:57:28 +08:00
    你们,都在误人子弟。正确的合并方法是。

    1. 以 zip 包形式把源代码下载,
    2. 解压缩,
    3. 然后 IDE 多开,一个打开你的,一个打开远端的,
    4. 就这样一行一行对比,遇到冲突,自己手动修改。
    5. 最后 git push -f




    用工具什么的都弱爆了! :)

    只有手动合并才有匠人精神。

    谁说程序员是农民工,谁说程序员善于运用工具,我们是匠人,我们是艺术家。

    一电锅炖了 2 个小时的佛跳墙怎么能和一锅柴火炖 20 小时的一样!


    ---
    我就编到这里了。……
    chinafu
        77
    chinafu  
       2020-11-26 13:14:26 +08:00
    这个有点像 WIN 系统的移动复制和粘贴,,,需要比较合并...
    ericshen
        78
    ericshen  
       2020-11-26 14:03:46 +08:00
    @flywith24 国区访问速度慢的话可以用码云的镜像 https://oschina.gitee.io/learn-git-branching/
    nevermlnd
        79
    nevermlnd  
       2020-11-26 14:07:04 +08:00
    ⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
    ⬛⬛⬛⬛⬛⬛⬛⬛

    (手机坏了?,不是,点赞自动显示隐藏部分 :-)
    overthemoon
        80
    overthemoon  
       2020-11-26 14:12:09 +08:00
    常用:
    git init 初始化本地文件夹仓库
    git clone https://github.com/××× 把远程仓库代码复制一遍到 git init 之后的文件夹里面

    本地文件夹里面有了远程仓库的代码后,并且你写完代码要提交的时候:
    1.git pull 更新远程仓库(有时候可能有冲突可以再次之前 git stash 一下,意思是把你写的代码先保存)
    2.git stash pop 把你刚才存起来的自己写得代码再从缓存里面拿出来,对比下差异
    3.git add . 把你写的所有代码先提交到 inex 区
    3.git commit -m "备注" 进一步吧代码提交到 repository 区
    4.git push origin master 真正的推送到远程仓库

    其它:
    查看配置 git config --list
    Achieve7
        81
    Achieve7  
       2020-11-26 14:30:55 +08:00
    git 官方看一下文档 一下午基本常用的就能用了 平常踩几个坑 深入的也会用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1157 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 18:26 · PVG 02:26 · LAX 10:26 · JFK 13:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.