git版本控制器的基本操作

关于git版本控制器

前言:最开始听到git版本控制器是在2021年6月份,当时觉得不重要或者有点麻烦且平时也不大用得到就没有真正的认真的学习过,等到自己想用git的时候每次都要搜博客从创建仓库的命令开始看,结果只是能push就为止了。后来反反复复多次需要使用的时候都不知道如何使用,且面试中基本上都会问到关于git的知识,所以我要系统的学习和使用git

配置git

git config --global user.name "...."#远程仓库的
git config --global user.email "...."

设置个人用户名和邮件地址,之后的每一次提交都会使用这些信息,并且写入到每一次提交中,不可更改

–global选项使全局的,该命令只需运行一次,当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。

免密输入的配置

ssh -keygen -t rsa#生成密钥
ls ~/.ssh

将公钥保存在git上面就可以了

创建仓库

#初始化仓库
git init
#添加文件到暂存区
git add .
#提交到本地仓库
git commit -m "...."
#给远程仓库取别名origin
git remote add origin "仓库地址" 
#将master分支推送到远程仓库
git push -u origin master 

一般的使用

git clone "远程仓库"#此时将远程仓库拷贝过来,已有仓库的
git add .
git commit -m ".."
git push -u 仓库名 + 分支

概念:工作区,暂存区,仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-74HdK1hQ-1647096710222)(C:\Users\HASEE\AppData\Roaming\Typora\typora-user-images\image-20220311123014838.png)]

工作区:就是当前分支,每次操作是在那个分支下就是自己的工作区

暂存区:每次git add操作就是将工作区的文件保存到暂存区中

本地仓库:通过git commit 操作将暂存区中文件保存到本地仓库

git下的文件状态

modified已修改,staged已暂存,committed已提交

将文件从暂存区中删除

git add file//添加到暂存区
git status//查看暂存区状态
git rm --cached file//将文件从暂存区中删除

git commit命令详解

git commit -a -m "..."//添加-a参数会把修改过的问价提交
git commit --amend//把此次提交追加到上一次commit内容里面,会进入到交互式编辑器界面,在里面修改提交的注释

合并提交

git log//查看以往的提交
git rebase -i + 版本号//表示到不要合并的commit 的hash值
/*进入到git交互式编辑器
需要提前将交互式编辑器设置成vi
vim ~/.gitconfig
添加
[core]
	editor = vi

进入编辑器后,支持的操作如下
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
label:用名称标记当前HEAD(缩写:l)
reset:将HEAD重置为标签(缩写:t)
merge:创建一个合并分支并使用原版分支的commit的注释(缩写:m
*/
进行修改

在这里插入图片描述

合并后

在这里插入图片描述

修改commit message

git rebase -i + hash值//进入编辑模式
//注意里面是反序的,所以进入前选择应该是修改的早的hash值
//用reword关键字

然后保存退出即可

如果已保存的提交里有push过的话

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhOyQpvi-1647096710227)(C:\Users\HASEE\AppData\Roaming\Typora\typora-user-images\image-20220311214201144.png)]

就会报错

此时需要强制提交

git push --forse

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6V1aoppy-1647096710230)(C:\Users\HASEE\AppData\Roaming\Typora\typora-user-images\image-20220311214340264.png)]

查看commit的内容

git log
git log --oneline#将每个日志为一行输出
git log -n#只显示前n条日志
git log --skip=n#跳过前面的n条日志
git log -p  #显示一些统计信息以及文件的改动内容和行信息
git log --stat   #显示提交的作者 日期 message 和文件内容统计信息
git shortlog   # 显示每个author提交commit和多少条commit
#按日期
git log --after="2018-7-1" #2018年7月1好之后的所有日志
git log –-before="2014-7-1"
#按作者
git log --author="Dounin"  
#按照提交信息
git log --grep=“issue”  # 按照提交本中是否包含issue的日志
#按文件
git log -- ./src/http/modules/ngx_http_xslt_filter_module.c
#按照内容
git log -S “ngx_free” # 即所有文件中包含了 ngx_free字符串的修改
#按照范围 
git log <since>..<until> # 比如 git log master..feature这可以显示出自从master分支fork之后,feature分支上所有的提交
git show commit-id   # 显示commit-id的提交内容,包括所有文件的修改信息

版本回退

我们本地做了修改,可能是修改文件或者增加目录等等,版本回退就是丢弃当前的修改,后退到之前commit-id的版本中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9vvwMOW9-1647096710232)(C:\Users\HASEE\AppData\Roaming\Typora\typora-user-images\image-20220311221121145.png)]

从上图看出,checkout就是从本地仓库中或暂存区中检出文件覆盖掉当前的文件

git checkout branchs/stable-1.14 #检出到branches/stable-1.14分支上,即用1.14分支的内容覆盖了工作区所有内容
git checkout 9bfbacdd  # 检出到9bfbacdd(commit id)上,即用这个commit 内容覆盖了工作区所有内容
git checkout main.cpp # 从暂存区中检出内容,并且覆盖main.cpp文件内容,即尚未添加到暂存区的修改会被丢弃掉

如果想要删除untrack(未跟踪)的文件

git clean -n #是一次clean的演习,告诉你哪些文件会被删除,记住他不会真正的删除文件,只是一个提醒。
git clean –f #删除当前目录下所有没有track过的文件,他不会删除.gitignore文件里面指定的文件夹和文件,不管这些文件有没有被track过。
git clean -f <path> #删除指定路径下的没有被track过的文件
git clean -df #删除当前目录下没有被track过的文件和文件夹
git clean -xf #删除当前目录下所有没有track过的文件,不管他是否是.gitignore文件里面指定的文件夹和文件。

放弃本地的所有修改‘

git checkout .  # 注意有一个“.”,会从暂存区里取出所有内容覆盖掉工作区的所有修改,如果连暂存区的内容也不想要
# 则可以git checkout commit-id
git clean -xdf  # 删除当前目录下所有的修改如果我们想要放弃本地某个文件的修改:
git checkout file-name  # 从暂存区里

版本回退情景一:

本地做了修改,可能提交到了本地仓库,但是尚未push到远程仓库

方法:git log查看origin/master指向的commi-id,用reset命令回滚

#三个参数 --soft-缓存区和工作目录不会变
#--mixed-默认选项。缓存区和指定的提交同步,但工作目录不受影响
#--hard-缓存区和工作目录都是同步到指定的提交
git reset --hard HEAD^n#回退到之前n的版本,将head指针回退n,覆盖到工作区内容,即丢弃了前n个commit修改和当前工作区的修改,再push

回退情景二:

已经push的回退,此时有可能别人在此基础上已经做了修改并commit和push了,此时需要回滚的该怎么办?

方法:略


删除文件

#删除不必要的文件
git rm -rf +文件名
git commit -m "..."
git push

永久删除

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sort.hpp’ 
--prune-empty --tag-name-filter cat -- --all 
# sort.hpp也可以替换成文件夹, 此时要在git rm后添加-r参数
git push origin master --force  # 从上图我们也能看出来远程仓库没有被修改

查看文件的修改

git log --oneline filename # 显示文件的所有修改记录
git log –p filename  # 显示所有commit的修改
git show commit-id filename   # 显示某个commit里文件的修改
git diff filename   # 查看本地对某个文件做了那些具体修改
git diff commit-id filename   # 显示与某个commit间所有的差异,commit-id可以替换成HEAD,比如HEAD~2
git diff commit-id1 commit-id2   # 显示两个commit所有的差异

多个客户端之间的同步问题:

#有时候我们期望同事之间去互相pull和push代码,那怎么做呢?
	#加入有同事A和B,同事A机器的IP是192.168.2.128,同事B机器的IP是192.168.2.129,现在同事A和同事B想项目同步。此时我们可以使用ssh协议同步,在同事A的机器上:
    git remote add ubuntu_3 ssh://lizhiyong@192.168.2.129/home/lizhiyong/source/nginx-docs
    #即ubuntu_3是远程机器的名字,可以任意取,但是不能再是origin了,因为origin已经用于中央仓库了,192.168.2.129是同事
#B的机器IP地址,/home/lizhiyong/source/nginx-docs是同事B的repo的绝对路径。
#   这样我们可以使用git pull和git push去推送代码了,比如在同事B机器上commit一些内容,然后在同事A上使用:
    git pull ubuntu_3 master    # 拉取远程ubuntu_3上的master分支代码
    git push ubuntu_3 master    # 把本地的commit推送到远程ubuntu_3上的master,但是不幸的是push的时候出现了下图所示的
                                # error信息,原因是同事B的仓库是不是一个裸仓库,它是有工作区间的,那么我们push的结果
                                # 是不会反应在工作区间的,也即在远程仓库的目录下对应的文件还是之前的内容。
                                # 此时必须在同事B的机器上的.git/config文件里添加:
[receive]
          denyCurrentBranch = ignore
                                # 此时在同事B的机器上还看不到内容,但是可以看到commit记录了,需使用git reset --hard
                                #  才能看到内容

暂存修改

如果在一个分支下进行操作的时候,被迫需要切换分支,但是当前的修改又不值得commit,如果未commit直接切换分支的话

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EuPUy5T3-1647096710233)(C:\Users\HASEE\AppData\Roaming\Typora\typora-user-images\image-20220311234056924.png)]

会失败

git stash#暂存了修改
git checkout #切换分支,再切回的时候
git stash pop #从缓存中取出修改

关于stash的一些命令

 $ git stash   # 将工作区的修改保存到缓存区,默然取名为:
               #           WIP on <branch_name> : <latest_commit_id> <latest_commit_message>
$ git stash save <name>   # 将工作区的修改保存到缓存区,且取名为name
$ git stash pop    # 取出缓存区栈顶(即最近一次)的内容,并且会删除此次pop的内容
$ git stash list   # 查看缓存里所有存储的修改
$ git stash apply stash@{X} #  取出stash里的内容,X为序号,但是不会删除stash@{X}
$ git stash drop stash@{X}  # 删除stash@{X}
$ git stash clear    # 删除缓存区里所有的记录

指定不需要被git管理的文件

.gitignore
........
#待定
#自动生成的网址http://www.gitignore.io/

如何解决项目之间的依赖关系

比如我们在产品开发中,基本都会遇到这样的情况,把产品架构设计划分成了很多个模块,不同团队开发不同模块,比如源码
的src目录有以下模块:
src
|------- buffer
|------- f-threadpool
|------- iniconfig
|------- intf
|------- store
|------- router
甚至是依赖了第三方的项目,那么我们可以使用git的submodule来管理这些依赖,submodule允许父项目可以有很多的独立的
Git子项目,这些子项目可以单独提交/push/pull等管理,而且父项目中的提交不会影响到子项目。这有很多好处:
1) 把子模块单独作为一个git项目,他们可以独立开发,他们的错误并不会影响到父项目
2) 团队分模块工作在不同git项目上,减少了代码提交的依赖,减少了很多更新操作

submodule的使用方式

#添加submodule
git submodule add <url> <path>#url是子模块repo的地址,path是在父项目中的存放路径
git submodule add gitgit@106.52.144.219:lee/ringbuffer.git server/src/ringbuffer

添加完后会在父项目中出现一个.gitmodules文件,文件里记录了相关信息,记录名字,路径和url,然后我们需要把这几个文件添加到git版本管理里:

git add

git commit -a -m “add bloomfilter and ringbuffer submodule”

git push

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值