Git基础
通过上一篇Git:一文章,我们大体了解了创建仓库,提交代码等相关流程,本篇重点介绍git相关的基础操作。
git init 初始化仓库
创建一个目录,然后在该目录下敲入初始化代码:
mkdir gitDir 创建gitDir目录
cd gitDir 跳转到gitDir目录
git init 初始化仓库
ls -a 查询当前目录所有文件(包括隐藏文件)
生成的.git存储当前目录内容所需的仓库数据
git status 查看仓库状态
输入命令后显示:
我们可以通过vi/touch 1.c在本目录下新建1.c文件,也可以通过界面手动新建该文件,再输入 git status
,则显示:
通过rm -rf 1.c或手动删除后,又恢复之前没有文件提交的状态。
git add 向暂存区添加文件
暂存区是提交之前的一个临时区域。通过 git add 1.c
把1.c添加到暂存区,然后通过 git status
查看:
git commit 保存仓库的历史记录
git commit -m "日志"
可以直接 git commit
,执行后编辑器就会打开:
提交日志的格式如下:
行数 | 内容 |
-----: | :--------
第一行 | 用一行文字简述提交的更改内容 |
|第二行 | 空格 |
| 第三行以后 | 记录更改的原因和详细内容 |
dog | bird | cat |
---|---|---|
foo | foo | foo |
bar | bar | bar |
baz | baz | baz |
如果不填,表示中断提交
git log 查看提交日志
查看以往仓库中提交的日志
可以通过
git log --pretty=short
显示简短日志;可以通过
git log 目录名/文件名
显示对应目录名或文件名相关日志;可以通过
git log -p (文件名)
查看前后提交的差别
git diff 查看更改前后的差别
查看工作树、暂存区、最新提交之间的差别
在1.c文件中添加 #include<stdio.h>
代码保存后,然后输入 git diff
:
将1.c加入暂存区后再执行
git diff
由于工作树和暂存区之间并无差别,所以不会显示什么结果。这时执行 git diff HEAD
可以看到差异,HEAD 是指向当前分支的最后一次提交的指针。
分支操作
master分支是Git默认创建的分支,所有的开发都是以master分支为中心。
分支可以使多人并行开发,最后与master分支合并。
git branch 显示分支
其中 * 表示当前所在分支,现在只有一个master分支
git checkout -b 创建切换分支
我们创建了feature-A分支并且切换到该分支,现在我们有2个分支了。改代码和下列代码起到相同的效果:
git branch feature-A //创建分支feature-A
git checkout feature-A //切换到feature-A分支
下面通过feature-A分支中对1.c进行编辑,如下:
添加了main函数,接下来可通过
git status
git add 1.c
git commit -m "add main method"
等相继操作添加到feature-A中。通过
git checkout master
切换到master中,查看1.c文件是否有改动。我们发现没有改动,可见feature-A分支的变动没有影响主分支。git checkout -
可以回到上一个分支
git merge 合并分支
先切换回master分支,通过 git branch
查看现在在什么分支。
git merge --no-ff feature-A
--no-ff表示在历史记录中明确记录下本次分支合并
如果合并出现冲突等,后续再说怎么解决冲突。
git log --graph 图表形式查看
具体可以在终端输入看看。
更改提交操作
git reset 回溯历史版本
要让暂存区、HEAD、当前工作树回溯到指定状态,用
git reset --hard 指定时间的哈希值
通过
git log
查找日志:其中 commit 之后的一串字符就是哈希值
git reflog 当前仓库执行过的操作日志
git log
只能查看以当前状态为终点的历史日志,而 git reflog
可以查看当前仓库的日志:
只要不进行垃圾回收(Garbage Collection),就可以通过日志调取近期的历史状态。其中前面黄色的字符串也是哈希值,哈希值只要输入4位以上就可以了。我们可以通过哈希值回到任何历史状态。
解决冲突
创建一个分支feature-B,然后修改1.c文件,具体代码为:
git checkout -b feature-B //创建feature-B分支
//修改feature-B中1.c为:
#include<stdio.h>
int main(){
printf("feature-B");
return 0;
}
//修改master中1.c为:
#include<stdio.h>
int main(){
printf("master");
return 0;
}
现在基础操作都完成了,因为master和feature-B都修改了1.c文件,我们合并master和feature-B分支后提示我遇到冲突了:
打开1.c文件可以看到:
HEAD中的是当前的内容,feature-B中的是feature-B的内容,只要删除其中一个就可以。然后加入到暂存区,然后提交,我写的提交日志为"fix conflict",下面会用到。
git commit --amend 修改提交信息
该命令是修改上一次提交的日志:
我已经修改为如图所示。
git rebase -i 压缩历史
在合并分支之前发现已提交的内容有一些错误,不妨提交一个修改,把这个修改包含到前一个提交中,压缩成一个历史记录。
创建一个分支feature-D,并修改1.c文件如图:
然后加入暂存区和提交
git commti -am "日志"
一步完成这2步操作,我提交的日志为"add feature-D"。但是我提交后发现我拼写错误,所以我们需要修改之后重新加入暂存区后再提交:可以看到修改后提交,日志为"fix typo",用
git log
查看为:可以通过
git rebase -i HEAD~2
来压缩历史记录,其中fix typo本不应该出现在历史记录中的,HEAD~2 是最近2次的提交记录,显示如图所示信息:可以通过把pick改为fixup然后保存提交,之后再用
git log
查看历史记录可以发现已经没有"fix typo" 等记录了。
远程仓库的推送和获取
推送至远程仓库
在GitHub上创建一个和本地仓库相同的仓库名,具体怎么创建仓库请参考上一篇。
- 创建好远程仓库之后,
git remote add origin git@github.com:用户名/仓库名.git
将它设置成本地仓库的远程仓库,origin 远程仓库的名称设置为该标志符 -
git push -u origin master
,git push将本地仓库的master的内容推送到远程仓库。-u参数在推送同时将origin仓库的master分支设置为本地仓库当前分支的upstream(上游),以后运行git pull从远程仓库获取内容时,本地仓库的这个分支可以直接从origin的master分支获取内容,省去了另外添加参数。
在GitHub的结果如下:
3.也可以推送其他分支到远程仓库。我们试着推送feature-B到远程仓库
我这边 origin 标示符,我写的default,大家可以自己选择。最后在GitHub上的结果为:
看,我们已经把feature-B分支推送到GitHub上的远程仓库了。
oh, great!
从远程仓库中获取
git clone 获取远程仓库
换一个目录,然后输入 git clone git@github.com:用户名/仓库名.git
就会克隆到本地。然后输入 git branch -a
可以查看分支,-a分支不仅可以查看本地分支也可以查看远程的:
上面我们看到只是把master分支克隆到本地,没有feature-B,现在我们获取feature-B分支:
然后我们可以修改feature-B中1.c文件,然后:
git add 1.c
git commit -m "日志"
git push //推送到远程仓库
成功后可到GitHub中去查:
git pull 获取最新远程仓库的分支
OK,Done!
相关
Pro Git:https://git-scm.com/book/zh/v1
LearnGitBranching:http://pcottle.github.io/learnGitBranching/
总结
至此Git相关操作都差不多介绍完了,希望通过我的介绍能让大家对Git有基本的了解。