每次用都是想不起来指令,今天继续摸个鱼,整理一下Git部分的使用,记录下来。
1 安装
首先,Linux下安装很简单
sudo apt-get install git
Windows安装,直接去官网下载,下载完成后,一路安装到完成就行,安装完成后,会看到Windows软件中多了 Git Bash 等,点开就可以使用Git了。
2 仓库的初始化以及基本配置
可以自己新建一个仓库,用于存储代码,或者进去现有的代码文件夹,然后
git init
对代码仓库进行初始化。
或者从Github上直接clone下来一份代码也可以,
git clone https://github.com/xxxxxxx/xxxxxxxxx.git
然后,进行相关配置
设置用户名
git config --global user.name 'your-name'
设置邮箱
git config --global user.email '575066873@qq.com'
查看相关设置
git config --list
3 添加文件到版本库
在版本库的路径下,编辑好对应的文件,比如 文件 a.txt,文件夹 test,
首先,需要把文件添加到缓存区
git add a.txt test/
然后,在 a.txt 文件中进行了修改,如果修改是必要的,需要再 add 一下
git add a.txt
最后,提交到版本库,
git commit -a -m " add a.txt test ,git learning "
至于 git commit 后面的参数 -a -m 这里简单的说一下
用法:git commit [<选项>] [--] <路径规格>...
-q, --quiet 提交成功后不显示概述信息
-v, --verbose 在提交说明模板里显示差异
提交说明选项
-F, --file <文件> 从文件中读取提交说明
--author <作者> 提交时覆盖作者
--date <日期> 提交时覆盖日期
-m, --message <说明> 提交说明
-c, --reedit-message <提交>
重用并编辑指定提交的提交说明
-C, --reuse-message <提交>
重用指定提交的提交说明
--fixup <提交> 使用 autosquash 格式的提交说明用以修正指定的提交
--squash <提交> 使用 autosquash 格式的提交说明用以压缩至指定的提交
--reset-author 现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)
-s, --signoff 添加 Signed-off-by: 签名
-t, --template <文件> 使用指定的模板文件
-e, --edit 强制编辑提交
--cleanup <default> 设置如何删除提交说明里的空格和#注释
--status 在提交说明模板里包含状态信息
-S, --gpg-sign[=<key-id>]
GPG 提交签名
提交内容选项
-a, --all 提交所有改动的文件
-i, --include 添加指定的文件到索引区等待提交
--interactive 交互式添加文件
-p, --patch 交互式添加变更
-o, --only 只提交指定的文件
-n, --no-verify 绕过 pre-commit 和 commit-msg 钩子
--dry-run 显示将要提交的内容
--short 以简洁的格式显示状态
--branch 显示分支信息
--ahead-behind 计算完整的领先/落后值
--porcelain 机器可读的输出
--long 以长格式显示状态(默认)
-z, --null 条目以 NUL 字符结尾
--amend 修改先前的提交
--no-post-rewrite 绕过 post-rewrite 钩子
-u, --untracked-files[=<模式>]
显示未跟踪的文件,“模式”的可选参数:all、normal、no。(默认:all)
常用的有
git status // 查看仓库状态,可以显示处有哪些文件被修改过
git diff // 查看仓库中的代码中修改了的地方
4 版本回退
个人觉得这个功能,是Git中的最神奇的功能。
在工作中,不可能记住每次代码都改了哪些内容,每个版本之间有啥区别,但是Git中就可以有这个功能,只需要输入一下指令:
git log
然后,就会弹出来每个版本的log记录比如说我的一个 Eigen 测试小程序,
这里解释一下,第一行 commit 是 commit ID 就是每次 git commit 时自动生成的版本号,下面就是 管理员,以及 commit 的时间信息了 , 最下方的是 每次 git commit 时 -m 后面的信息,所以每次 commit 时,这个信息一定要认真写,不然时间久了,天晓得当时自己干了啥。其中,有 HEAD 那一行表示当前的版本,如果想回到上一个版本,
git reset --hard HEAD^
此时,打开相关代码,发现已经回到了上一个版本,git reset 回退到某个版本,–hard 不管他,估计就是强制的意思, HEAD^ 表示上一个版本,上两个版本就是 HEAD^^ , 现在在 git log 一下,就会发现原先最近的版本没了
好,现在又后悔了,想回到 " add the installation of Eigen " 版本,咋办?
下面有两个方式,
- 向上翻原来的 bash 窗口,找到 " add the installation of Eigen " 的 commit ID ,然后
git reset --hard cf6487ced277440bf1115bcc363cf3279a67be54
这里就是见证奇迹的时刻了,发现版本又回到最新 " add the installation of Eigen " 的那一版了。
当然这么做是有一个前提的,如果 原来那个有 commit ID 的窗口被关掉了,那这个方式就走不通了。
- 现在来说一下第二个方式,此时 bash 窗口被关了,找不到 commit ID 了,然后按照以下操作,
git reflog
然后输出下图
现在可以看到 " add the installation of Eigen " 的 commit ID 为 cf6487c,然后
git reset --hard cf6487c
好,需要的版本又回来了,Git中的后悔药一直都在,这一点最好用的功能了。
5 管理文件的修改
-
首先文件在未 add 到缓存区之前,只需要
注意 -- 后一定要有空格,不然就是切换分支的指令了 ```这样就丢弃了工作区的修改。
-
如果 add 到缓存区了,那就只有
先把缓存区的 unstage git checkout -- <file name> // 然后在恢复修改 ```
-
最后,如果已经 commit 到版本库了,那就只有先版本回退了
6 删除管理
正常情况下,人工删除了一个文件
rm b.txt
然后,用 git status 查看一下,会有删除提示,后来又发现删除错了,继续吃药
git checkout -- b.txt
吃完药,好了,该回来的都回来了。
另一种情况,这个文件真的要删除的,
git rm b.txt
git commit -a -m " delete b.txt "
这样就真的在版本库中删除了这个文件。还要找回的话,就只能版本回退了。
这里需要注意的是,从来未被加到版本库的文件是无法恢复的,版本回退都不行。
7 远程仓库 GitHub
首先要有一个 GitHub 账号,然后本地安装好 ssh ,生成 ssh 公匙,
ssh-keygen -t rsa -C "youremail@example.com"
进到 .ssh 文件夹下,里面会有两个文件 id_rsa 和 id_rsa.pub ,拷贝公匙 id_rsa.pub 中的内容。
然后登录好 GitHub,打开 Settings - SSH and GPG Keys
进入后会看到
点击 New SSH Keys,把公匙里面的文本拷贝进去就行了,如果有多台电脑,那么就可以添加多个公匙即可。
现在的情况是有一个本地的版本库,另外需要在GitHub中新建一个版本库,使两者同步,下面先要在 GitHub 上新建一个仓库,做为远程仓库
点击 New repository ,新建一个仓库,
里面填写上你的仓库名称,以及描述(可选项),这样就可以看到 GitHub 中多了一个仓库。现在把本地的仓库,同步到远程新建的仓库中,现在可以直接手动上传了,也可以clone下来,对其中的代码进行相关编辑后,
git add 编辑过的代码,然后git commit -m “xxxxxxxxxxxxxx”,然后
git push
使本地代码与远程仓库代码同步。
8 分支管理
项目开发过程中,master一般都是很重要的代码,不可能所有的开发都是在master分支上进行开发的,都是在其他分支上开发完毕后,一般是dev分支,下面举例子说明一下,
首先,新建 dev 分支
git checkout -b dev
或者,通过以下两条指令
git branch dev
git checkout dev
此时,查看分支状态
git branch
现在切换到 dev 分支下了,对需要开发的代码进行相关操作,然后记得 git add 和 commit 之后,切换回 master 分支,
git checkout master
合并分支
git merge dev
合并完成后,就可以看到master上有在dev分支上做好的相关改动了,
删除 dev 分支
git branch -d dev
此时再看,就只有master分支了。
最后,附上廖雪峰老师的网站,多多向大神学习!!!