Git:二

Git:二_第1张图片

Git基础

通过上一篇Git:一文章,我们大体了解了创建仓库,提交代码等相关流程,本篇重点介绍git相关的基础操作。

git init 初始化仓库

创建一个目录,然后在该目录下敲入初始化代码:

mkdir gitDir    创建gitDir目录
cd gitDir       跳转到gitDir目录
git init        初始化仓库
ls -a           查询当前目录所有文件(包括隐藏文件)

生成的.git存储当前目录内容所需的仓库数据

git status 查看仓库状态

输入命令后显示:


Git:二_第2张图片

我们可以通过vi/touch 1.c在本目录下新建1.c文件,也可以通过界面手动新建该文件,再输入 git status,则显示:

Git:二_第3张图片

通过rm -rf 1.c或手动删除后,又恢复之前没有文件提交的状态。

git add 向暂存区添加文件

暂存区是提交之前的一个临时区域。通过 git add 1.c 把1.c添加到暂存区,然后通过 git status 查看:

Git:二_第4张图片

git commit 保存仓库的历史记录

git commit -m "日志"
可以直接 git commit ,执行后编辑器就会打开:

Git:二_第5张图片

提交日志的格式如下:

   行数 |      内容    |
  -----: | :-------- 
  第一行  | 用一行文字简述提交的更改内容 |
  |第二行  |        空格            |  
 | 第三行以后 | 记录更改的原因和详细内容 |
dog bird cat
foo foo foo
bar bar bar
baz baz baz

如果不填,表示中断提交

git log 查看提交日志

查看以往仓库中提交的日志

Git:二_第6张图片

可以通过 git log --pretty=short 显示简短日志;
可以通过 git log 目录名/文件名 显示对应目录名或文件名相关日志;
可以通过 git log -p (文件名) 查看前后提交的差别

git diff 查看更改前后的差别

查看工作树、暂存区、最新提交之间的差别
在1.c文件中添加 #include 代码保存后,然后输入 git diff:

Git:二_第7张图片

将1.c加入暂存区后再执行 git diff 由于工作树和暂存区之间并无差别,所以不会显示什么结果。这时执行 git diff HEAD 可以看到差异, HEAD 是指向当前分支的最后一次提交的指针。

分支操作

master分支是Git默认创建的分支,所有的开发都是以master分支为中心。
分支可以使多人并行开发,最后与master分支合并。

git branch 显示分支


其中 * 表示当前所在分支,现在只有一个master分支

git checkout -b 创建切换分支

Git:二_第8张图片

我们创建了feature-A分支并且切换到该分支,现在我们有2个分支了。改代码和下列代码起到相同的效果:

git branch feature-A        //创建分支feature-A
git checkout feature-A       //切换到feature-A分支

下面通过feature-A分支中对1.c进行编辑,如下:

Git:二_第9张图片

添加了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 可以查看当前仓库的日志:

Git:二_第10张图片

只要不进行垃圾回收(Garbage Collection),就可以通过日志调取近期的历史状态。其中前面黄色的字符串也是哈希值,哈希值只要输入4位以上就可以了。我们可以通过哈希值回到任何历史状态。

解决冲突

创建一个分支feature-B,然后修改1.c文件,具体代码为:

    git checkout -b feature-B  //创建feature-B分支
    
    //修改feature-B中1.c为:
    #include
    int main(){
        printf("feature-B");
        return 0;
    }
    
    //修改master中1.c为:
    #include
    int main(){
        printf("master");
        return 0;
    }

现在基础操作都完成了,因为master和feature-B都修改了1.c文件,我们合并master和feature-B分支后提示我遇到冲突了:



打开1.c文件可以看到:


Git:二_第11张图片

HEAD中的是当前的内容,feature-B中的是feature-B的内容,只要删除其中一个就可以。然后加入到暂存区,然后提交,我写的提交日志为"fix conflict",下面会用到。

git commit --amend 修改提交信息

该命令是修改上一次提交的日志:


Git:二_第12张图片

我已经修改为如图所示。

git rebase -i 压缩历史

在合并分支之前发现已提交的内容有一些错误,不妨提交一个修改,把这个修改包含到前一个提交中,压缩成一个历史记录。
创建一个分支feature-D,并修改1.c文件如图:

Git:二_第13张图片

然后加入暂存区和提交 git commti -am "日志" 一步完成这2步操作,我提交的日志为"add feature-D"。但是我提交后发现我拼写错误,所以我们需要修改之后重新加入暂存区后再提交:
Git:二_第14张图片

可以看到修改后提交,日志为"fix typo",用 git log 查看为:
Git:二_第15张图片

可以通过 git rebase -i HEAD~2 来压缩历史记录,其中fix typo本不应该出现在历史记录中的, HEAD~2 是最近2次的提交记录,显示如图所示信息:
Git:二_第16张图片

可以通过把pick改为fixup然后保存提交,之后再用 git log 查看历史记录可以发现已经没有"fix typo" 等记录了。

远程仓库的推送和获取

推送至远程仓库

在GitHub上创建一个和本地仓库相同的仓库名,具体怎么创建仓库请参考上一篇。

  1. 创建好远程仓库之后, git remote add origin [email protected]:用户名/仓库名.git 将它设置成本地仓库的远程仓库,origin 远程仓库的名称设置为该标志符
  2. git push -u origin master ,git push将本地仓库的master的内容推送到远程仓库。-u参数在推送同时将origin仓库的master分支设置为本地仓库当前分支的upstream(上游),以后运行git pull从远程仓库获取内容时,本地仓库的这个分支可以直接从origin的master分支获取内容,省去了另外添加参数。
    在GitHub的结果如下:
    Git:二_第17张图片

    3.也可以推送其他分支到远程仓库。我们试着推送feature-B到远程仓库
    Git:二_第18张图片

我这边 origin 标示符,我写的default,大家可以自己选择。最后在GitHub上的结果为:

Git:二_第19张图片

看,我们已经把feature-B分支推送到GitHub上的远程仓库了。
oh, great!

从远程仓库中获取

git clone 获取远程仓库

换一个目录,然后输入 git clone [email protected]:用户名/仓库名.git 就会克隆到本地。然后输入 git branch -a 可以查看分支,-a分支不仅可以查看本地分支也可以查看远程的:

Git:二_第20张图片

上面我们看到只是把master分支克隆到本地,没有feature-B,现在我们获取feature-B分支:

然后我们可以修改feature-B中1.c文件,然后:

    git add 1.c
    git commit -m "日志"
    git push              //推送到远程仓库

成功后可到GitHub中去查:


Git:二_第21张图片

git pull 获取最新远程仓库的分支

OK,Done!

相关

Pro Git:https://git-scm.com/book/zh/v1
LearnGitBranching:http://pcottle.github.io/learnGitBranching/

总结

至此Git相关操作都差不多介绍完了,希望通过我的介绍能让大家对Git有基本的了解。

你可能感兴趣的:(Git:二)