现在接到了一个任务1,你创建了一个task-1分支去开发(为什么没有直接在master上进行开发。如果你开发了一段时间后,此时又插入了一个任务2这时该怎么办?怎么把开发到一半的任务A从master分支暂时拿出去?)。之后经过多次提交你才完成该任务,此时你需要提交你的代码到远程仓库上去,你该怎么做才能使得master分支上的提交历史比较整洁呢?
我设想的几个方案不知道
有没有其他更好的方法
在当前分支(task-1)上创建一个新分支(task-1-to-commit)
git checkout -b task-1-to-commit
在task-1
上有许多在console.log
用来调试和查看结果,在task-1-to-commit
上都注释掉或者删除(这里不是我们考虑的重点,我们也可以在task-1
上直接注释掉或者删除)
为什么不直接在task-1上直接注释掉或者删除呢?之后出现问题的时候我可能还需要这些console
找到出现的原因(其实我还有另一个疑问,在上线时这些console.log
有必要删除吗?)
然后我使用git rebase -i
命令,将这些在完成任务1所创建的commit
压缩成一个commit
(这个任务的提交历史依然可以在task-1
上看到,但是我希望在master
分支上只有最终的一个结果)。
git rebase -i
拉取远程仓库的代码并合并
这里使用git pull
和git pull --rebase
应该没有什么差别,并没有直接在master
上开发。
git pull
将task-1-to-commit
变基到现在的master
上
git rebase master
此时可能需要手动解决一些冲突,解决完冲突
git add -A
git rebase --continue
master
分支合并task-1-to-commit
分支
此时采取的合并策略为快速推进
git merge task-1-to-commit
推送
git push
拉取远程仓库的代码
git pull
挑选task-1
的commit到当前的master分支上
git cherry-pick task-1
这里可能显示失败,遇到过一次,也不知道怎么解决。应该是发生了冲突,需要手动解决。
这里我们先在task-1
打个tag
,因为我们需要变换分支的指向,打个tag
可以在我们操作失误的时候找回这个分支
git tag task-1
拉取远程仓库代码
git pull
将task-1
分支定向到master
git checkout task-1
git reset master
这里的git reset master
只改变了工作区的内容
将更改添加到暂存区并提交
git add -A
git commit -m <commit-message>
附:
我上面的操作都是想在master分支上只存在任务1的最终结果,忽略它的提交历史,不知这样做是否合理。还是直接git merge
使得在master
上也可以看到任务1
的提交历史。如果是这样的话,master
分支上的提交历史就不是线性的了,看着有点乱。
在处理分支上的开发工作时,保持master
分支的提交历史整洁是非常重要的。你的几种方案都有各自的适用场景和潜在的改进点。以下是对你提出的每种方案的分析及建议:
优点:
git rebase -i
可以很好地将多个提交压缩成一个,使得master
分支的提交历史更加清晰。task-1-to-commit
分支,你可以在不改变task-1
分支历史的情况下,为master
准备整洁的提交。潜在问题:
git commit task-1-to-commit
是不正确的命令,应该是git checkout -b task-1-to-commit
来创建并切换到新分支。console.log
的删除问题,这取决于你的团队和项目的规范。如果它们对于调试很有帮助但在生产环境中不应存在,则通常需要在合并到master
之前移除。改进建议:
git checkout -b task-1-to-commit
来创建新分支。console.log
对调试很有用,但你不希望它们出现在master
上,可以考虑在合并到master
之前移除它们,或者使用功能开关来控制这些日志的启用/禁用。优点:
git cherry-pick
允许你选择性地从其他分支提取提交到当前分支,非常适合只合并特定提交的场景。潜在问题:
cherry-pick
时遇到冲突,需要手动解决。此外,如果task-1
分支中有多个相关的提交,而你只cherry-pick
了其中一个,可能会破坏提交之间的逻辑关联。改进建议:
task-1
中的多个提交相互依赖,考虑将它们作为一个整体(如通过rebase -i
压缩后)cherry-pick
到master
。潜在问题:
git reset master
会将task-1
分支的HEAD重置到master
的当前提交,这通常会丢失task-1
上自master
分支以来所做的所有更改。这明显不是你的意图。改进建议:
task-1
的更改合并到master
并保持整洁的提交历史,你应该在master
上创建一个新的分支(比如temp-merge
),然后在这个新分支上使用git rebase task-1
(如果task-1
基于较旧的master
)。解决可能出现的冲突后,再将temp-merge
合并到master
。对于保持master
分支的提交历史整洁,通常推荐使用rebase
来整理特性分支的提交历史,并在合并到master
之前确保所有的console.log
等调试信息已被移除或妥善处理。此外,始终在合并前拉取master
的最新代码,并考虑使用--rebase
选项来避免不必要的合并提交。如果特性分支包含多个相关的提交,使用rebase -i
来压缩它们通常是一个好主意。
其他人可以更好地改写这个问题,但我想做的是: 我一直在做一个长期的主要工作——重构分支B。我一直在定期合并主分支,现在分支B已经领先主分支大约200次提交。我现在准备发送一个拉请求,但是我想清理一下我的提交历史。基本上,我想把我所有的200次提交压缩成3次提交: 提交1=所有被删除的文件 提交2=所有新添加的文件 提交3=所有其他内容,即所有移动/编辑的文件 而且,为了不搞砸,我想在我自己的分支B
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。 针对我们前一章节的操作,使用 git log 命令列出历史提交记录如下: $ git log commit 88afe0e02adcdfea6844bb627de97da21eb10af1 Merge: 14b4dca d7e7346 Author: runoob <runoob
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。 Linux 内核开源项目有着为数众广的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。 到了 2005 年,开发 BitKeeper 的商业公司同 Linux
我们在13.6节介绍过了【查看本地变更历史】,在这一节我们介绍Git查看提交历史记录功能. 跟本地变更历史提供的功能相同,Git查看提交历史记录也都有查看文件、文件夹和代码段的历史记录功能,不同点在于【查看本地变更历史】仅能查看本地的变更,远程的攺动是无法看到的,【Git查看历史记录】可以查看所有commit以后的历史. 因此当你想查看某个文件或文件夹提交的历史记录的时候,可以使用此功能. 一.
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。 接下来的例子会用我专门用于演示的 simplegit 项目, 运行下面的命令获取该项目源代码: git clone https://github.com/schacon/simplegit-progit 然后在此项目中运行 git log,应该会看到下面的输出: $ g