第十周_T- git commit 整合

137 阅读4分钟

我们在开发中会遇到很多情况就是:我一个功能/bug 改了很多次,但是由于自己的自信(失误)改一次就 commit 一次,甚至于 push 一次。那么其实我们只改动了一个地方,但是我们的 commit 却有 7、8 个,显然这不是我们想要的,我们只想要基于当前 bug 的一次 commit 即可。
接下来就是我遇到的整合 commit 的情况:

修改最新提交的备注

当我们提交之后,回看发现备注的内容不太对,容易引起误解,我们需要调整的时候。就会用到:

比如这里的 commit message 是 1 commit。但是我想改成:first commit

# 对最新一次的 commit 备注进行修改
git commit --amend 
# 回车后,会弹窗,类似一个 vi 框,然后可以自由修改。下面截图是修改后的

修改以前提交的备注

比如我提交了两个 commit 。如果想修改第二个提交:直接 git commit --amend 即可。

如果想修改第一个提交呢?这里会使用到一个「变基」操作:git rebase。

如上图,我想修改 first commit 的提交为 1 commit。

首先,我们需要找到 first commit 的父 commitId

git cat-file -p commitId :查看一个 commitId 的内容

注意:是 cat-file 连着写的

# -i:交互式界面
git rebase -i eaed4aced81884c602ca3fa5675256c18a9b95ed

其实这里只需要将 pick 换成 r 即可。然后回车,会在此弹窗让你修改 commit message 的

  • p, pick = use commit #表示直接使用
  • r, reword = use commit, but edit the commit message #表示文件保留,只修改commit的message

这是我图中圈出来的两行命令注释。

最后 git log 验证,commit 内容是否修改。

成功修改!完美!

Tip:那么这里有人说,如果我想修改第一个 commit 呢,这可没有 parent commitId

直接使用 root 参数即可:

git rebase -i --root 

连续多个 commit 整合为 1 个

我想把下面的 1/2/3 commit 整合为一个 commit ,让分支看起来更清爽。

# 展现 4 个 commit (因为我只想要合并 3 个commit)
git log -4 
# 这里的 commitId 是第 4 个commitId
git rebase -i commitId
1 
2
3
4 (最新的 commitId)
# 将新的写成 s ,其他不变 

这里的展现顺序和我们提交的顺序刚好相反。

将后面两个写成 s 。第一个 pcik 不变。然后回车,重新编辑 commit 内容即可

s, squash = use commit, but meld into previous commit #表示文件不变,然后 commit message 合并到其他的commit

不连续的 commit 整合为 1 个

和上面连续的类似操作

# 查看 commitId
git log 
# git rebase
git rebase -i commitId
# 把想要保留的 commit 留下,前面 pick 不变,其他需要合并的移到最下面,并换成 s
pick xx
pick xx
s xx
s xx 
如果是中间的几个:
# 指定一个区间(注意左开右闭)
git rebase -i (start,end]
1
2
3
4
# 比如我希望合并 2/3 
git rebase -i 4 2
# 然后下面的改成 s
# 保存之后会自动生成一个临时分支

# 此时,我们需要基于这个临时分支,新建一个分支
git checkout -b tmp
# 再切换到我们开始的开发分支,再合并下这个 tmp 分支即可
git rebase tmp 
    

总结

# 本次主要学习以下的内容:
git commit --amend

git cat-file -p commitId
    
git rebase -i commitId

# 额外学习/复习的内容:
git log -4 # 展示四个 commit
git log --graph # commit 用线连接
git log --oneline --graph # 和上面一样,不过只展示 commit 的标题

#-a 会先把所有已经track的文件的改动`git add`进来,然后提交(有点像svn的一次提交,不用先暂存)。对于没有track的文件,还是需要执行`git add <file>` 命令。 
git commit -a -m 'xx' 

# 如果使用 git rebase 冲突了,使用下面的命令就取消了这个操作(git 也会提示你的)
git rebase --abort 

# 本地分支重命名
git branch -m 'xxx'

# 远程分支重命名
git push -u origin 'xxx'

# 显示你上面所有的命令操作「Linux 命令」。git bash 允许用户在 Windows 操作系统上使用 Bash shell 和大多数标准 Unix 命令。 
history