关于 GIT 的一个问题?

2017-04-24 07:25:39 +08:00
 run2016

有个需求是这样的。

之前的提交记录如下:

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

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

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

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

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

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

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

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

当然,也有折衷的方案,就是保留两个分支,比如分支 master 就是正常的分支,里面是正常的提交历史,另一个分支 demo 完全是使用脚本自动生成的,每次都会被强行覆盖(也就是没有真正的历史)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/356872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX