Git:二

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上创建一个和本地仓库相同的仓库名,具体怎么创建仓库请参考上一篇。

  1. 创建好远程仓库之后, git remote add origin git@github.com:用户名/仓库名.git 将它设置成本地仓库的远程仓库,origin 远程仓库的名称设置为该标志符
  2. 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有基本的了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容