当前位置: 首页 > 知识库问答 >
问题:

git - 如何使master分支上的提历史变得整洁?

诸葛砚文
2024-08-11

现在接到了一个任务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 pullgit 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

方法二

  1. 拉取远程仓库的代码

    git pull
  2. 挑选task-1的commit到当前的master分支上

    git cherry-pick task-1

    这里可能显示失败,遇到过一次,也不知道怎么解决。应该是发生了冲突,需要手动解决。

方法三

  1. 这里我们先在task-1打个tag,因为我们需要变换分支的指向,打个tag可以在我们操作失误的时候找回这个分支

    git tag task-1
  2. 拉取远程仓库代码

    git pull
  3. task-1分支定向到master

    git checkout task-1
    git reset master

    这里的git reset master只改变了工作区的内容

  4. 将更改添加到暂存区并提交

    git add -A
    git commit -m <commit-message>

附:
我上面的操作都是想在master分支上只存在任务1的最终结果,忽略它的提交历史,不知这样做是否合理。还是直接git merge使得在master上也可以看到任务1的提交历史。如果是这样的话,master分支上的提交历史就不是线性的了,看着有点乱。

共有1个答案

卜瀚漠
2024-08-11

在处理分支上的开发工作时,保持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-pickmaster

方法三

潜在问题

  • 使用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