git-使用命令笔记

场景1:

​​​​​​​
    当前在分支A进行代码开发,但是突然因某个问题,需要切换到B分支进行问题修改,但是此时直接切换到B分支,会报错abort中断信息,因为本地有未commit的的代码修改,必须要commit之后在进行切换。如果直接进行commit临时提交了在切换分支,那么会多一条无效commit记录,如果想通过提交记录来排查问题,那就有点困难了,压根不知道提的代码是否有用了。如果没有对应黑历史记录,那么有时候可以很快的通过提交记录来定位对应的问题.有个好的命令解决对应的黑历史记录问题,如下stash命令:(当然可以强制切换)


1> stash命令集锦

# 保存当前未commit的代码
git stash

# 保存当前未commit的代码并添加备注
git stash save "备注的内容"

# 列出stash的所有记录
git stash list

# 删除stash的所有记录
git stash clear

# 应用最近一次的stash
git stash apply

# 应用最近一次的stash,随后删除该记录
git stash pop

# 删除最近的一次stash
git stash drop


  当如果存在多条stash记录时,可以使用如下命令,指定要使用某个记录

 [root@localhsot my-jwt ]# git stash list
stash@{0}: On jwt_1.1: 增加性别sex字段
stash@{1}: WIP on jwt_1.1: 06369cd 增加address字段


使用第2条记录

git stash apply stash@{1}


2>使用举例:

[root@localhsot my-jwt ]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        model/user.go
Please commit your changes or stash them before you switch branches.
Aborting

[root@localhsot my-jwt ]# git stash 
[root@localhsot my-jwt ]# git checkout master


场景2:

​​​​​​​当不消息进行了一次commit,之后发现某个东西没有修改,又要重新修改,add之后再重新commit,那么提交记录有多了,另外,有时候可能将不同的问题,当作一个记录直接提交了,那么在想通过commit排查问题,就变得比较困难了。这种不规范的提交无形中增加后续排查问题的难度.怎么处理呢?通过reset命令可以很好的解决该问题。如下所示:


1> reset命令使用

# // 恢复最近一次的commit记录
git reset --soft HEAD^


2>使用举例
例如,最近一次commit记录为:增加sex字段

[root@local my-jwt]# git log  
commit 7c41e10cd0a0e5c3240aa26f11a687e7782df9fb (HEAD -> jwt_1.1)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:36:45 2022 +0800

    增加sex字段
    
commit 06369cd2176f3a22482dbb3a5bb5d1b335067361 (origin/jwt_1.2, origin/jwt_1.1, local_jwt, jwt_1.2)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:01:38 2022 +0800

    增加address字段


3>撤销最近这次的commit

git reset --soft HEAD^
[root@local my-jwt]# git reset --soft HEAD^
[root@local my-jwt]# git log               
commit 06369cd2176f3a22482dbb3a5bb5d1b335067331 (HEAD -> jwt_1.1, origin/jwt_1.2, origin/jwt_1.1, local_jwt, jwt_1.2)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:01:38 2022 +0800

    增加address字段

commit 1d1d1253b329d39aefef5af792faaa779e8d8a14 (origin/master, master)
Author: cloudlx <cloudlx@qq.com>
Date:   Wed Jan 19 17:25:08 2022 +0800

    add model


如上2中的commit经过3中的处理已经撤销了最近一次的commit,可以重新编辑处理之后在进行commit.注:以上的撤销,主要是针对commit之后,尚未push的处理。如果已经push,如上命令仍旧生效,但是在此push时,因为远端分支跟本地分支已经有差异了,需要在push时添加参数-f,进行强制push.来覆盖远端已经存在的代码


4> --soft也可以指定commit号进行撤销,该操作会将该commit一直到最近的一次commit全部撤销,而非仅仅是撤销指定的commit号。


例如:指定倒数第二条commit进行撤销

[root@local my-jwt]# git log
commit 292167481d34690a47bb459a10c6532362e18cf4 (HEAD -> jwt_1.1)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:49:05 2022 +0800

    增加sex字段

commit 06369cd2176f3a22482dbb3a5bb5d1b335067361 (origin/jwt_1.2, origin/jwt_1.1, local_jwt, jwt_1.2)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:01:38 2022 +0800

    增加address字段

commit 1d1d1253b329d39aefef5af792faaa779e8d8a14 (origin/master, master)
Author: cloudlx <cloudlx@qq.com>
Date:   Wed Jan 19 17:25:08 2022 +0800


撤销commit号:06369cd2176f3a22482dbb3a5bb5d1b335067361, 增加address字段。

[root@local my-jwt]#  git log
commit 06369cd2176f3a22482dbb3a5bb5d1b335067361 (HEAD -> jwt_1.1, origin/jwt_1.2, origin/jwt_1.1, local_jwt, jwt_1.2)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:01:38 2022 +0800

    增加address字段

commit 1d1d1253b329d39aefef5af792faaa779e8d8a14 (origin/master, master)
Author: cloudlx <cloudlx@qq.com>

commit 1d1d1253b329d39aefef5af792faaa779e8d8a14 (origin/master, master)
Author: cloudlx <cloudlx@qq.com>
Date:   Wed Jan 19 17:25:08 2022 +0800

    add model


如上例表中,发现,当前的HEAD到了 增加address字段记录,最近的增加sex字段的修改内容都回到了暂存区.

场景3:

有时候版本的一些优化需求开发到一半,可能其中某一个开发完的需求要临时上,或者某些原因导致待开发的需求卡住了已开发完成的需求上线。这时候就需要把 commit 抽出来,单独处理。再者有时候开发分支中的代码记录被污染了,导致开发分支合到线上分支有问题,这时就需要拉一条干净的开发分支,再从旧的开发分支中,把 commit 复制到新分支。


1>cherry-pick命令使用将源分支的某个提交复制到当前分支
源分支

[root@local my-jwt]#  git log
commit 06369cd2176f3a22482dbb3a5bb5d1b335067361 (HEAD -> local_jwt, origin/jwt_1.2, origin/jwt_1.1, jwt_1.2, jwt_1.1)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:01:38 2022 +0800

    增加address字段


目标分支

[root@local my-jwt]#  git log   
commit 1d1d1253b329d39aefef5af792faaa779e8d8a14 (HEAD -> master, origin/master, local_jwt)
Author: cloudlx <cloudlx@qq.com>
Date:   Wed Jan 19 17:25:08 2022 +0800

    add model

commit 02b755f97531a7e5cb8e7f3824f8812e3edbc6f4
Author: cloudlx <cloudlx@qq.com>
Date:   Wed Jan 19 10:16:55 2022 +0800

    add file


chery-pick之后,目标分支

[root@local my-jwt]# git cherry-pick 06369cd2176f3a22482dbb3a5bb5d1b335067361
[master fc2c5d3] 增加address字段
 Date: Mon Aug 1 17:01:38 2022 +0800
 1 file changed, 1 insertion(+)

[root@local my-jwt]#  git log
commit fc2c5d37d3923c8784f30ba0e5127c027191b13e (HEAD -> master)
Author: cloudlx <cloudlx@qq.com>
Date:   Mon Aug 1 17:01:38 2022 +0800

    增加address字段


 *** 合并后,commit号是不一样的,但是提交的时间记录信息都是一样的2>commit号可以一次跟多个,或者使用区间方式

git cherry-pick commit1 commit2  ...

// 区间
git cherry-pick commit1^..commitn   // 直接拷贝1..n之间的所有提交记录{都是commitHash码号}


注:在进行多个commit复制是,可能产生冲突,如果产生冲突,解决冲突之后,再提交到暂存区,之后再通过

git cherry-pick --continue // 继续后面的合并.

另外,有时候,可能需要终止复制,通过如下命令,回到复制前的状态,表示什么操作都没发生过

git cherry-pick --abort

复制了一部分,后面的不想复制了,可以直接退出该操作,本地分支保留已经  `cherry-pick`  成功的 commit,后面未改变,直接退出.

git cherry-pick --quit

场景4:

因疏忽再其他人分支提交了代码还推到远程分支,这时因为分支只有你的最新提交,就想着使用 reset --hard,结果紧张不小心记错了 commitHash,reset 过头,把别人的 commit 搞没了。没办法,reset --hard 是强制回退的,找不到 commitHash 了


1>reflog命令 

 

分支记录如上,想要 reset 到 b。

误操作 reset 过头,b 没了,最新的只剩下 a。

 

再次 reset 回去,就会发现 b 回来了。 场景5,:开发上线的功能有问题,需要马上撤回,否则会影响到系统使用。这时可能会想到用 reset 回退,但是最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了。该种情况如果仍旧使用 reset,那么将别人的提交的代码也还原的问题。如下使用合理的处理方式:
现状:
    

commit 45d8ce465eb054db5d97d03282bae7489f4c029f
Author: cl_2 <cl_2@qq.com>
Date:   Tue Aug 2 11:14:45 2022 +0800

    bbb

commit 20e67099a898a3e246dcd48eb6730e796ec8bc91
Author: cl_0 <cl_0@qq.com>
Date:   Tue Aug 2 10:59:20 2022 +0800

    add wwwwwww字段信息


现在要撤销 wwwwwww字段信息的提交记录,操作如下:

git revert 20e67099a898a3e246dcd48eb6730e796ec8bc91

会进入到一个可以编辑的界面,如下:

Revert  "add XXXX"
This is reverts commit 20e67099a898a3e246dcd48eb6730e796ec8bc91

# Please enter the commit message for your changes .Lines starting
# Changes to be committed
#       modified   cli.go
#
:wq

进行wq保存退出之后,会打印出撤销的修改信息:

[root@local]# git revert 20e67099a898a3e246dcd48eb6730e796ec8bc91
[jwt_1.2 1jsfk3] Revert "撤销 add XXXX"
 1 file changed, 1 deletion(-)
[root@local]# git log
commit 20e67099a898a3e246dcd48eb6730e796ec8bc91
Author: cl_0 <cl_0@qq.com>
Date:   Tue Aug 2 11:59:20 2022 +0800


    Revert "撤销 add wwwwwww字段信息


commit 45d8ce465eb054db5d97d03282bae7489f4c029f
Author: cl_2 <cl_2@qq.com>
Date:   Tue Aug 2 11:14:45 2022 +0800

    bbb

commit 20e67099a898a3e246dcd48eb6730e796ec8bc91
Author: cl_0 <cl_0@qq.com>
Date:   Tue Aug 2 10:59:20 2022 +0800

    add wwwwwww字段信息      

如上图,新成一条commit记录,并且修改文件撤销。旧的消息记录仍记也会存在。

场景5:创建空白分支

如何创建一个空白的分支,用于添加新代码进行提交

1. git checkout -h 查看有个参数为 --orphan
 $ git checkout -h
    .....
     --orphan  <new-branch>
    .....
2.创建一个空白分支具体步骤如下:
 $ git checkout --orphan  new_branch   // 该分支为一个全新的分支,且不会携带任何分支的记录。
 
 $ git rm -rf .   // 将当前分支下从其他分支切换过来的文件全部清空。

 $ echo "add new branch" >> README.md  // 添加一个readme,空百分之不允许推送到远端

 $ git add README.md 
 
 $ git commit -m "add new branch"

 $ git push origin new_branch

场景6: 私有仓库管理分支跟公有仓库

为了让公有仓库比较方便管理,避免实际开发中,存在个人为了合并代码推送的分支,为了让公仓干净清爽。所有采用私有跟公有仓库进行开发关联。

1.fork公有仓库

  从公有仓库中fork一份当前公有仓库的所有分支,再git主界面直接点击fork即可。

2.克隆私有仓库至服务器

3.关联私有仓库至公有仓库提,添加主仓库url

命令结构:  git remote  add  自定义关联的主仓库名称  主仓库对应的git-url地址


 4.开发前先从对应的主仓库分支拉取代码:

命令格式:git pull 自定义主仓库名 主仓库对应的分支

 此时本地仓库分支跟主仓库分支代码保持一致。当开发完成,测试完成后,提交代码带个人仓库分支,再从git上创建cr请求,再合并到主仓库对应分支即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值