V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
FenGuWu
V2EX  ›  git

本地有两个 commit,如何只 push 最新的那个 commit

  •  
  •   FenGuWu · 2018-10-08 18:38:04 +08:00 · 7513 次点击
    这是一个创建于 2237 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如开发的时候遇到了测试提线上 BUG。我可以先把手头开发的内容提一次 commit: abcd1234
    然后修复 BUG 的内容提一次 commit: efgh5678。
    不切换分支,不 stash 的情况下怎么把 efgh5678 提交上去,而不会吧 abcd1234 连带上去。
    15 条回复    2018-10-09 11:30:26 +08:00
    whahuzhihao
        1
    whahuzhihao  
       2018-10-08 18:45:44 +08:00
    git rebase -i origin/master
    然后把不要的 commit squash 掉
    tsl0922
        2
    tsl0922  
       2018-10-08 19:31:35 +08:00 via iPhone
    git push origin efgh5678:master
    terence4444
        3
    terence4444  
       2018-10-08 19:40:11 +08:00 via iPhone
    最好 cherry pick 出来做个新的 branch
    WuwuGin
        4
    WuwuGin  
       2018-10-08 19:40:57 +08:00
    所以说修 bug 为什么不新开 branch。
    wingoo
        5
    wingoo  
       2018-10-08 20:42:47 +08:00
    cherry pick 出来就行了
    pagxir
        6
    pagxir  
       2018-10-08 23:09:01 +08:00
    答案是,做不到。因为每个 commit 都是对应一个完整的版本,所以 efgh5678 自然是包含 abcd1234 的提交,如果你 push 了 efgh5678 比如包含这个完整的版本。前面的 1 ~ 5 楼的回答都是错误的。
    当然了,正确的流程是在 bugfix 分支上进行 bugfix,feature 分支开发 feature,然后进行分支的 merge。反正 git 的分支是轻量分支,又不浪费什么。
    newtype0092
        7
    newtype0092  
       2018-10-08 23:17:50 +08:00
    @pagxir 我们就是多人共用分支的工作流,git 没有什么正确的流程,因为各个团队的分工合作方式都不一样,只有最适合团队的工作流。

    这种情况你需要将两个 commit 交换顺序,让 abcd1234 变成最后一个提交,efgh5678 变成倒数第二个提交,然后只 push 到倒数第二个提交。

    具体操作方式就是用交互式 rebase,就是 1 楼到 rebase -i,默认会对你没有 push 到远程到这两个提交操作,将两个 commit 对应信息的行交换顺序,然后保存,两个 commit 的顺序就会调换。
    然后用 2 楼的方式,只 push efgh5678 到远程就好楼。
    azh7138m
        8
    azh7138m  
       2018-10-08 23:37:02 +08:00 via Android
    @newtype0092 共用开发分支没问题,楼主是在开发分支修 bug,这个就有问题了
    pagxir
        9
    pagxir  
       2018-10-08 23:42:18 +08:00
    @newtype0092 你这个做,严格来说不是 commit 顺序调换,而是生成了两个新的 commit,只是 commit 的产生的差分文件跟原来的 commit 大致一致。
    swulling
        10
    swulling  
       2018-10-08 23:42:26 +08:00
    正确答案:Rebase 交换 commit 顺序,然后指定 commit id push
    最佳实践:每个 feature/bugfix 都是一个单独的本地分支,都往同一个远程分支 push,push 前用 rebase 同步远程分支即可


    正确答案往往不是最佳实践,git 的特性就是轻量级的本地分支,如果不爱用,无疑是浪费了 git 最大的特性
    swulling
        11
    swulling  
       2018-10-08 23:43:23 +08:00
    @pagxir 没有 push 的 commit 修改很正常,没有任何方法可以在不修改 commit 的情况下满足 lz 的需求
    newtype0092
        12
    newtype0092  
       2018-10-09 00:29:19 +08:00
    @azh7138m 感觉楼主的开发分支可能就是 dev 分支,不是 feature 分支,所以各种操作都在这个分支搞吧。。。
    newtype0092
        13
    newtype0092  
       2018-10-09 00:33:11 +08:00
    @pagxir 这两个所谓的新的 commit 对实际情况来说并没有什么影响吧,毕竟都是本地的 commit,id 也一样,只要不是之前手动发过 patch 给别人,可以说和原来一样吧。
    pagxir
        14
    pagxir  
       2018-10-09 01:28:34 +08:00 via Android
    @newtype0092 ID 哪里一样了。不一样的,如果一样说明就是一个 commit。
    newtype0092
        15
    newtype0092  
       2018-10-09 11:30:26 +08:00
    @pagxir 啊,是会生成一个新 id,我好像从来没注意过。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:16 · PVG 04:16 · LAX 12:16 · JFK 15:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.