git常见操作2-查看历史改动
查看单个文件历史改动
命令行-p选项
12git log -- filename # 不显示具体的改动内容git log -p -- filename # 显示具体的改动内容
比如某个仓库共有如下4次提交历史:
12345$ git log --oneline --all --graph* 841c6cd (HEAD -> master) 同时修改A/B.java* 67aeb5a 修改B.java* e792004 修改A.java* df23fd5 First Commit
其中第一次提交中新增了A.java和B.java两个文件。
如果我们希望查看哪些提交中改动了文件A.java,可以通过如下的命令实现:
123456789101112131415161718$ git log -- A.javacommit 841c6cdf0e944f3b32dd62fbe6ab902454f03733 (HEAD -> master)Author: TerryLikesCoding <18328621355@163.com>Date: Sun Apr 7 16:1 ...
git工具-8-cherrypick
什么是cherry-pick?
cherry-pick是一个强大的Git命令,用于将一个或多个其他分支的提交应用到当前分支。这个命令让你能够选择性地拾取某个分支上的提交(即”樱桃挑选”或"拣选"),而不是通过合并或重置操作引入整个分支的更改。
git 中的cherry-pick类似于对特定的某次提交的变基。 它会提取该提交的补丁,之后尝试将其重新应用到当前分支上。
使用场景
当你想将一个特定的修复从一个分支(如main)应用到另一个分支(如发布分支)时,而不需要引入中间的所有提交。
在处理大型项目时,如果只需要某个分支上的一个小更改而不是整个分支的合并。
在回滚特定的提交时,可以用于将该提交的反向更改应用到当前分支上。
基本用法
pick单个提交
假设我们有如下的提交历史:
12345678MINGW64 /d/tmp/git-playground (ruby_client)$ git log --all --oneline --graph* 43cd18a (HEAD -> ruby_client) 5ddae* 9f671cd e43a6| ...
git工具-6-checkout
检出与重置的区别
和 reset 一样,checkout 也操纵三棵树,不过它有一点不同,这取决于你是否传给该命令一个文件路径。
不带路径检出
运行 git checkout [branch] 与运行 git reset --hard [branch] 非常相似,它会更新所有三棵树使其看起来像 [branch],不过有两点重要的区别:
首先不同于 reset --hard,checkout 对工作目录是安全的,它会通过检查来确保不会将已更改的文件吹走。 其实它还更聪明一些。它会在工作目录中先试着简单合并一下,这样所有_还未修改过的_文件都会被更新。 而 reset --hard 则会不做检查就全面地替换所有东西。
第二个重要的区别是如何更新 HEAD。 reset 会移动 HEAD 分支的指向,而 checkout 只会移动 HEAD 自身来指向另一个分支。
例如,假设我们有 master 和 develop 分支,它们分别指向不同的提交;我们现在在 develop 上(所以 HEAD 指向它)。
123$ git log --all --oneline --graph* ...
git工具-5-重置揭密
git中的三颗树
理解 reset 和 checkout 的最简方法,就是以 Git 的思维框架(将其作为内容管理器)来管理三棵不同的树。 “树” 在我们这里的实际意思是 “文件的集合”,而不是指特定的数据结构。 (在某些情况下索引看起来并不像一棵树,不过我们现在的目的是用简单的方式思考它。)
Git 作为一个系统,是以它的一般操作来管理并操纵这三棵树的:
树
用途
HEAD
上一次提交的快照,下一次提交的父结点
Index
预期的下一次提交的快照
Working Directory
沙盒
HEAD
HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点(父提交)。 通常,理解 HEAD 的最简方式,就是将它看做你的上一次提交的快照。
比如:
123456MINGW64 /d/coding/git-playground (master)$ git log --all --oneline --graph* ce592c7 (HEAD -> master) 剔除误提交的文件* ddfa328 删除误提交 ...
git工具(2)--重写历史
修改最后一次提交
仅修改提交信息
假设修改前的git日志如下:
1234$ git log --oneline5e5996c (HEAD -> master) 修改b.java 6cce2144 修改b.java 5...
如果我们只是希望修改最后一次提交的提交信息,我们可以通过如下的方式进行修改:
1234$ git commit --amend -m '修改B.java文件:删除无用的import语句'[master 055cda3] 修改B.java文件:删除无用的import语句 Date: Mon Apr 1 10:39:09 2024 +0800 1 file changed, 1 insertion(+)
此时再次查看git日志:
1234$ git log --oneline055cda3 (HEAD -> master) 修改B.java文件:删除无用的import语句cce2144 修改b.java 5...
可以发现,之前旧的提交对象5e5996c被新的提交对象055cda3覆盖,并没有增加新的提交对象。
修改提交的文件快照
如果你 ...