将几个commit压缩成一个
git log
git rebase -i HEAD~3
(假设你之前有三个提交)在打开的文本编辑器中,你会看到列出的提交,默认情况下每行都以
pick
开头。要合并提交,你需要将除了第一个提交之外的其他提交前面的pick
改为s
或squash
。这表示你想要将这些提交合并到它们上面的提交中pick e3a1b35 第一个提交 s 7c3d2c4 第二个提交 s 4d3e4f5 第三个提交
Git 会打开一个新的编辑器窗口,让你编辑一个新的提交信息,这个信息将用于合并后的提交。这里你可以输入一个新的提交信息,描述这几个提交的整体更改,或者保留其中一个提交的信息。
注意:rebase会导致新的commit节点产生,所以切记不要对多人共用的远端分支进行rebase。
git rebase -i
的命令选项:
# 命令说明:
# p, pick<commit> = 使用指定的提交(commit)
# r, reword<commit> = 使用指定的提交(commit),但编辑提交信息
# e, edit<commit> = 使用指定的提交(commit),但在继续之前修改提交内容
# s, squash<commit> = 使用指定的提交(commit),但将其与前一个提交合并
# f, fixup<commit> = 类似 "squash",但丢弃此提交的日志消息
# x, exec<command> = 使用 shell 运行命令(行中的其余部分)
# d, drop<commit> = 移除指定的提交(commit)
# l, label<label> = 用一个名字标记当前的 HEAD
# t, reset<label> = 将 HEAD 重置到一个标签(label)
# m, merge [-C<commit> | -c<commit>]<label> [# <oneline>]
# . 使用原始合并提交的日志消息(如果没有指定原始合并提交,则使用 oneline)创建一个合并提交
# . 使用 -c<commit> 选项可以重写提交信息
找回丢失的commit节点或分支
git reflog
查看你的 Git 操作历史,包括提交、重置、合并等操作。这个命令会列出你的 HEAD 指针最近指向的历史,帮助你找到要恢复的提交的哈希值。
git reset --hard [哈希值]
注意:这个操作是不可逆的,它会丢弃自那个提交以来的所有更改。
git log
查看当前的提交历史,确认你已经成功恢复到了期望的状态。
获得一个干净的工作空间
git status
查看当前的工作目录和暂存区状态,了解哪些文件被修改或未跟踪。注意:用
git reset --hard HEAD
或git checkout -f
来恢复干净工作目录,但这两个操作都会丢失文件,不符合我们使用版本控制的初衷,不推荐。git stash push -u
仅仅是临时清理工作目录和暂存区的更改,将它们保存在 Git 的 stash 中,而不是永久删除。这意味着你之前的工作目录的更改还是存在的,只是被临时保存起来了。当你需要恢复这些更改时,可以通过
git stash pop
或git stash apply
命令来恢复它们到工作目录中。如果后面发现这部分变更是需要的,可以执行
git stash pop
或git stash apply
来恢复。
修改最近一个commit
git log
git show HEAD
git add [修改的文件]
命令将这些文件暂存。如果想要暂存所有修改过的文件,可以使用git add .
。git commit --amend
命令修改最近的提交。这个命令会打开你的默认文本编辑器,允许你修改提交消息。如果你不想修改提交消息,可以直接保存并关闭编辑器。这个命令不仅可以修改提交消息,还可以将新暂存的更改添加到最近的提交中。如果你不想修改提交消息,可以添加
--no-edit
选项来保留原来的提交消息。git commit --amend --no-edit
注意:
git commit --amend
会替换最后一次提交。如果这个提交已经被推送到远程仓库,你将需要强制推送(git push --force
),这可能会影响其他协作者。因此,只有在确定没有其他人基于这个提交工作时,才应该使用这个命令。
下面这些命令也是比较实用的命令,感兴趣的同学可以自己学习一下。
git bisect
二分查找出现问题的变更节点,比如你发现当前提前下测试是不通过的,但HEAD~10(10个提交前)的测试是可以通过的,就可以用git bisect
来帮你定位到出现问题的变更点。git blame
查看某行代码最后是谁修改的。git show-branch
直观的展示多条分支间的关系。git subtree
拆分或合并仓库。