本文是我在学习git过程中的一些学习笔记,方便自己后续查阅,也希望能帮助各位。内容比较入门,如果有错请在评论区或者私信我指出,希望能和大家一起进步!
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。和集中式版本控制系统不同,Git是把代码仓库完整地镜像下来,包括完整的历史记录。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
1、git的三个区
我们的本地仓库由git维护的三个区域组成,分别是工作区、暂存区和版本库。
第一个是工作区(工作目录),他是持有实际文件,就是电脑能看到的目录
第二个是暂存区,它像个缓存区域,临时保存你的改动。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
第三个是版本库,工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库,其中的HEAD指向当前的版本
2、git操作命令
在这开始之前可以先美化一下终端,这样可以更直观看到该目录是否是git目录以及显示所在的分支。这里我就使用了oh-my-zsh,安装连接如下:https://blog.csdn.net/qwe641259875/article/details/107201760。
git init——初始化仓库
Git使用git init命令来初始化一个git仓库,在执行该命令的目录会生成一个.git目录,该目录包含了资源的所有元数据,而本目录下的其他子目录保持不变。
也可以通过下面指令来指定目录作为Git仓库:
git init <dir>
git clone——克隆仓库
git init是初始化本地仓库,也可以通过git clone从现有的Git仓库中拷贝项目。
git clone <url>
我在gitee上自己新建了一个练习仓库,可以通过该指令将这个仓库下载下来。建议提交ssh公钥后来拉取,这样以后就不用每次都输入密码。
# 生成密钥
# -t 加/解密算法
# -C 注释,一般是填写用户名
ssh-keygen -t ed25519 -C "33@33.com"
按三次回车,成功生成公钥和私钥。
#ssh 公钥
cat ~/.ssh/id_ed25519.pub
#ssh 私钥
cat ~/.ssh/id_ed25519
将公钥添加到gitee仓库中(该方式不能push,若要push需要放在个人公钥(详见官网)中)
ssh -T git@gitee.com
证明公钥添加成功。然后就可以通过下面指令来克隆仓库到本地:
git clone git@gitee.com:zhu-haozhe/git_train.git
git add——添加文件到暂存区
添加一个或多个文件到暂存区:
git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录:
git add [dir] ...
添加所有变更文件到暂存区
git add .
git status——查看仓库当前的状态,显示有变更的文件。
git status [OPTIONS]
-s:简短输出结果
示例:
我们在克隆的目录下新建src、include、build目录以及CMakeLists.txt文件。我们可以通过git status来查看仓库当前状态
git只会跟踪文件,如果你只是新建了空目录,是不会被跟踪的。如果要跟踪在你的空目录下加入.gitkeep。
可以看到文件已经被提交到暂存区域了
git commit——将暂存区内容添加到本地仓库中
git commit [file1] [file2] ... -m [message]
-m [message]:添加一些备注信息
-a:不需要执行git add,直接提交
在提交之前我们需要设置自己的用户名和邮箱:
git config --global user.name 'sansan'
git config --global user.email 33@33.com
--global:删除的话只对当前仓库有效
git diff——比较文件的变更差异
显示暂存区和工作区的差异:
git diff [file]
显示暂存区和上一次提交(commit)的差异:
git diff --cached [file]
查看两次提交之间差异:
git diff commit_id1 commit_id2
我修改了CMakeLists.txt的内容以及在src和include加入.cpp和.h文件,运行git diff很奇怪只显示了CMakeLists.txt的修改内容(查阅得知应该是src、build、include新加的文件没有被跟踪)。
所以我提交了一版后,再次修改了func.cpp的一点点内容(相当于修改了跟踪的文件,但还没有git add),就可以看到自己修改的内容了。
git push——命令用于从将本地的分支版本上传到远程并合并
可以先看看远程主机名
git remote -v
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
讲本地分支master推送到远程主机的master分支
git push origin master
git push origin master:master
--force:强制推送(我分别clone了两份仓库代码到本地,分别修改了src/func.cpp不同内容,并且commit后给他们分别push,在push第二个代码时会报错,可以通过该指令强制推送上去,但会覆盖另一个仓库代码的提交,也可以git pull解决(推荐))
--delete [master]:删除远程主机的master分支
git log——查看历史提交记录
# 查看历史提交记录
git log
--oneline:来查看历史记录的简洁版本
--graph:查看历史中什么时候出现了分支、合并
--reverse:逆向显示所有日志
--author:查找指定用户的提交日志
# 以列表形式查看指定的历史修改记录
git blame <file>
HEAD指向当前的commit id
git reset——回退版本
以这一次修改为例,这是我们第四次提交,主要是执行了cmake ..生成了新的文件
git reset [--soft | --mixed | --hard] [HEAD]
--mixed:默认参数,用于重置暂存区的文件与上一次的commit保持一致
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ func.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本
退回到某个版本后,后面的所有版本都会不见。
相当于取消git add添加
--soft 参数用于回退到某个版本:
git reset --soft HEAD
重新commit后:git commit -m "forth commit" -a
相当于取消git commit
--hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
重新commit后:git commit -m "forth commit" -a
相当于重新开始啥也没干
git mv——用于移动或重命名一个文件、目录或软连接
git mv [file] [newfile]
-f:文件已存在,给他重命名
git rm——删除文件
将文件从暂存区和工作区中删除
git rm <file>
-f:强行删除
-cached:把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除
git restore——撤消工作区的修改
撤消工作区的修改返回到最近一次add(缓存区)的版本或者最近一次commit(当前版本库)的版本
(3条消息) Git 中 git restore 的使用_zou-jvm的博客-CSDN博客_git restore
git restore <文件>
如果已经提交到了暂存区,那么需要先
git restore --staged <文件>
然后再git restore <文件>
git fetch——从远程获取代码库
我在gitee上修改了代码并提交上去,本地执行
#fetch的内容保存到了origin/master分支上,可以通过git checkout origin/master进行查看修改
git fetch origin
#合并到当前分支
git merge origin/master
以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。如果不这样操作在git push的时候会报错。
git merge——分支合并,将其他分支中的内容合并到当前分支中
git merge branch_name
如果当前分支为master,那么就会将branch_name合并到当前分支,下面我在sansan分支上的func.cpp内容里增加一行(没有改前面的内容),通过git merge可以顺利合并。
但如果我同时修改了sansan分支的func.cpp前面的内容,以及修改了master分支的func.cpp同样位置的内容
然后再将sansan合并到master,这时候就会报错。因为如果将要合并的两个分支都修改了同一个而文件的同一个部分内容,Git就无法确定应该使用哪个版本的内容。当这种情况发生时,合并过程会停止在合并commit提交之前,以便给用户留下机会手动修复这些冲突。
所以我们需要手动修改文件,这里我将两行都进行保留,然后重新提交就可以完成合并。
git pull——从远程获取代码并合并本地的版本
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写
git pull <远程主机名> <远程分支名>:<本地分支名>
$ git pull
$ git pull origin
# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并
$ git pull origin master:brantest
# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
在实际开发中,公司的代码库会更新代码或者分支,可以通过该指令来更新自己的本地库
git branch——列出/创建分支
# 列出分支
git branch
# 创建分支
git branch sansan
在git init的时候会自动创建master分支。
-d:删除分支
git checkout——切换分支
git checkout sansan
-b:创建新分支并立即切换到该分支下
git remote——对远程库操作
# 显示所有远程仓库
git remote -v
# 显示某个远程仓库信息
git remote show [remote]
# 添加远程版本库,shortname:本地的版本库名
git remote add [shortname] [url]
# 删除远程仓库
#git remote rm name
# 修改仓库名
#git remote rename old_name new_name
文章到这结束了!git内容比较多,挖深需要很多时间。本篇主要是为了方便自己后续查阅,希望也能帮助到各位!如果有哪里说错也希望大家可以指出,我会进行修改!本片文章也会不断进行更新,侵权必删。