V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
run2016
V2EX  ›  问与答

关于 GIT 的一个问题?

  •  
  •   run2016 · 2017-04-24 07:25:39 +08:00 · 1507 次点击
    这是一个创建于 2531 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个需求是这样的。

    之前的提交记录如下:

    commit0 --》 commit1 --》 commit2 --》 commit3

    现在发现 commit1 这个位置需要做一些修改, 但是其他的 commit 我不打算修改。我想将 commit1 修改完重新生成一个 log ,但不影响其他位置的 commit ,完成后效果如下:

    commit0 --》 commit1_new --》 commit2 --》 commit3

    之所以需要这个需求,是因为需要做一个文档类的东西,每一个 log 是每章节的内容,提供给其他人浏览学习。

    不知道这样的需求可以用什么方法满足。菜鸟谢谢大家。

    13 条回复    2017-04-24 23:00:41 +08:00
    zxq1002
        1
    zxq1002  
       2017-04-24 07:53:07 +08:00 via Android
    rebase -i
    Biwood
        2
    Biwood  
       2017-04-24 08:12:21 +08:00 via Android
    先把 commit1 撤销掉(git revert commit1),然后重新添加 commit1 里的改动以及你要修改的地方。这样会生成两个新的提交,之前的记录都不会受影响。
    Jakesoft
        3
    Jakesoft  
       2017-04-24 08:15:34 +08:00 via iPhone
    @Biwood no ,需求不是这样的
    Jakesoft
        4
    Jakesoft  
       2017-04-24 08:18:27 +08:00 via iPhone
    我的想法是,创建两个分支,然后在原来的分支 reset 到 commit0 ,然后提交 commit-new ,然后从其他分支“变基”过来或者 cherry-pick 剩余的 commit
    ProjectAmber
        5
    ProjectAmber  
       2017-04-24 08:19:48 +08:00 via iPhone
    git rebase -i <SHA1 of commit0>
    对 commit1 选择 edit
    编辑
    git commit --amend
    git rebase --continue
    ryd994
        6
    ryd994  
       2017-04-24 08:20:15 +08:00 via Android
    你这做不到 hash 一样,最多内容一样而已
    因为 hash 的一部分包括了 parent 信息
    mahone3297
        7
    mahone3297  
       2017-04-24 09:25:27 +08:00
    1 楼已经回答了。。。
    sagaxu
        8
    sagaxu  
       2017-04-24 09:39:46 +08:00 via Android
    这样太麻烦了,每次修改都要更改 commit history , git 就不适合做这个事情
    jixiangqd
        9
    jixiangqd  
       2017-04-24 09:51:18 +08:00
    二楼才是比较好的解决方案,不会造成与远程冲突,不会有持续性蛋疼
    sagaxu
        10
    sagaxu  
       2017-04-24 09:53:58 +08:00 via Android
    @jixiangqd 他是当文档用的,你不能把第二章写第五章的后面吧, revert 还会产生无用的章节,之前旧的章节也还在
    chairuosen
        11
    chairuosen  
       2017-04-24 09:57:57 +08:00
    为什么不打 tag??
    jixiangqd
        12
    jixiangqd  
       2017-04-24 10:27:11 +08:00
    @sagaxu 好吧,确实像你说的 git 根本不适合干这
    SoloCompany
        13
    SoloCompany  
       2017-04-24 23:00:41 +08:00
    你应该通过手段修改项目目录架构,使得每一个章节都是一个独立的文件

    至于让 commit log 和章节直接对应上,当然可以啊,写个脚本把所有文章从头到尾 commit 一次就可以了

    但你这样干的的后果就是直接丢失了所有修订历史,这完全偏离了你使用版本管理系统的初衷

    当然,也有折衷的方案,就是保留两个分支,比如分支 master 就是正常的分支,里面是正常的提交历史,另一个分支 demo 完全是使用脚本自动生成的,每次都会被强行覆盖(也就是没有真正的历史)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2864 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:25 · PVG 22:25 · LAX 07:25 · JFK 10:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.