公司刚用 git,还不太会用,请教下怎么合并代码 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
darknoll
V2EX    程序员

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

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

    公司原来都是用 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
    去官网看教程呗
    rb6221
        3
    rb6221  
       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" 指令的。
    1U2w1Px3OT32KYu1
        53
    1U2w1Px3OT32KYu1  
       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     Solana     6000 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 01:46 PVG 09:46 LAX 18:46 JFK 21:46
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86