git 修改tag 备注_【Git】第十二章:Git高级实战技巧

1、查看不同版本之间的代码差异

短SHA-1值

使用git命令来代表某个commit时,我们不一定就是要用40位完整的SHA-1 hash值,也可以只是提供hash值的前几位就可以了,至少要4位以上,同时在git仓库中就这前几位可以唯一定位一个commit就ok。一般会选择前7位。

版本回退:

git  reset  hash值

git  reset  --hard  hash值参数--hard,直接把工作区的内容也修改了,不加--hard的时候只是操作了暂存区,不影响工作区。

看一下某个commit的具体信息:

git  show  hash值

查看某个分支指向哪个master

分支实际上就是一些指针,所以分支是指向commit的,也可以直接用分支名称来指代它目前指向的那个commit

git  show  master,就可以查看master分支指向的那个commit

选择历史版本的特殊语法

git show HEAD^

git show HEAD~2

HEAD,指针,指向的是当前的那个分支,当前的那个分支又是指向某个commit

HEAD,就可以指代当前你所处的那个commit对应的版本

HEAD,就是说,HEAD对应的commit的上一个commit,HEAD^,上两个commit,HEAD^,上三个commit

HEAD~5,就是说HEAD之前的第5个commit

比较两个分支之间差了哪些commit还没有合并

git  diff:工作区和暂存区

7ccfd66807c83325333966f388cf4095.png

git  diff  --cached:暂存区和仓库

c5c02ea713be62bd1e0cff39835b333f.png

git  diff  HEAD:工作区和仓库

9e8a8a0e865ae0480e4d16933b0b931a.png

git  diff   分支1  分支2:两个分支之间的差异

5457689b05b03e05a3b4a163088a4aa5.png

git  diff  HEAD  HEAD^:最近两次提交之间的差异

10d9f6a11c54872ae6a3ee8a2cec293d.png

gitlab进行分支代码对比:

97d06b755af4f5c9125f9816eaf1fbe0.png

2、将暂存区里边的功能代码分为多次提交

我们把很多天的代码都提交到了暂存区了,如何将暂存区的内容分为多个commit来提交?

8454cd64426f4f140d6b80f51a8131d4.png

1. git add -i 进入交互模式

2c3e2f1eedd5fd15e0336d332c5ced84.png

2. 输入 3  使用revert 从暂存区挪出来    update 是放入暂存区

7e0d60896973e3f9a4a814e63a286f28.png

3. 选择你想要挪出来的文件  选中之后前面就会被标上 *

2bd4db04650c8edddc980e70ae56e9c4.png

还可以继续标。

4. 回车输入7退出  再查看状态test.txt变成没有了被追踪的文件

3081ea166e062d4c0869b00f0214a711.png

3、开发中途要切换分支又不能commit

强行切换git是不允许切换的。

91b2bc054efa5308fd42ae04b815ef22.png

执行 git  stash

00e306a6078c8cbf45d93b2cf8123147.png

这个命令执行完后,发现工作区的代码恢复到干净的状态,好像什么都没改过。然后等到其他的分支任务干完之后,再切换回来。

执行 git stash list  

查看有哪些stash

dc6e04a883f560dbdc62bb0e4a6b3603.png

恢复git stash apply  或者是 git  stash apply  stash@{0}

注意:git stash apply 默认恢复最新版本即:stash@{1}

删除stash

git  stash  drop  stash名称  

git  stash  -u  --include-untracked

git  stash 默认是将工作区modifyed 状态的文件暂存起来,对于untracked file文件,git stash 这个命令是不能进行暂存的!不过对于只有新增文件,是可以进行切换分支的。

dece86a6822f29dcd905b9259bb0a0ac.png

如果你想将 untracked 文件也进行暂存起来,需要执行 git  stash  -u  --include-untracked

25949fa69d49c3d3a3c586372049aebf.png

4、针对本地不规范的commit进行修改

当我们已经本地执行了commit,但是还没有push到远程仓库,这个时候发现我写的备注不符合规范,那么此时可以进行如下操作:

1、修改最新一次commit,执行git commit --amend

这里进行修改你的最新一次提交的备注,然后保存退出。

e6c46e032351d25e7cd90dd6290d978e.png

注意对比修改前后commit的hash值变了。说明git给重新生成了一个commit。

2、对历史上的多个commit进行修改,dd执行 git  rebase  -i   HEAD~2

4912487437a31bf29631e382ab2bcb14.png

将要修改的 commit 前边的 改成 edit

1c3d016a4a814211f243007b03f84566.png

保存退出:

6fb3dd9f7779f2c0eb309e19a9504e9f.png

执行 git  commit  --amend 可以修改注释

再继续修改下一个commit要执行  git rebase --continue

823d59c36f09bc6f1c0f0a570b1d130c.png

3、删除某个commit

执行:git rebase -i HEAD~2

d155c6370c1fe827bdac5b2ec8a421ab.png

直接删除掉不想要的commit那一行再保存即可。

注意:要至少保留一行哦!否则都生效。

3025582f7bd44b1ad05983a8a6dccb4d.png

e108ab348d55963e85c84459c6540fdc.png

4、多个commit合并为一个commit

假如你最近的这两个commit 要合并成为一个commit,执行:

git  rebase -i HEAD~3    记住往前要多增加一个commit

然后将你想合并的commit 前边变成  squash,保存后添加合并后的注释,就会自动将其保存为一个commit。

79f707049909eebb676b70d128b8f554.png

b40270b231c77ef5a26e037f7f2c9e1e.png

2e6cf352b01390e74ee3db816cb09f38.png

5、好几天的代码一次性commit了,如何进行拆分?

git  rebase  -i  HEAD~3    将你想改的那个commit 前边变成 edit

3b58e4fab22ff01013888e59c3b7962f.png

再执行 git reset  HEAD^   就会回退回去了

8848c15ccf270bf2be2ea9392d9d9428.png

也可以直接使用

git   reset  --hard  HEAD^

21eb5ef538a46d46a9f2b961f6455162.png

然后再一点一点的提交,使用命令:

git  add  文件名

5、对本地做出的修改、暂存和提交进行撤回

对于比较少的文件修改执行  git  checkout  文件名

对于修改了很多的文件,直接执行 git  reset  --hard  HEAD

参数--hard,直接把工作区的内容也修改了,不加 --hard 的时候只是清除了暂存区,不影响工作区。

6、远程和本地同时撤回本地远程分支合并操作

1、当执行merge操作时候,发生了冲突,不想merge了,该怎么办?

执行命令:git  merge --abort

5d5498a7f168b6d2bcef494c8cc86af2.png

注意:合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。

2、当merge已经执行成功了,但是想回退,怎么办?

git   reset  --hard HEAD^

3、如果merge 成功并且推送到远程仓库,那么想回退怎么办?

首先在你想回退的分支本地执行 git revert -m 1 HEAD

8c359103f8362d3c79866b7a82411981.png

这个不是说指针回退而是重新创建了一个新的commit,这个新的commit对应的版本跟之前合并之前的commit是一样的。

然后执行  git push origin master    这就可以将远程的分支进行回退版本了。

9cce202ccb2d667b0307ac19e0062e3c.png

4、当过一段时间,你还想把之前的版本重新merge到master,这个时候你会发现master执行merge已经没用了,此时该怎么办呢?

1、git rever HEAD  回退到merge之后的状态。

2、再次执行merge合并feature/001的代码到master

3、然后执行push

git push origin master

7、二分查找定位commit的线上bug

9ca1e739d9f459caf212d77f79edb2ea.png

1、首先开启二分查找

git  bisect start 或者 git  bisect  start  [终点提交hash值] [起点提交hash值]6c92f067cddaba56b11564df27bde489.png

2、标注当前的commit 是有bug的

git  bisect  bad  hash值

3、可以用tag来标注某个tag或者commit hash值之前是好的

git bisect  good [tag值]/[hash值]

表示说1.0 tag版本之前是好的。

4、查看当前的版本是否有bug,如果没有bug,执行 git bisect  good,会继续进行二分查找。
5:测试到此时,执行测试代码进行bug复现,发现bug找到了,执行git  bisect bad.
6:   以此类推,直到找到最后一个commit,认为就是这个commit开始引入的bug。
7:执行 git  bisect reset 恢复之前的状态

87e2973a33b439926c2d557b61dec56d.png

8、团队拆分迁移项目时简化提交历史

场景:

之前的项目现在要拆成两个项目,供给两个团队使用。有个注意事项就是把之前的提交历史给抹掉,让新团队接受的代码只有初始化的提交历史。

步骤:
1、创建一个项目wileeProject2

bae88c61b50ab65c3e4ecded90731e99.png

2、清空提交历史 git rebase --onto A B C。

echo '基于当前commit hash创建一个不在当前分支上的一个新的commit' | git commit-tree 基准commit的hash^{tree}

git rebase --onto A B C

39d1aa4990dc07776d995d8dcbf72d6a.png

低阶命令:echo '合并历史数据通过之前的项目' | git commit-tree 基准commit的hash^{tree}

(下面涉及的命令详解在Git内幕原理中)

命令作用:

基于当前hash的commit提供的树对象创建一个新的commit,此commit不属于任何分支,然后返回新的提交对象id到控制台。

5f536a6ad7e39dae24138f66288d52b1.png

b1cffc9023d7a8008a57b25da8f80f4c.png

命令:git branch -r --contains COMMIT_ID

命令作用:

此命令用于查看commit_id属于哪一个分支。

命令:git rebase --onto A B C  中ABC三者代表的含义:

A : 是一个分支名称(代表此分支的 HEAD)或者是一个 commit_id (此 id 不在 C 上)

B : 一个分支名称(此分支与 C 有共同的祖先 commit)或者是一个 commit_id (此 id 在 C 上)

C : 一个分支名称

命令的作用:

1、首先会执行 git checkout 切换到 C分支上面

2、将 B 到 C(HEAD) 之间所标识范围内的提交写到一个临时文件中 ,若B 为分支名称,则找 B 与 C 共同的祖先 commit,为此次 commit 到 C(HEAD) 之间所标识范围内的提交。

3、将当前分支强制重置(git reset --hard)到 A

4、从2中临时文件的提交列表中,一个一个将提交按照顺序重新提交到重置之后的分支上

3、推送到远程项目wileeProject2

git remote remove origin

git remote add origin git@192.168.31.38:root/wileeproject2.git

cbc3667ea3cf7e6bf5ee77a6947ade43.png

9、如何将新版本的功能放到上一个版本提前上线

git  cherry-pick  feature/002  29a3c4c  

其中29a3c4c这个commit hash值就是 feature/002分支中的一个commit hash值。

0bc75780d7f2b6a18935304074eb65bb.png

该命令意思:

将代码某个commit转移到另一个分支

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值